我刚刚开始真正了解make的内部工作原理.但我不明白为什么以下不起作用:
test%: test%.foo
@echo $@
@echo $<
all: test1 test2
.PHONY: all test1 test2
Run Code Online (Sandbox Code Playgroud)
预期行为:
$ make
test1
test1.foo
test2
test2.foo
# 1,2 Order not important
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
$ make
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)
("make all","make test1"等没有区别).
有人可以解释为什么PHONY测试规则没有被执行?
摘自GNU make手册.
由于它知道虚假目标没有命名可以从其他文件重新创建的实际文件,因此跳过对虚假目标的隐式规则搜索(请参阅使用隐式规则一节).这就是为什么即使您不担心实际存在的文件,声明目标虚假也有助于提高性能.
这意味着,由于您test1和test2目标是虚假的,因此make不会为它们搜索隐式规则.即使您使用的是更准确的命名模式规则,所有模式规则都是隐式规则.