Makefile 如何处理GNU make错误中的子make?
我在Makefile(GNU)中使用子make。但每当子make失败时,主make将继续成功运行。每当我的子make失败时,我希望我的主Makefile失败。我该怎么做Makefile 如何处理GNU make错误中的子make?,makefile,gnu-make,Makefile,Gnu Make,我在Makefile(GNU)中使用子make。但每当子make失败时,主make将继续成功运行。每当我的子make失败时,我希望我的主Makefile失败。我该怎么做 all: pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd 每当STA_DIR中的make失败时,主make不会停止。我想停止主要生产 因为你没有提供任何关于你的规则的细节,我们无法回答这个问题。make执行程序时,无论它是编译器、链接器、文档格式化程序
all:
pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd
每当STA_DIR中的make失败时,主make不会停止。我想停止主要生产 因为你没有提供任何关于你的规则的细节,我们无法回答这个问题。make执行程序时,无论它是编译器、链接器、文档格式化程序还是make的另一个实例,其工作方式都是相同的:如果退出代码为
0
,在UNIX中为“成功”,则make继续执行下一条规则。如果退出代码为非-0
,在UNIX中为“失败”,则停止(除非使用了-k
选项)
只有当make程序尝试构建的所有目标都成功时,make程序才会以0
退出
因此,如果写入正确,当子make失败时,make将停止。如果没有,那么调用子make的规则将丢失退出代码,这就是父make没有失败的原因。如果您提供了规则,我们可以准确地告诉您如何修复它
根据我的经验,我建议您可以有这样的规则来运行sub makes:
SUBDIRS = foo bar biz
all:
for d in $(SUBDIRS); do $(MAKE) -C $$d; done
.PHONY: all
这里您没有检查每个子品牌的退出代码,因此它不会停止。只有最后一个命令的最终退出代码从shell发送回make。您应该像这样重写makefile(如果是这样的话):
SUBDIRS = foo bar biz
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
.PHONY: all $(SUBDIRS)
all:
cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"
编辑
根据makefile并阅读上面的内容,您可以看到错误:脚本中的最后一个命令是不会失败的popd
,因此该命令的退出代码是success。请注意,此处不需要使用pushd
和popd
(至少在UNIX系统上不需要),因为每个命令都在单独的shell中运行,因此shell退出时工作目录会重置
你想要这样的东西:
SUBDIRS = foo bar biz
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
.PHONY: all $(SUBDIRS)
all:
cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"
和&
操作员是成功的短路测试;如果其中任何一个命令失败,那么整个命令将立即失败
还请记住,在调用递归MAKE时,始终使用
$(MAKE)
或${MAKE}
(它们是相同的),不要使用静态MAKE,明白了吗。谢谢我刚刚添加了我的实际makefile,以供我的OP.Excellent中参考。我会对我的品牌做必要的改变。谢谢!!使用${MAKE}
和MAKE
进行递归调用有什么区别?看,实际上还有其他更好的原因。如果你想知道的话,可以问一个新问题:对一个无关话题的答案发表评论是不合适的。