我正在寻找建议以在递归 makefile 系统中正确处理单独的调试和发布构建子目录,该系统使用 gnumake 手册中记录的 $(SUBDIRS) 目标将 make 目标应用于(源代码)子目录。
具体来说,我对实现“all”、“clean”、“realclean”等目标的可能策略很感兴趣,这些目标要么假设其中一棵树要么应该在两棵树上都工作导致问题。
我们当前的 makefile 使用一个 COMPILETYPE 变量,该变量被设置为 Debug(默认)或 Release('release' 目标),它正确地执行构建,但清理和 make all 仅适用于默认的 Debug 树。传递 COMPILETYPE 变量变得笨拙,因为是否以及如何执行此操作取决于实际目标的值。
一种选择是在每种构建类型的子目录中都有特定的目标。因此,如果您在顶层执行“make all”,它会查看 COMPILETYPE 并根据需要调用“make all-debug”或“make all-release”。
或者,您可以在顶层设置一个 COMPILETYPE 环境变量,并让每个子 Makefile 处理它。
真正的解决方案是不进行递归 make,而是将 makefile 包含在顶级文件的子目录中。这将使您可以轻松地在与源所在的目录不同的目录中进行构建,因此您可以拥有build_debug和build_release目录。它还允许并行 make 工作(make -j)。有关完整的解释,请参阅递归使被认为有害。