1

我意识到,当我从主 makefile 运行 makefile 时,如果它们的子 makefile 失败,则父级继续并且不会返回错误退出代码。我试图添加异常处理......但它不起作用。有任何想法吗?

MAKE_FILES := $(wildcard test_*.mak)
compile_tests:
        @echo "Compiling tests.$(MAKE_FILES)."
        @for m in $(MAKE_FILES); do\
                $(MAKE) -f "$$m"; || $(error Failed to compile $$m)\
        done
4

1 回答 1

1

您不能像配方中那样使用 make 函数,因为在调用 shell之前首先$(error ...)扩展所有 make 变量和函数。因此,当 make 尝试运行该配方时,错误功能将立即发生,甚至在它开始之前。

您必须使用外壳构造来失败,而不是构造构造;就像是:

compile_tests:
        @echo "Compiling tests.$(MAKE_FILES)."
        @for m in $(MAKE_FILES); do \
                $(MAKE) -f "$$m" && continue; \
                echo Failed to compile $$m; \
                exit 1
        done

然而,即使这样也不是很好,因为如果你使用-k它仍然会立即停止。更好的是利用 make 做得好的东西,它运行了很多东西:

compile_tests: $(addprefix tests.$(MAKE_FILES))
$(addprefix tests.$(MAKE_FILES)): tests.%:
        $(MAKE) -f "$*"

请注意,如果您启用-j这些将全部并行运行。不知道你是否可以。

于 2013-10-24T18:56:23.513 回答