使用假冒的Makefile通配符(静态规则?)

Pat*_*Pat 4 makefile target

我刚刚开始真正了解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测试规则没有被执行?

Did*_*set 7

摘自GNU make手册.

由于它知道虚假目标没有命名可以从其他文件重新创建的实际文件,因此跳过对虚假目标的隐式规则搜索(请参阅使用隐式规则一节).这就是为什么即使您不担心实际存在的文件,声明目标虚假也有助于提高性能.

这意味着,由于您test1test2目标是虚假的,因此make不会为它们搜索隐式规则.即使您使用的是更准确的命名模式规则,所有模式规则都是隐式规则.

  • @reinierpost:不!相反:文件永远不应该存在. - 一旦目标是非虚假的,如果它们存在,它们的时间戳将与依赖的时间戳进行比较.如果目标是最新的,则不会进行构建.这不是虚假(但未宣布为)目标的预期! (2认同)