我的目录结构如下(当然src/
子目录也包含文件,但这些文件现在并不重要):
examples/
├───testprog1/
│ ├───bin/
│ ├───obj/
│ ├───src/
│ └───Makefile
├───testprog2/
│ ├───bin/
│ ├───obj/
│ ├───src/
│ └───Makefile
└───Makefile
Makefile
和testprog1/
中的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/
。它应该是什么样的?当然,它必须具有将为所有子目录执行的目标all
和clean
。我也想避免for循环,因为我听说他们阻止make
使用并行处理。
答案 0 :(得分:0)
你可以在后台添加一个&
来运行配方,这样你就可以并行构建,但是当你的目标可以在后台任务完成运行之前完成时,这会很麻烦,可能导致依赖性问题,因此我们将避开这一点。
更好的解决方案是为每个子目录创建一个新规则:
.PHONY: testprog1 testprog2
testprog1 testprog2:
$(MAKE) -C $@ $(MAKECMDGOALS)
all clean: testprog1 testprog2
如果您执行make clean
,则$(MAKECMDGOALS)
将为clean
。它将使用此目标构建testprog1
和testprog2
。请注意,因为testprog1
和testprog2
是目录名称,所以必须将它们声明为phonies,因为它们的时间戳会在构建时更改。
如果您希望将任何命令(保存%: testprog1 testprog2
或testprog1
)传递给子制作,您也可以将目标指定为testprog2
。