2014-01-22 48 views
2

假設像文件結構如下:匹配的模式作爲參數傳遞給Makefile中起作用的依賴

a/a1.cpp 
a/a2.cpp 
b/b1.cpp 
b/b2.cpp 
Makefile 

我的目標是要建立兩個目標文件A0和B0其中AO取決於a1.cpp和a2.cpp和bo取決於b1.cpp和b2.cpp。但是,事實證明,我無法在Makefile中解決這個問題。這裏是我的嘗試:

SOURCES := a/a1.cpp a/a2.cpp b/b1.cpp b/b2.cpp 
TARGETS := a.o b.o 
RELEVANT = $(filter $(1)/%.cpp,$(SOURCES)) 
$(TARGETS): %.o: $(call RELEVANT,%) 
    @echo $^ 

我本來期望,使用呼叫功能%在由A或B以及相關的回報所需的依賴所取代。然而,$ ^只是返回一個空字符串,表明顯然過濾器函數沒有按預期工作。 基本上,這個問題似乎是由模式匹配規則之前評估函數引起的,如下所述:Makefile, Regex and multiple dependencies。不過,我無法將給出的解決方案轉移到我的案例中。此外,它看起來有點駭人,我希望有一個更清晰的解決方案,不需要bash功能。

有人能想出解決這個問題的辦法嗎?

回答

0

有很多方法可以做到這一點。如果你真的想在先決條件列表的功能做到這一點,那麼你可以使用輔助擴展:

.SECONDEXPANSION: 

$(TARGETS): %.o: $$(call RELEVANT,%) 
     @echo $^ 

我不太清楚你是如何編譯多個.cpp文件合併爲一個目標文件,雖然。

+0

謝謝!這工作完美。我完全不知道二次擴張。關於將多個cpp文件編譯成一個對象的問題:你說得對,這沒什麼意義。其實,這是我過分簡化問題的結果。我最初的問題是基於來自不同子目錄的對象文件更新不同的動態庫。 – Timo

0

這裏的另一個問題:

all : ${TARGETS} 

define RULE 
${1}.o: $(2) 
     echo "$$(1) : [email protected] : $$^" 
endef 

$(foreach tgt, $(TARGETS), $(eval $(call RULE, $(basename $(tgt)), $(filter $(basename $(tgt))/%.cpp, $(SOURCES))))) 
+0

感謝您的回答。瘋狂科學家對我來說似乎不那麼複雜,所以我將他標記爲正確。 – Timo