2012-07-20 54 views
7

我還是不明白爲什麼Makefiles中的「假冒」規則有「.PHONY」作爲他們的目標。作爲先決條件將更合乎邏輯。爲什麼.PHONY:目標而不是目標:.PHONY?

我必須詳細說明嗎?如果A取決於BB是假的,那麼A也是假的。因此,依賴關係圖.PHONYBA是wawa令人驚訝的,與.PHONYBA相比。 (另一個說法是,make的實現必須處理.PHONY目標非常特殊。)

儘管這種批評可能看起來相當理論化(毫無意義) - 「因爲make是如此古老,它的語法在這裏停留」。但我不建議任何語法變化,還存在另一種:

隨着GNU使(至少),下面的Makefile聲明瞭一個假target_A

target_A: _PHONY 
     touch target_A 

_PHONY: 
     #noop 

問題1這是如此簡單而乾淨,我當然不是它的第一個發明家。實際上,考慮到這個選擇,爲什麼make需要特殊的語法?

在我看來,這也可以很好地解決有關wildcards in phony targets的問題,甚至可能在shed some light on .PHONY's meaning時,當初學者懷疑時。

問題2您能想到這種方法較差的情況嗎? (?正在調用make .PHONY任何使用)

(我要指出的是,雖然我已經調用其他make S,GNU提出的是,我有一些經驗與唯一實現 - 讀,寫Makefile文件)

+0

(應該有RTFM)實際上GNU Make手冊[提到這個配方](http://www.gnu.org/software/make/manual/html_node/Force-Targets.html#Force-Targets)高效,但更便攜。我猜想速度增益是可以忽略不計的。這表明對問題2的否定答案。(?) – tiwo 2012-07-20 21:25:02

回答

3

使用target_A: .PHONY時遇到的一個大問題是,它使得使用許多make的內置變量要困難得多。就拿這個共同的食譜作爲例子:

%.a: $(OBJ_FILES) 
    $(LD) $(LFLAGS) -o [email protected] $^ 

$^可變拉進一切,列出的一個先決條件。如果.PHONY也在那裏列出,那麼它將被傳遞給命令行上的鏈接器,這可能不會導致任何事情發生。使用像.PHONY這樣的meta-targets作爲先決條件使得這些內置變量的用處明顯不足,因爲每次使用它們時都需要大量額外的處理,如$(filter-out .PHONY,$^)。爲了考慮依賴關係樹,反轉關係並改爲使目標有點尷尬,但是它清除了makefile的其餘部分。

+0

哦,我明白了。 [其他「特殊」目標「的存在)(http://www.gnu.org/software/make/manual/html_node/Special-Targets。html#Special-Targets) - 包括一些根本不適合(依賴語義)的依賴關係圖 - 似乎減輕了「爲什麼這麼特別」的反對意見。 – tiwo 2012-07-20 22:50:44

相關問題