如何处理GNU中的子make使错误?

时间:2013-05-11 00:19:14

标签: makefile gnu-make

我在Makefile(GNU)中使用sub-make。但是,只要sub-make失败,主make就会继续成功运行。每当我的子make失败时,我希望我的主Makefile失败。我怎么做?

all:   
    pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd

每当STA_DIR中的make失败时,主make就不会停止。我想主要制作停止。

1 个答案:

答案 0 :(得分:6)

由于您没有提供任何有关规则的详细信息,我们无法回答这个问题。当make执行一个程序时,无论它是编译器,链接器,文档格式化程序还是另一个make实例,它的工作方式都是一样的:如果退出代码是0,那就是“成功”在UNIX中,然后继续下一个规则。如果退出代码为非0,在UNIX中为“失败”,则进行停止(除非您使用-k选项)。

只有当它尝试构建的所有目标都成功时,make程序本身才会以0退出。

因此,正确写入后,当子制作失败时,make会停止。如果没有,则调用sub-make的规则将丢失退出代码,这就是父make不会失败的原因。如果你提供了规则,我们可以告诉你如何修复它。

基于我的经验,我建议你可以有这样的规则来运行子制作:

SUBDIRS = foo bar biz

all:
        for d in $(SUBDIRS); do $(MAKE) -C $$d; done

.PHONY: all

这里您没有检查每个子品牌的退出代码,所以它不会停止。只有最后一个命令的最终退出代码才会从shell发回。您应该重写您的makefile(如果这是它的样子),如下所示:

SUBDIRS = foo bar biz

all: $(SUBDIRS)

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

.PHONY: all $(SUBDIRS)

修改

根据您的makefile并阅读上述内容,您可以看到错误:脚本中的最后一个命令是popd,它不会失败,因此命令的退出代码是成功的。请注意,此处不需要使用pushdpopd(至少在UNIX系统上不使用),因为每个命令都在单独的shell中运行,因此当shell退出时会重置工作目录

你想要这样的东西:

all:
        cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"

&&运算符是成功的短路测试;如果其中任何一个命令失败,则整个命令将立即失败。

还记得在调用递归make时始终使用$(MAKE)${MAKE}(它们是相同的),不要使用静态make