【问题标题】:how to change directories from makefile and execute subdirectories make file?如何从makefile更改目录并执行子目录make file?
【发布时间】:2015-07-14 06:25:39
【问题描述】:

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

subB:
   cd B && make
subC:
   cd c && make

有没有一个通用的方式调用子目录makefile 一个语句。因为将来可能会添加更多的50到60个文件夹。通用的写法是什么

【问题讨论】:

  • 每个子目录都有自己的makefile吗?

标签: makefile


【解决方案1】:

我会使用make -C 和find 的组合。

make -C <directory> 像往常一样运行 make,只是它在运行命令之前临时更改为 <directory>。

find 是一个遍历目录树的命令。默认情况下,它会打印当前工作目录中包含的所有文件、目录、符号链接等的路径。您还可以使用-exec 选项告诉find 在每个路径上运行特定命令而不是打印它们。在传递给-exec 的命令中,{} 代表当前文件/目录的路径,; 是需要标记命令结束的(这些是 shell 语法中的特殊字符,因此需要将它们引用)。

例如,如果您想在当前工作目录的所有目录中运行 Makefile,那么您可以这样做:

sub:
    find -maxdepth 1 -type d -exec make -C '{}' ';'

-type d 告诉find 只在目录上运行。 -maxdepth 1 表示只检查当前目录下的目录;其中的子目录不会。

【讨论】:

  • 请注意 find 不可并行化。
  • 请解释find,-maxdepth,-type的含义
【解决方案2】:

列出目录,不包括当前目录 (.):

DIRS := $(shell find . -maxdepth 1 ! -path . -type d)

告诉 make 目录不是目标并且你确实想触发相关的配方:

.PHONY: all $(DIRS)

强制非模式规则:

all: $(DIRS)

每个目录的实际配方(+ 对线程很重要):

$(DIRS):
    +$(MAKE) -C $@

结果:

DIRS := $(shell find -maxdepth 1 ! -path . -type d)

.PHONY: all $(DIRS)

all: $(DIRS)

$(DIRS):
    +$(MAKE) -C $@

注意事项:

  • 这个答案是多线程友好的(即make -j $(nproc))
  • 您可以像这样使用明确的目标调用 make:make dir1 dir3

【讨论】:

  • 这是迄今为止最好的答案。它似乎使用目录名称动态创建目标,以便您可以独立调用它们,而且非常简单。不错。
【解决方案3】:
DIR:= $(wildcard */.)

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

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多