如何从makefile更改目录并执行子目录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,只是在运行命令之前它会临时更改为

假设A有两个子目录B和C,其中每个子目录都有自己的make文件。父A有自己的make文件。要调用子目录,我必须在父makefile中使用以下命令:

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

请注意,find是不可并行的。请解释find、-maxdepth、-type的含义。每个子目录都有自己的makefile吗?这是目前为止最好的答案。它似乎可以用目录名动态创建目标,这样您就可以独立地调用它们,而且非常简单。不错。
DIR:= $(wildcard */.)

    dir:
     for dir in $(DIR); do \
          $(MAKE) -C $$dir; \
     done