6

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

SUBDIRS = \
test1 \
test2 

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

2 回答 2

10

我属于(明显的)少数人,不同意“递归使认为有害”。我已经为大型、混乱的代码库编写了递归 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 :;
于 2010-03-17T16:00:02.433 回答
1

我会敦促您放弃递归 make 方法。随着 Makefile 的增长,它可能会在以后造成无穷无尽的困难。请参阅论文Recursive Make Considered Harmful以很好地解释为什么递归地调用 make 是一个坏主意。

切换到非递归 make 的一个直接好处是,您现在遇到的这个问题将简单地消失。使用非递归 Makefile 不会有这个问题。

另外,请随意查看我创建的这个样板非递归 Makefile 。它需要 GNU Make 3.81,但非常易于使用。至少,如果您想创建自己的,它可以作为非递归 Makefile 的一个很好的例子。

于 2010-03-17T15:17:19.953 回答