Makefile 为什么我的假目标没有运行?

Makefile 为什么我的假目标没有运行?,makefile,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 我知道这个话题已经被问过很多次了,答案是肯定的 但

生成文件:

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
我知道这个话题已经被问过很多次了,答案是肯定的 但我不明白为什么在我的例子中,userrrr字符串没有被打印出来/home/dhp是我的目标的直接dep,并且,由于.PHONY,即使文件存在,也应该运行它

如果我没有别的选择,我可以接受/home /%:依赖一个非常新鲜的文件(使用当前进程的PID文件的锁,或者依赖于一个永远不会创建ANY文件的虚拟目标),它总是比/home /%更为新近,但我会认为这是脏的。我不认为,中间人可以帮上忙

编辑:更多测试:

SHELL := /bin/bash

all:

.PHONY: FORCE

.PHONY: /home/%

.PHONY: /home/dhp

FORCE:

/home/%: FORCE
        @echo do user $* USERRRRRR

plop: /home/dhp
        @echo plop
=>

=>

那么,使我的目标虚假可以防止运行它?这与文件规定的情况完全相反:

当该考虑这个目标的时候,让它运行它的配方。 无条件地,无论具有该名称的文件是否存在 最后一次修改时间是多少


再次阅读文档后,我确认.PHONY可用于真实文件,但仅适用于命令行上指定的目标,不适用于deps,尽管在中有说明,但我在文档中发现了这一点:(参见第二个链接)“考虑到这样一个目标的时候,要让它无条件地运行它的配方,不管该文件是否存在,或者它的最后修改时间是什么”。在第一个链接中:“干净的目标将不起作用[…],如果一个名为Clean的文件被创建了”可能回答:2个错误:- 1。假的似乎不接受通配符(%)。,不确定它在与变量一起使用时是否正常。-2-我每次要运行的目标本身不能是虚假的,但取决于虚假的空目标:-3-文件夹似乎不被视为文件(除非虚假阻止查看目录)。问题的基础是,我希望始终运行包含通配符的目标(%)不能设置为虚假。使用$^进行输入时,使用FORCE会产生副作用。可能是JohnLM的重复,是的,看起来是这样。谢谢,因为您的链接似乎提供了一个解决方案。我现在没有时间挖掘代码,并检查它是否适用于我的项目(由于此,仍然存在bug),但快速阅读后…看起来您是对的。不确定DUP的StackOverFlow策略是什么;他们是否可以完全删除此/我的线程(请不要)?或者将其标记为已解决疑问?
# 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