我意识到当我从主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
答案 0 :(得分:1)
你不能在配方中使用像$(error ...)
这样的make函数,因为在调用shell之前,所有make变量和函数都先扩展 , 。因此,当make尝试运行该配方时,错误功能将立即发生。
你必须使用shell构造失败,而不是构造;类似的东西:
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
,它仍会立即停止。更好的是利用制作得很好的东西,这是很多东西:
compile_tests: $(addprefix tests.$(MAKE_FILES))
$(addprefix tests.$(MAKE_FILES)): tests.%:
$(MAKE) -f "$*"
注意,如果您启用-j
,这些将全部并行运行。不确定这对你是否合适。