我有一个我在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)生成这些规则,以便我不必像这样复制它们?
答案 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的一个功能,可以使用更长时间。但是这种方法使用起来有点棘手。