我有以下Makefile片段,它运行一些测试:
MKFILES = $(wildcard $(addprefix $(UNIT_TEST_SRC)/,$(subst $(comma), ,*.mk))))
TESTS = $(MKFILES:.mk=.test)
%.test:%.mk
@make -f $?
run_tests: $(TESTS)
以上工作正常,但我试图更改它,以便在测试错误时不会中止,而是继续并在最后打印出所有失败。
FAILURES :=
%.test:%.mk
@make -f $? || $(MAKE) $@.error
.PHONY: %.test.error
%.test.error:
$(eval FAILURES += $@)
run_tests: $(TESTS)
@echo "Failures:" $(FAILURES)
似乎我的eval
未在%.test.error
范围内存活,如果我将eval
移动到%.test
,那么它确实存在,尽管它已经存在不是我想要的。
有办法做到这一点吗?
答案 0 :(得分:1)
在以下规则的食谱中:
%.test:%.mk
@make -f $? || $(MAKE) $@.error
调用 make
,并创建另一个新的make
运行实例。正是在eval
发生的情况下。因此,它对执行上述配方的父make
实例没有影响。
相反,您可以在发生错误时创建真正的.test.error
文件:
%.test:%.mk
@make -f $? || touch $@.error
并在完成后删除它们:
run_tests: $(TESTS)
@echo "Failures:" $(FAILURES)
@$(RM) *.test.error
FAILURES
的定义可能是:
FAILURE = $(wildcard *.test.error)
这样,FAILURE
配方执行时会扩展run_tests
(即:使用递归扩展变量延迟扩展),因此它将包含.test.error
个文件(如果有的话)。
答案 1 :(得分:1)
当你致电$(MAKE) $@.error
时,它会调用一个新的make实例,并在那里设置FEATURES
。新值不会传播到父make。
我可能会建议使用临时文件/文件夹:
.PHONY: prep
prep:
rm -rf failures;
mkdir failures;
%.test:%.mk: | prep
@make -f $? || touch failures/$@.error
run_tests: $(TESTS)
@echo "Failures:"
@cd failures && ls || true
@rm -rf failures