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

use*_*997 2 makefile gnu-make

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

all:   
    pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*ist 7

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

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

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

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

SUBDIRS = foo bar biz

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

.PHONY: all
Run Code Online (Sandbox Code Playgroud)

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

SUBDIRS = foo bar biz

all: $(SUBDIRS)

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

.PHONY: all $(SUBDIRS)
Run Code Online (Sandbox Code Playgroud)

编辑

基于你的makefile并阅读上面的内容,你可以看到错误:脚本中的最后一个命令是popd没有失败的,因此命令的退出代码是成功的.请注意,您不需要使用pushdpopd(至少不是在UNIX系统上)在这里,因为每个命令运行独立的外壳内,所以工作目录下重置shell退出.

你想要这样的东西:

all:
        cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"
Run Code Online (Sandbox Code Playgroud)

&&操作是成功的短路试验; 如果其中任何一个命令失败,那么整个命令将立即失败.

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

  • 请参阅 https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html 实际上还有其他更好的原因。如果您想知道,请就此提出一个新问题:对无关主题的答案发表评论是不合适的。 (2认同)