子目录中的递归make

时间:2012-02-12 14:59:39

标签: recursion directory makefile subdirectory

如何在Makefile中命令make命令在所有子目录make命令(在子目录的Makefile中定义)中递归执行?

4 个答案:

答案 0 :(得分:18)

  1. 阅读GNU Make手册的 Recursive Use of Make 章节。
  2. 了解Peter Miller的 Recursive Make Considered Harmful 文章。
  3. ...
  4. PROFIT !!!

  5. P.S。从my answer到另一个相关问题的代码段可用作粗略近似值。

答案 1 :(得分:7)

@ eldar-abusalimov,您发布的第一个链接假定makefile 知道子文件夹是什么。这并不总是正确的,我想这就是@tyranitar想知道的。在这种情况下,这样的解决方案可以完成这项工作: (花了我一些时间,但我也需要它)

SHELL=/bin/bash

all:
    @for a in $$(ls); do \
        if [ -d $$a ]; then \
            echo "processing folder $$a"; \
            $(MAKE) -C $$a; \
        fi; \
    done;
    @echo "Done!"

答案 2 :(得分:3)

我将在这里提交我的特定解决方案。 假设我们有一个包含许多子目录的目录,所有子目录都有自己的makefile:

root-dir\
    +----subdir1
    +----subdir2
    ...
    +----subdirn

然后,只需复制root-dir这个Makefile:

SUBDIRS = $(shell ls -d */)
all:
    for dir in $(SUBDIRS) ; do \
        make -C  $$dir ; \
    done

答案 3 :(得分:1)

当所有子目录都具有Makefiles时,上述答案将非常有效。仅在包含Makefile的目录上运行make并不困难,也不难限制要递归的级别数。在我的示例代码中,我将搜索makefile文件限制在父目录下的子目录中。 filter-out语句(第2行)阻止此Makefile包含在递归make中。

MAKEFILES = $(shell find . -maxdepth 2 -type f -name Makefile)
SUBDIRS   = $(filter-out ./,$(dir $(MAKEFILES)))

all:
    for dir in $(SUBDIRS); do \
        make -C $$dir all; \
    done