2014-03-27 35 views
5

我在GNU make中看到了目標特定變量的意外結果。生成文件和先決條件中特定於目標的變量

我想要的是設置一個目標特定的變量,影響依賴關係。我可以使用.SECONDEXPANSION來實現。

some-target: DEP := debug-dep 

debug: some-target 

.SECONDEXPANSION: 
some-target: $$(DEP) 
    @echo $^ 

debug-dep: 

make debug打印debug-dep


現在我讀了make defines target-specific variables for descendant rules

當你定義一個特定目標變量,變量值也爲這一目標的所有先決條件的影響,他們的所有先決條件,等等

但是,當我改變我的makefile來對「父」的目標變量集:

debug: DEP := debug-dep 

debug: some-target 

.SECONDEXPANSION: 
some-target: $$(DEP) 
    @echo $^ 

debug-dep: 

並做make debug我得到一個空行。

這似乎與目標特定變量的記錄行爲相矛盾。有什麼我失蹤了嗎?


這是有點類似於make: Using target specific variables in prerequisites,但我所做的是不工作。

回答

5

我相信這裏的問題是目標特定的變量不會設置,直到目標運行(如果你添加@echo '$(DEP)'到你的some-target身體在第二種情況下,你會看到它被設置),但第二次擴展發生在初始讀入階段之後立即進行。

我要說的是,我真的很驚訝,它在第一種情況下工作(並推測爲什麼),但隨後我拉起手冊一分鐘,同時閱讀約.SECONDEXPANSION我發現following

只有當您發現次級擴展總是發生在該目標的自動變量的範圍內時,纔會顯示此功能的真正威力。這意味着您可以在第二次擴展期間使用諸如$ @,$ *等變量,並且它們將具有它們的期望值,就像在配方中一樣。您所要做的只是通過轉義$來推遲擴展。另外,對於顯式和隱式(模式)規則都會發生二次擴展。

這說明了你的行爲準確。擴展只會看到目標範圍內設置的變量,並且繼承的先決條件僅發生在目標評估時間(因爲它取決於目標先決條件)。