1

我设置 make 使用递归 make 构建我的树。所以设置是

A/Makefile  a.c
A/B/Makefile a.c
A/B/C/Makefile a.c 

如果我make all从 A/ 层发出命令,那么 make 将沿着树向下构建所有内容,然后再返回。每个 Makefile 都包含一个要构建的文件夹列表。根目录中有一个 common.inc 文件,每个 Makefile 都会读取该文件。

这只是递归 make 的标准布局,并没有什么新东西。很多地方都给出了细节。 这里这里是例子。

我的问题是:很多时候我想做make all但只在当前文件夹中构建东西,而不是真正沿着树向下移动,可能是因为我此时想测试当前文件夹中的一些更改。所以我最终编辑了当前文件夹的 Makefile,方法是注释掉SUBDIRS=A B C下面列出的所有文件夹,或者只为这个文件夹添加新的特殊目标。两者都是令人讨厌的事情,必须继续做。

有没有人有一个递归makefile的想法或一个小例子,它使用一个开关来告诉它在调用时是否应该沿着树向下移动?可能有一种方法可以调用 make 并在命令行传递一些标志,并且该标志用于删除SUBDIRS=A B C .....列表,因此它仅在当前文件夹级别停止?

只是要清楚。我在 Rules.mk 中使用标准 SUBDIRS,树中的每个 Makefile 都包含它。这是部分。我很久以前从网上复制的

$(SUBDIRS)::
    @if test -d $@; then                \
        set $(EXIT_ON_ERROR);           \
        echo "cd $@; make $@";          \
        cd $@; make $@;             \
        set +e;                 \
    else                        \
        echo "Skipping non-directory $@...";    \
    fi                      \
    $(CLICK_STOPWATCH);
endif 

在我写的每个文件夹 Makefile

SUBDIRS = A B C        
include Rules.mk

all:: .......

然后我只是写 make all来建造。如果有一种方法可以make all LOOP=0在 LOOP 是某个值的情况下传递它或一个选项或一个字符串或其他东西,然后更改上述SUBDIRS逻辑以检查此值LOOP并根据该值执行递归生成与否,然后问题已经解决了。LOOP=1如果命令行中缺少它,则默认可以是 to 。

但我不知道足够的 Make 来编写这种类型的逻辑。

4

1 回答 1

2

你应该使用规则依赖的力量。将您的源文件添加到从“根 Makefile”调用的规则的依赖项中。如果这些文件是最新的,则文件夹中的递归将停止,因为规则是“最新的”,并且不会执行任何操作。不要为子目录 Makefile 中的所有规则添加 .PHONY,否则将调用递归规则。

使用规则的依赖关系可能是不进行递归调用的关键,但是如果您修改每个文件夹中的源并且只想从根 Makfile 构建,则必须创建另一个规则。使用make all,make 二进制文件可能不知道您是否要构建所有项目(如果您的所有源代码都已修改)。

编辑:通过命令行选择

您已接近答案,您可以在调用时设置 env varmake all并测试该值以决定是否递归调用。

    CC=g++
    SUBDIR=a b

    all: ${SUBDIR} main.cc
          ${CC} main.cc

    ${SUBDIR}:
    ifneq ($(MK_LOOP), 0)
        @echo "trust the recursivity !"
        ${MAKE} -C $@
    endif

    .PHONY: ${SUBDIR}

如果您不设置MK_LOOPvar 或设置为 0 以外的值,则它将不等于 0,因此将调用递归 Makefile;如果设置为 0,$(SUBDIR)则规则不执行任何操作

    42SH $ MK_LOOP=0 make      # no recur
    42SH $ make all
    trust the recursivity !
    42SH $ make all MK_LOOP=1                # recur by default; same as : make all
    trust the recursivity !
    42SH $
于 2013-06-04T07:55:09.527 回答