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

时间:2011-10-25 09:38:58

标签: makefile target

我刚开始真正了解make的内部运作方式。但我不明白为什么以下不起作用:

test%: test%.foo
     @echo $@
     @echo $<

all: test1 test2

.PHONY: all test1 test2

预期行为:

$ make
test1
test1.foo
test2
test2.foo
# 1,2 Order not important

但是,我得到了:

$ make
make: Nothing to be done for `all'.

(“make all”,“make test1”等没有区别。)

有人可以解释为什么没有执行PHONY测试规则吗?

1 个答案:

答案 0 :(得分:7)

摘自GNU make手册。

  

因为它知道虚假目标没有命名可能的实际文件   从其他文件重新制作,跳过隐式规则搜索   虚假目标(请参阅使用隐式规则一节)。这就是为什么   即使你不是,宣布目标虚假也有利于表现   担心实际存在的文件。

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