2012-05-08 78 views
0

我有庫文件夾的是我指定的make文件的列表:Makefile文件 - 編譯到不同的目標文件夾

LIBRARIES = Ethernet    \ 
      SPI      \ 
      SD 

我也有一些規則爲每一個編譯爲本地OBJ我的項目文件夾:

obj/SPI/%.cpp.o: $(LIBS_DIR)/SPI/%.cpp 
    @echo "Compiling $<" 

obj/SD/%.cpp.o: $(LIBS_DIR)/SD/%.cpp 
    @echo "Compiling $<"  

obj/Ethernet/%.cpp.o: $(LIBS_DIR)/Ethernet/%.cpp 
    @echo "Compiling $<"  

(注意每個人都使用它自己的子文件夾)。我如何自動從$(LIBRARIES)生成這些規則,以便我不必像這樣複製它們?

回答

4

你可以這樣做:

obj/%.cpp.o : $(LIBS_DIR)/%.cpp 
    g++ -c -o [email protected] ${CPPFLAGS} ${CXXFLAGS} $< 

在上面%捕捉dir/src一部分。

如果你想創建自動它可以與secondary expansion化妝功能來完成輸出目錄:

.SECONDEXPANSION: 

obj/%.cpp.o : $(LIBS_DIR)/%.cpp | $${@D} # object file depends on its directory 
    g++ -c -o [email protected] ${CPPFLAGS} ${CXXFLAGS} $< 

obj/% : # directory creation rule 
    mkdir -p [email protected] 
+1

感謝馬克西姆,繼發性擴張是我清盤使用到底。 –

3

足夠新的GNU版本支持eval函數。您可以使用它像這樣:

define SUBDIR_RULE 
obj/$1/%.cpp.o: $(LIBS_DIR)/$1/%.cpp 
     @echo "Compiling $$<" 
enddef 

$(foreach D,$(LIBRARIES),$(eval $(call SUBDIR_RULE,$D))) 

如果你不想依賴,你可以使用自動生成的makefile,這已經GNU的特點作出很多更長的時間。但是這種方法使用起來有點棘手。

相關問題