为所有子目录创建多个目标

时间:2015-12-07 16:42:32

标签: makefile

我的目录结构如下(当然src/子目录也包含文件,但这些文件现在并不重要):

examples/
├───testprog1/
│   ├───bin/
│   ├───obj/
│   ├───src/
│   └───Makefile
├───testprog2/
│   ├───bin/
│   ├───obj/
│   ├───src/
│   └───Makefile
└───Makefile

Makefiletestprog1/中的testprog2/看起来与此类似:

OBJECTS_FILES=$(subst .cpp,.o,$(subst src/,obj/,$(wildcard src/*.cpp)))

bin/testprog1.exe: $(OBJECTS_FILES)
    g++ -o $@ $^

obj/%.o: src/%.cpp
    g++ -c -o $@ $^

clean:
    rm -f obj/*.o
    rm -f bin/meanTest.exe

他们单独工作非常好,但如果我想一次构建所有示例,最好在Makefile中使用examples/。它应该是什么样的?当然,它必须具有将为所有子目录执行的目标allclean。我也想避免for循环,因为我听说他们阻止make使用并行处理。

1 个答案:

答案 0 :(得分:0)

你可以在后台添加一个&来运行配方,这样你就可以并行构建,但是当你的目标可以在后台任务完成运行之前完成时,这会很麻烦,可能导致依赖性问题,因此我们将避开这一点。

更好的解决方案是为每个子目录创建一个新规则:

.PHONY: testprog1 testprog2

testprog1 testprog2:
    $(MAKE) -C $@ $(MAKECMDGOALS)

all clean: testprog1 testprog2 

如果您执行make clean,则$(MAKECMDGOALS)将为clean。它将使用此目标构建testprog1testprog2。请注意,因为testprog1testprog2是目录名称,所以必须将它们声明为phonies,因为它们的时间戳会在构建时更改。

如果您希望将任何命令(保存%: testprog1 testprog2testprog1)传递给子制作,您也可以将目标指定为testprog2