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

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执行程序时,无论它是编译器、链接器、文档格式化程序

我在Makefile(GNU)中使用子make。但每当子make失败时,主make将继续成功运行。每当我的子make失败时,我希望我的主Makefile失败。我该怎么做

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
进行递归调用有什么区别?看,实际上还有其他更好的原因。如果你想知道的话,可以问一个新问题:对一个无关话题的答案发表评论是不合适的。