2013-12-20 26 views
0

我有以下使用gmake目標:

$(GCH_demo): $(PCH_demo) | $$(@D) prebuild_demo 
     @echo PCH $< 
     -cp $< $(@D) 
     $(CXX_demo) $(strip $(CPPFLAGS_demo) $(CXXFLAGS_demo)) -o [email protected] -c $< 

請注意這裏的$(@ d)

  • 在先決條件,我需要逃離美元,從而爲:$$(@ d)
  • 在配方,無處可逃需要:$(@ d)

我的理解是,我希望這個自動變量能被擴展,所以在這兩種情況下,它都不應該被轉義 - 但事實證明,如果我沒有在必要條件中逃離美元,它就不會起作用。

任何想法?

謝謝。

+0

從[手冊](http://www.gnu.org/software)閱讀[this](http://www.gnu.org/software/make/manual/make.html#Rule-Syntax)部分/make/manual/make.html)。 – devnull

+0

@devnull是的,我有 - 你的意思是「如果你真的想要一個目標的美元符號或先決條件,你必須寫兩個」?不 - 我不認爲我想要美元符號,我只是希望它被擴大 –

回答

2

您正在使用二次擴展(請參閱the manual中的討論)。

通常在make規則中,自動變量僅在配方內有效。它們在先決條件列表中不可用,因爲規則的目標和先決條件在解析規則之前展開;在知道目標是什麼之前,任何「正常」變量參考將被展開,所以在設置自動變量[email protected](或其替代形式)之前。

如果啓用了二次擴張,那麼前提名單將經過一輪的擴張,該規則被解析後,並在本次擴張的自動變量[email protected]將正確設置。但是,爲確保您的變量引用能夠進入第二輪,您必須將其轉義,以便在第一輪中不會擴展。

考慮一下:

.SECONDEXPANSION: 
all: $(info [email protected]) $$(info [email protected]) 
     @: 

當你運行這個你:

first= 
second=all 

預期。

相關問題