我在我的Makefile(GNU)中使用了子make。但每当子make失败时,主make都会继续运行并成功完成。我希望只要子make失败,主Makefile就失败。我该怎么做?
all:
pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd
每当在STA_DIR中进行编译失败时,主要的编译过程并不会停止。我希望能够使主要的编译过程停止。
0
,这在UNIX中表示“成功”,那么make将继续下一个规则。如果退出代码是非0
,这在UNIX中表示“失败”,那么make将停止(除非您使用了-k
选项)。0
。SUBDIRS = foo bar biz
all:
for d in $(SUBDIRS); do $(MAKE) -C $$d; done
.PHONY: all
这里你没有检查每个子make的退出代码,所以它不会停止。 从shell发送回make的只有最后一个命令的最终退出代码。 如果是这样的话,你应该像这样重新编写你的 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}
和make
有什么区别呢? - sta