这是我的makefile,主要是试图解决在先决条件中没有特定于目标的变量的事实:
#include
如果我这样做:
horse: shoe
$(info Making horse)
clean:
@rm -f horse nail shoe shoe.d
# Target-specific variable
shoe: DEPS := nail
shoe: shoe.d
$(info Making shoe)
@touch shoe
shoe.d:
$(info Making shoe.d)
@echo shoe: $(DEPS) > shoe.d
nail:
$(info Making nail)
@touch nail
-include shoe.d
忘了马蹄钉!事实证明,shoe.d的创建好像是在规则运行时没有设置$ DEPS
$ make
Making shoe.d
Making shoe
Making horse
我找到了两个不同的调整,使事情有效(同时破坏了这一点),证明我真的不明白发生了什么。
1)如果我编辑Makefile以删除最后一个(包含)行,它当然会忘记钉子,但现在正好创建了shoe.d:
$ cat shoe.d
shoe:
从最后一次调用开始,将include行放回并依赖shoe.d的内容,然后按预期工作:
$ make clean
$ make
Making shoe.d
Making shoe
Making horse
$ cat shoe.d
shoe: nail
同样,如果我用明确写出的规则替换include行,事情总是按预期工作。
2)如果我删除DEPS变量的目标特定性质,即只写
$ make
Making nail
Making shoe
Making horse
然后,即使包含到位,事情仍然有效。
有人可以解释这里发生了什么吗?