我在Makefile(GNU)中使用sub-make。但是,只要sub-make失败,主make就会继续成功运行。每当我的子make失败时,我希望我的主Makefile失败。我怎么做?
all:
pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd
每当STA_DIR中的make失败时,主make就不会停止。我想主要制作停止。
答案 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
,它不会失败,因此命令的退出代码是成功的。请注意,此处不需要使用pushd
和popd
(至少在UNIX系统上不使用),因为每个命令都在单独的shell中运行,因此当shell退出时会重置工作目录
你想要这样的东西:
all:
cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"
&&
运算符是成功的短路测试;如果其中任何一个命令失败,则整个命令将立即失败。
还记得在调用递归make时始终使用$(MAKE)
或${MAKE}
(它们是相同的),不要使用静态make
。