Makefile:为什么我的.PHONY目标没有运行?

时间:2017-03-23 10:31:35

标签: makefile

生成文件:

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将运行其配方   无条件地,无论具有该名称的文件是否存在或   它的最后修改时间是什么。

0 个答案:

没有答案