Makefile:保存错误并在最后打印

时间:2018-02-13 17:19:48

标签: makefile

我有以下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,那么它确实存在,尽管它已经存在不是我想要的。

有办法做到这一点吗?

2 个答案:

答案 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