2012-05-08 79 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的特点作出很多更长的时间。但是这种方法使用起来有点棘手。

相关问题