我想创建一个 Makefile(在父目录中)来调用其他几个 Makefile(在子目录中),这样我就可以通过仅调用一个父 Makefile 来构建多个二进制文件(每个项目子目录一个)。
我的研究因在递归 Makefile 上找到大量内容而受到阻碍,但我认为这就是您尝试将多个目录 Makefile 构建为单个二进制文件的地方?
也许我想要做的事情是通过 shell 脚本更好地处理,也许依次在每个子目录中调用 make,但我认为 Makefile 可能是一个更优雅的解决方案?
非常感谢您收到的任何指点
使用 Linux 和 GNU 工具链的 PS
最佳答案
上面第一个答案中给出的 for 循环解决方案实际上不应该按原样使用。在这种方法中,如果您的子版本之一失败,构建将不会失败(正如它应该的那样),而是继续使用其他目录。不仅如此,构建的最终结果将是最后一个子目录 make 的退出代码,因此如果成功,即使其他子目录失败,构建也会成功。不好!!
您可以通过执行以下操作来修复它:
all:
@for dir in $(SUBDIRS); \
do \
$(MAKE) -C $${dir} $@ || exit $$?; \
done
但是现在你遇到了相反的问题:如果你运行“make -k”(即使有错误也继续),那么在这种情况下将不会被遵守。失败时它仍然会退出。
上述两种方法的另一个问题是它们会序列化所有子目录的构建,因此如果您启用并行构建(使用 make 的 -j 选项),则只会在单个子目录中发生,而不是在所有子目录中发生。
Eregrith 和 sinsedrix 的解决方案更接近您想要的,尽管仅供引用,您在调用递归 make 调用时永远不应该使用“make”。正如 johfel 的示例所示,您应该始终使用 $(MAKE)。
这样的东西就是你想要的:
SUBDIRS = subdir1 subdir1 subdir3 ...
all: $(addprefix all.,$(SUBDIRS))
all.%:
@ $(MAKE) -C '$*' '$(basename $@)'
.PHONY: $(addprefix all.,$(SUBDIRS))
当然,您可以为其他目标添加更多这样的节,例如“安装”或其他目标。还有更奇特的方法来处理具有任何通用目标的构建子目录,但这需要更多细节。
如果您想支持并行构建,您可能需要在此级别声明依赖关系,以避免并行构建相互依赖的目录。例如,在上面,如果在 subdir1 和 subdir2 都完成之前无法构建 subdir3(但 subdir1 和 subdir2 可以并行构建),那么您可以在 makefile 中添加如下内容:
all.subdir3 : all.subdir1 all.subdir2
关于makefile - 使用 make 构建多个二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9313760/