关于linux:Makefile循环文件夹并动态获取名称

Makefile loop on folders and get the names dynmaically

我有projects,其中包括根项目下的makefile

喜欢

1
2
3
4
5
6
project
 -Folder1
 -Folder2
 -app1
 -service1
 -Makefile

现在我想进入makefile循环中的文件夹(在根目录下)。即在project下打印文件夹名称,文件夹可以从projectX更改为projectN这一棘手的部分,是否可能?


像这样?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ tree -F    
.
|-- Folder1/
|-- Folder2/
|-- Makefile
|-- app1
`-- service1

2 directories, 3 files

$ cat Makefile
DIRS     := $(notdir $(shell find . -mindepth 1 -maxdepth 1 -type d))
DIRNAMES := $(addprefix print-folder-name-,$(DIRS))

.PHONY: $(DIRNAMES) print-folder-names

print-folder-names: $(DIRNAMES)

$(DIRNAMES): print-folder-name-%:
    @printf '%s
' '$*'

$ make print-folder-names
Folder2
Folder1

一切都很简单,很容易理解。唯一微妙的可能是静态模式规则$(DIRNAMES): print-folder-name-%:。它相当于每个文件夹一个规则:

1
2
3
4
5
6
7
print-folder-name-Folder1:
    @printf '%s
' 'Folder1'

print-folder-name-Folder2:
    @printf '%s
' 'Folder2'

当然,按照同样的规则,你可以为每个文件夹做任何你喜欢做的事情(除了打印它的名字);只需调整配方即可。$*自动变量扩展为模式的词干(本例中为文件夹名)。

编辑:如果还想打印某些文件夹的特殊内容,还可以使用特定于目标的make变量:

1
2
3
4
5
6
7
8
9
10
11
$ cat Makefile
...
print-folder-name-Folder2: SOMEMORETEXT := ' foo'

$(DIRNAMES): print-folder-name-%:
    @printf '%s%s
' '$*' $(SOMEMORETEXT)

$ make print-folder-names
Folder2 foo
Folder1