2014-10-01 109 views
1

在我的項目的所有.cpp文件都存儲在Makefile文件 - 替換通配符

Classes/ 
Classes/Something/ 
Classes/Something/Else 
... 

我想編譯所有.cpp文件separetly到bin /目錄下,替換/與_,使:

Classes/First.cpp -> Bin/Classes_First.o 
Classes/Foo/Bar.cpp -> Bin/Classes_Foo_Bar.o 

現在我想爲編譯創建規則:

Bin/%.o: $(subst _,/,%.cpp) 
    $(COMPILER)g++ $(COMPILE_FLAGS) -c -o [email protected] $^ 

我想:

make bin/Classes_Test.o

但編譯失敗。

因此,我創建調試模式:

%.cpp: 
    @echo CPP: [email protected] 

現在印刷:

CPP: Classes_Test.cpp 

爲什麼?

所以我改變了我的模式:

Bin/%.o: $(subst _,/,Test1_Test2.cpp) 

,我看到:

CPP: Test1/Test2.cpp 

我有點困惑,爲什麼SUBST如果我使用通配符作爲源不工作...

回答

0

這是一個評估訂單問題。

當make解析makefile時,它會評估$(subst)調用,但此時$(subst)的參數是文字字符串%.cpp,它沒有任何東西可以替代,所以什麼也不做。

在目標評估/執行時間,目標模式中的%和prereq模式已填寫,但$(subst)早已消失。

要做到這一點,您需要手動(以某種方式)將輸出文件映射到輸入文件。你可以做到這一點,並保持%.o模式的規則目標爲實際的配方運行雖然(所以你只需要生成一堆Bin/Test1_Test2.o: Test1/Test2.cpp行)。

另外,我相信你能可能能夠使用secondary expansion做到這一點:

.SECONDEXPANSION: 
Bin/%.o: $$(subst _,/,%.cpp)