makefile - 使用 make 构建多个二进制文件

标签 makefile

我想创建一个 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/

相关文章:

perl - 如何管理开源 Perl 项目使用的模块的安装?

c++ - 无法使用现有代码在 Netbean C++ 项目中添加测试

c++ - 如何在 except-disabled 构建过程中编译带有异常的 c++ 代码

linux - 如何在 makefile 中使用 eval 函数?

makefile - 将调用参数传递给 Makefile 中的另一个函数

c - 如何在编译时在依赖文件中添加用户定义的依赖项

ios - “strcmp”未在此范围内声明

Makefile:4: *** 缺少分隔符

Linux 使用 lapack 库