生成文件:
SHELL := /bin/bash
all:
.PHONY: /home/% /home/dhp
/home/%:
@echo do user $* USERRRRRR
plop: /home/dhp
@echo plop
外壳:
# ll /home/
total 4
drwxr-xr-x 3 dhp dhp 4096 Mar 22 08:53 dhp
# make plop
plop
我知道很多次都会问过这个话题,答案就是答案 https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html https://www.gnu.org/software/make/manual/html_node/Special-Targets.html https://www.gnu.org/software/make/manual/html_node/Chained-Rules.html#Chained-Rules 但我不明白为什么在我的情况下不打印USERRRRRR字符串。 / home / dhp是我的目标的直接dep,并且,由于.PHONY,即使文件存在也应该运行。
如果我别无选择,我可以接受make / home /%:依赖于一个非常新鲜的文件(通过使用例如锁定的PID文件,它将总是比/ home /%更新)当前进程,或依赖于永远不会创建anny文件的虚拟目标),但我认为这是脏的。我不认为.INTERMEDIATE可以在这里提供帮助。
编辑:更多测试:
SHELL := /bin/bash
all:
.PHONY: FORCE
.PHONY: /home/%
.PHONY: /home/dhp
FORCE:
/home/%: FORCE
@echo do user $* USERRRRRR
plop: /home/dhp
@echo plop
=>
# make plop
plop
...
SHELL := /bin/bash
all:
.PHONY: FORCE
FORCE:
/home/%: FORCE
@echo do user $* USERRRRRR
plop: /home/dhp
@echo plop
=>
# make plop
do user dhp USERRRRRR
plop
所以,让我的目标假冒无法运行它?这与文档中的内容完全相反:
当考虑这样一个目标时,make将运行其配方 无条件地,无论具有该名称的文件是否存在或 它的最后修改时间是什么。