2012-06-03 48 views
3

我試圖建立一個模式規則,允許我在宏調用中使用%,但我沒有得到我期望的結果。GNU Make:在模式規則宏中使用%

模式規則:

%.o: %.cpp $(%_H) 
    g++ -o [email protected] $(FLAGS) -c $< 

的問題是與$(%_ 1H)

出於某種原因%並沒有擴張到它是什麼定義。

當我打印出依賴關係列表($ ^)時,只打印源文件。

我建立我的依賴關係的一個非常乾淨的方式,我想用:

# Header Dependencies per object 
Geometry_H:=Geometry.h $(Error_H) 
Enemy_H:=Enemy.h $(Geometry_H) $(Error_H) 
Surface_H:=Surface.h $(Geometry_H) 
Player_H:=Player.h $(Geometry_H) $(Surface_H) 
SDLWindow_H:=SDLWindow.h $(Surface_H) $(Error_H) 
Path_H:=Path.h $(Geometry_H) $(Error_H) 
Territory_H:=Territory.h $(Geometry_H) 
Board_H:=Board.h $(Territory_H) $(Geometry_H) $(Player_H) $(Path_H) $(Enemy_H) $(Error_H) 
Error_H:=Error.h 
Diminisher_H:=Diminisher.h $(SDLWindow_H) $(Geometry_H) $(Surface_H) $(Board_H) $(Error_H) 
Main_H:=$(Diminisher_H) 

另一人曾建議我改變這些變量到相關性列表。

I.e. Main_H:= $(Diminisher_H)

成爲 Main.o:$(Diminisher_H)

這是一個很好的修復,它的工作原理。 但是,問題仍然是$(%_ H)在某種程度上是無效的。

我想知道如何(如果可能)使它成爲一個有效的表達式。我試過$($%_ H),$($(%)_ H),$($(value%)_ H)等等。 看起來像%在宏調用中失去了意義。

在宏調用中沒有辦法使用%嗎?

回答

3

要麼使用secondary expansion

.SECONDEXPANSION: 

%.o: %.cpp $$($$*_H) 
    g++ -o [email protected] $(FLAGS) -c $< 

或(IMO,更好)使用依賴自動生成:

+0

謝謝。二次擴張做到了這一點。但是,當我嘗試使用$$($$%_ H)時,問題仍然存在。只有當我使用$$($$ * _ H)時,表達式才能正確擴展。它看起來像GNU make只是可能不喜歡在宏調用中使用%?另外,我感謝額外的信息。我需要在某個時候升級到自動生成依賴項......也許不適合這個項目。 – joshterrell805

+0

@SexyBachelor百分號在模式規則中有特殊含義,只是不要使用它。 '$ *'是[自動變量](http://www.gnu.org/software/make/manual/make.html#Automatic-Variables),它擴展到規則匹配的詞幹,即百分比標誌。 –

+0

好的。謝謝您的幫助。 – joshterrell805

相關問題