2010-09-16 280 views
7

我正在觀察make的一個有趣的行爲,我想知道除了gmake中的錯誤之外是否還有合理的解釋。沒有配方的makefile模式規則

比方說,我們在makefile文件如下:

%-animal: 
     echo "$* is an animal" 

%-fox: %-fox-animal 

%-wolf: %-wolf-animal 

最後兩個目標之間的區別是,「%-wolf」沒有任何祕方,和「%蘭狐」有一個空的食譜(即在開始時只是一個帶有製表符的行)。

當我們試圖執行規則,這裏發生了什麼:

具有配方(雖然空單)的作品,那是不是就一個沒有
[[email protected] tmp]# make freddy-animal 
echo "freddy is an animal" 
freddy is an animal 
[[email protected] tmp]# make freddy-wolf 
make: *** No rule to make target `freddy-wolf'. Stop. 
[[email protected] tmp]# make freddy-fox 
echo "freddy-fox is an animal" 
freddy-fox is an animal 

i.e.the方式規則。我是否錯過了它應該工作的方式?

+0

你稱之爲'食譜',打電話'制定規則'。所以它的信息與你認爲應該做的事情一致:對狼來說有一個規則,但是沒有規則來製造狼隊。 – reinierpost 2010-09-19 18:50:53

+0

@reinierpost:GNU Make 3.82版本包含一個史詩性文檔搜索/替換,爲用於更新規則目標的一組命令創建術語'recipe'。所以(1)這不僅僅是m1tk4的術語,(2)這對我也是一個驚喜。參見http://cvs.savannah.gnu.org/viewvc/make/doc/make.texi?root=make&view=log的r1.51。 – 2010-09-27 21:21:00

+0

@John Marshall:嗯......很高興知道,謝謝。 (我在3.81上,直到Cygwin將更新它。) – reinierpost 2010-09-28 08:08:03

回答

9

根本沒有食譜的模式規則被記錄爲與提供食譜的食譜完全不同,甚至是空的食譜。相反,他們cancel any pre-existing implicit rule

通過定義具有相同目標和先決條件但沒有配方的模式規則,您可以取消內置隱式規則。

因此,你的 「%-wolf」 模式實際上起到取消%-wolf動物任何現有的隱含規則 - >%-wolf。反正沒有一個。