使用makefile使用多个源文件编译多个应用程序

时间:2013-07-31 01:55:30

标签: compilation makefile gnu-make

我想使用单个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'。 但是上面的代码似乎没有发生这种情况。 有人可以建议使用%的正确方法将其替换为我想要的变量名称。

谢谢

2 个答案:

答案 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

......但这个答案很长。