2011-10-25 54 views
4

我剛剛開始真正瞭解make的內部工作原理。但我不明白爲什麼下面不工作:Makefile通配符(靜態規則?)假冒

test%: test%.foo 
    @echo [email protected] 
    @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'. 

( 「讓所有」,「使test1「等沒有區別)。

有人可以解釋爲什麼PHONY測試規則沒有被執行嗎?

回答

7

摘自GNU make手冊。

因爲它知道,僞目標不命名可能 從其他文件重拍實際的文件,請跳過隱含規則搜索 僞目標(參見使用隱含規則)。這就是爲什麼 宣佈目標虛假對性能有好處,即使你不是 擔心實際存在的文件。

這意味着,因爲您的test1test2目標是假的,make不會爲它們搜索隱式規則。即使您使用的是更準確地命名爲模式規則,所有模式規則都是隱式規則。

+0

啊,最後一點「所有模式規則都是隱含的規則」,這對我來說是新的。在這種情況下,是否可以強制執行我想要的操作? – Pat

+0

使'test1'和'test2'不僞造,例如通過添加@ touch $ @'。 – reinierpost

+0

@reinierpost:它不會改變任何東西來擁有實際的'test1'和'test2'文件。它們在Makefile中被定義爲假,所以它們是假的,而不管現有的文件。爲了讓它們變得非虛假,唯一的方法就是將它們從'.PHONY'規則中移除。 –