我想使用单个makefile编译多个源文件的多个应用程序 所有来源都在一个目录中。
应用/ SRC /
app1_file1.cpp
app1_file2.cpp
app1_main.cpp
app2_file1.cpp
app2_file2.cpp
app2_main.cpp
应用/生成文件
APPS:= app1_main app2_main
app1_main_SOURCES:= app1_file1.cpp app1_file2.cpp app1_main.cpp
app2_main_SOURCES:= app2_file1.cpp app2_file2.cpp app2_main.cpp
default: app1_main app2_main
%: $(foreach $CPP_FILE,$(%_SOURCES),$(patsubst %.cpp,%.o,$(CPP_FILE)))
gcc ....
%.o: src/%.cpp
gcc ...
我希望$(%_ SOURCES)替换为'app1_main_SOURCES,app2_main_SOURCES'。 但是上面的代码似乎没有发生这种情况。 有人可以建议使用%的正确方法将其替换为我想要的变量名称。
谢谢
答案 0 :(得分:0)
当make解析makefile时会发生foreach。在您的规则运行时,它会很久完成。
此外,您不希望第一个参数中的$
为foreach(即您想要$(foreach CPP_FILE,...,... $(CPP_FILE) ...)
)。
我可能会做(未经测试)的事情:
$(foreach APP,$(APPS),$(APP): $(addprefix src/,$($(APP)_SOURCES:.cpp=.o)))
%:
gcc ...
%.o: src/%.cpp
gcc ...
也就是说,使用for循环设置应用程序与其目标文件之间的先决条件关系,然后让%规则处理目标 - >规则映射。
答案 1 :(得分:0)
有几种方法可以做到这一点。首先,让它运作起来。
将对象列表作为源列表编写起来同样容易,并在以后保存我们的工作:
app1_main_OBJECTS:= app1_file1.o app1_file2.o app1_main.o
app2_main_OBJECTS:= app2_file1.o app2_file2.o app2_main.o
default: app1_main app2_main
app1_main: $(app1_main_OBJECTS)
app2_main: $(app2_main_OBJECTS)
app%_main:
gcc $^ -o $@
如果有很多应用,那么应用规则列表是多余且乏味的。我们可以减少它:
define rule_template
$(1): $$($(1)_OBJECTS)
endef
$(foreach app,app1_main app2_main,$(eval $(call rule_template,$(app))))
或者,如果您的Make版本支持SECONDEXPANSION
,则更简单:
.SECONDEXPANSION:
app1_main app2_main: $$($$@_OBJECTS)
您可以通过定义应用列表来进一步简化操作:
APPS := app1_main app2_main
......但这个答案很长。