0

我有一个我在 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) 自动生成这些规则,这样我就不必像这样复制它们?

4

2 回答 2

4

你可以这样做:

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

在上面的%捕获dir/src部分。

如果您希望自动创建输出目录,可以使用辅助扩展make 功能来完成:

.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 $@
于 2012-05-08T20:23:24.137 回答
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 的一个功能要久得多。但是这种方法使用起来有点棘手。

于 2012-05-08T13:01:26.433 回答