2012-01-30 106 views
0

我已經包含的存檔文件,我需要生成以下形式的列表,我的makefile的一個有一個變量:自動生成的makefile的先決條件(GNU-MAKE)

/libpath/mylib1/obj/mylib1.a 
/libpath/mylib2/obj/mylib2.a 
/libpath/mylib3/obj/mylib3.a 

等。我已經建立了一個規則來創建每一個,基本上它掃描父文件夾中的.cpp文件並在/ obj子文件夾中創建.o先決條件(因此,如果/ libpath/mylib1包含foo.cpp和bar.cpp,那麼先決條件是/libpath/mylib1/obj/foo.o和/libpath/mylib1/obj/bar.o等)。我可以通過.SECONDEXPANSION創建一個.cpp文件列表,刪除.cpp文件,刪除文件夾和擴展名,後綴爲.o擴展名,然後將其作爲目標文件夾的前綴:

%.a: $$(addprefix $$(dir [email protected]),$$(addsuffix .o,$$(basename $$(notdir $$(wildcard $$(dir [email protected])../*.cpp))))) 

這工作正常,但我不禁感到我正在以一種過於複雜的方式解決這個問題。有沒有更好的/更清潔的方式來做這樣的事情?

回答

1

我只會建議將邏輯提取到宏中,並使用後者作爲先決條件。我也希望patsubst function而不是notdir + basename + addsuffix$(@D) automatic variable而不是$(dir [email protected])

lib_objects = $(patsubst %.cpp,$(@D)/%.o,$(notdir $(wildcard $(@D)/../*.cpp))) 

%.a: $$(lib_objects) 

IMO,看起來好一點,不是嗎?

+0

謝謝埃爾達爾。我使用的是addsiffix,因爲實際上有四種不同的擴展名我試圖過濾出來,我需要仔細看看patsubst是否可以處理。乾杯! – 2012-02-02 01:20:48

+0

@Mark,不客氣! – 2012-02-02 08:11:58