3

我在我的 Makefile(GNU) 中使用 sub-make。但是每当子制作失败时,主制作会在此之后继续成功运行。每当我的子制作失败时,我希望我的主 Makefile 失败。我怎么做?

all:   
    pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd

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

4

1 回答 1

9

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

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

因此,如果编写正确,您的制作将在子制作失败时停止。如果没有,那么调用子 make 的规则将丢失退出代码,这就是父 make 不会失败的原因。如果您提供了您的规则,我们可以准确地告诉您如何解决它。

根据我的经验,我建议您可能有这样的规则来运行子制作:

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)

编辑

根据您的 makefile 并阅读上面的内容,您可以看到问题所在:脚本中的最后一个命令是popd不会失败的,因此该命令的退出代码是成功的。请注意,您不需要在这里使用pushdpopd(至少在 UNIX 系统上不需要),因为每个命令都在单独的 shell 中运行,因此当 shell 退出时,工作目录会被重置。

你想要这样的东西:

all:
        cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"

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

还要记住在调用递归 make 时始终使用$(MAKE)or ${MAKE}(它们是相同的),不要使用 static make

于 2013-05-11T00:25:36.420 回答