如何从makefile更改目录并执行子目录makefile?
假设A有两个子目录B和C,其中每个子目录都有自己的make文件。父A有自己的make文件。要调用子目录,我必须在父makefile中使用以下命令:如何从makefile更改目录并执行子目录makefile?,makefile,Makefile,假设A有两个子目录B和C,其中每个子目录都有自己的make文件。父A有自己的make文件。要调用子目录,我必须在父makefile中使用以下命令: subB: cd B && make subC: cd c && make 是否有一种通用的方法可以用一条语句调用子目录makefile。因为将来可能会添加50到60个文件夹。编写它的通用方法是什么?我将使用make-C和find的组合 make-C像往常一样运行make,只是在运行命令之前它会临时更改为
subB:
cd B && make
subC:
cd c && make
是否有一种通用的方法可以用一条语句调用子目录makefile。因为将来可能会添加50到60个文件夹。编写它的通用方法是什么?我将使用
make-C
和find
的组合
make-C
像往常一样运行make,只是在运行命令之前它会临时更改为
find
是一个遍历目录树的命令。默认情况下,它打印当前工作目录中包含的所有文件、目录、符号链接等的路径。您还可以使用-exec
选项告诉find
在每个路径上运行特定命令,而不是打印它们。在传递给-exec
的命令中,{}
表示当前文件/目录的路径,
是标记命令结尾所必需的(这些是shell语法中的特殊字符,因此需要引用它们)
例如,如果希望在当前工作目录的所有目录中运行Makefile,则可以执行以下操作:
sub:
find -maxdepth 1 -type d -exec make -C '{}' ';'
-type d
告诉find
仅在目录上运行-maxdepth 1
表示只检查当前目录正下方的目录;其中的子目录将不会列出。列出目录,不包括当前目录(
):
DIRS:=$(shell find.-maxdepth 1!-路径.-type d)
告诉make目录不是目标,并且您确实希望触发关联的配方:
.PHONY:all$(DIRS)
强制性非模式规则:
all:$(目录)
每个目录的实际配方(对于线程而言,+
非常重要):
$(目录):
+$(MAKE)-C$@
结果:
DIRS:=$(shell find-maxdepth 1!-路径。-类型d)
.冒牌货:全部美元(DIRS)
全部:$(目录)
美元(DIRS):
+$(MAKE)-C$@
注释:
- 这个答案是多线程友好的(即
)make-j$(nproc)
- 您可以使用如下显式目标调用make:
make dir1 dir3
DIR:= $(wildcard */.)
dir:
for dir in $(DIR); do \
$(MAKE) -C $$dir; \
done