Makefile - 编译到不同的目标文件夹

时间:2012-05-08 01:05:42

标签: build makefile

我有一个我在make文件中指定的库文件夹列表:

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)生成这些规则,以便我不必像这样复制它们?

2 个答案:

答案 0 :(得分:4)

你可以这样做:

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

在上面%抓取dir/src部分。

如果您希望自动创建输出目录,可以使用secondary expansion制作功能完成:

.SECONDEXPANSION:

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

obj/% : # directory creation rule
    mkdir -p $@

答案 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 make的一个功能,可以使用更长时间。但是这种方法使用起来有点棘手。