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这一棘手的部分,是否可能?
- 这就是你要找的吗?只列出在bash中使用ls的目录
- @arjoonn-我可以用它在目录上循环并提供每个名称吗?我需要EDOCX1[0]
- 当然。ls -d */应该列出目录,您可以使用类似for dir in */; do echo $dir; done的东西循环它。
- @Arjoonn:注意,如果没有要列出的目录,ls -d */将以非零状态退出。也许不是一个制作配方所期望的。此外,使用shell的循环结构在配方中循环并不是真正的方法。
像这样?
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 |
- 谢谢你1+,可以通过循环完成吗?我需要在make文件中的文件夹列表上运行,对于每个文件夹,我需要执行一些命令…
- 自然循环。在这个例子中,我展示了它在每个文件夹上循环并打印它的名称。静态模式规则与每个文件夹都有一个单独的规则相同,具有相同的配方。也许看看这个其他的答案来解释。
- 不确定我明白了…:(你的例子很有效,除了我需要一个循环来打印每个文件夹名…
- 有什么东西,@printf '%s
' '$*'这个会在循环中……,有可能吗?
- @printf '%s
' '$*'已经在一个循环中:make将创建一个循环来构建$(DIRNAMES)变量中列出的所有目标。
- 是的,我明白了:),有没有一种方法可以将它转换为每个循环?
- 或者只是为了循环…
- 抱歉,我不明白您为什么要添加另一个循环以及它可以用来做什么。这是关于shell编程的课程中的作业吗?
- 哦,不,不是我只想在里面使用if else,例如,如果foldername==Folder2打印foo或者bar的话,我认为这样会更复杂一些。
- 我真的不明白。是否要打印文件夹名称,foo、bar或其他内容?
- 抱歉,我想打印文件夹的名称,但是如果我有文件夹,例如"folder2",打印名称,然后只为它添加foo,我只想了解当我需要变量的值时,如何在更复杂的秒内完成它…
- 编辑了我的答案,向您展示如何使用生成特定于目标的变量。
- 对不起,我需要离开一会儿,现在我检查一下。
- 顺便说一句,当我使用代码时,它甚至会打印隐藏的文件夹,如.idea或.git等,是否可以简单地避免?
- @Shopiat:当然,只需调整find选项,跳过.*名称(我确信,其他问题已经有了答案)。
- 非常感谢,我已经回答了这个问题:)如果你能就第一个-mindepth 1 -maxdepth 1和第二个addprefix进行讨论,那就太好了。它们的目的是什么?
- 我想我理解,不会深入到递归中的其他文件夹。