在子目录中失败使得不停止构建

时间:2010-03-17 15:07:28

标签: makefile gnu-make multiple-makefiles

我有一个设置,其中make通过一堆子目录并在这些目录中进行。我希望它立即停止构建失败。下面的代码片段说明了这一点。有人能指出我应该如何设置makefile的正确方向,或者有关从顶层到子目录构建的文档?

SUBDIRS = \
test1 \
test2 

all clean check :
    @for dir in $(SUBDIRS); do \
        if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
    done

2 个答案:

答案 0 :(得分:9)

我在(明显的)少数群体中不同意“Recursive Make Considered Harmful”。我已经为大型,混乱的代码库编写了递归Make系统,并且它们工作得非常好。

以下是如何操作:

all: $(SUBDIRS)

$(SUBDIRS): force
    @ $(MAKE) -s -C $@

.PHONY: force
force :;

(我添加了-s以使事情变得更安静。)

修改的: 将目标传递给子制作(我之前应该这样做):

.PHONY: all check clean
all check clean: $(SUBDIRS)

all: TARGET=all
check: TARGET=check
clean: TARGET=clean
# No, you can't do TARGET=$@, or at least I don't know how to.

# recursive call to make
$(SUBDIRS): force
    @ $(MAKE) -s -C $@ $(TARGET)

.PHONY: force
    force :;

答案 1 :(得分:2)

我会敦促你放弃递归制作方法。随着Makefile的增长,它可能会导致无穷无尽的困难。请参阅文章Recursive Make Considered Harmful,以便非常好地解释为什么以递归方式调用make是一个坏主意。

从切换到非递归制作中你会立即获得的好处是,你现在遇到的这个问题只会蒸发。使用非递归Makefile时不会出现此问题。

另外,请随时查看我创建的boilerplate non-recursive Makefile。它需要GNU Make 3.81,但非常容易使用。至少,它可以作为非递归Makefile的一个很好的例子,如果你想创建自己的。