我不明白,一旦目标文件- $(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.log
或make eval_test
时都重新构建test.log
,您可以在makefile中添加一行:
TEST_LOG = test.log
.PHONY: $(TEST_LOG)
这告诉Make不将test.log
视为文件名,因此,如果调用它(作为先决条件),则必须执行规则,而不管存在什么文件。
(PHONY
行几乎可以在makefile中的任何地方,只要它在TEST_LOG
的定义之后,而不是在规则中。)