为什么生成目标文件后Make会跳过先决条件?



我不明白,一旦目标文件- $(TEST_LOG)已经生成,make check_tests和make eval_test都将跳过先决条件,但执行配方。有人能给我一些指导,帮助我理解吗?

假设$(TEST_LOG)是一天前生成的,与当前时间戳相比,它是过时的。然后用户现在做eval_test,它应该在当前时间戳内重制test.log。但是在本例中,跳过了目标$(TEST_LOG)。但它确实执行了规则。在我看来,如果跳过先决条件,它也会跳过执行recipe。为什么在这种情况下make会这样做?

TEST_LOG = test.log
check_tests: $(TEST_LOG) eval_test

$(TEST_LOG):
@echo "-- ERROR --" |& tee -a $@
eval_test: $(TEST_LOG)
@if [ `grep -cs "ERROR" $(TEST_LOG)` -eq 0 ]; then exit 0; else exit 1 ; fi

谢谢,TM

如果您希望每次调用make test.logmake eval_test时都重新构建test.log,您可以在makefile中添加一行:

TEST_LOG = test.log
.PHONY: $(TEST_LOG)

这告诉Make不将test.log视为文件名,因此,如果调用它(作为先决条件),则必须执行规则,而不管存在什么文件。

(PHONY行几乎可以在makefile中的任何地方,只要它在TEST_LOG的定义之后,而不是在规则中。)

相关内容

  • 没有找到相关文章

最新更新