【问题标题】:Creating nested makefile创建嵌套的makefile
【发布时间】:2009-04-07 03:42:22
【问题描述】:

我正在学习makefiles,我知道如何创建一个简单的makefile。我将继续使用嵌套的 makefile。这是我的目录结构

/src
...makefile
...main.cpp
...foo
......makefile
......foo.cpp
......foo.h

当调用root makefile 时,它会调用目录foo 中的makefile。这是我的问题

  1. 我应该使用哪个 makefile 来编写链接所有目标文件的代码?如果它在根 makefile 中,我需要在那里指定所有目标文件名吗?
  2. 这种嵌套的 makefile 是最佳实践吗?还是只有一个根目录下的 makefile 好不好?

任何帮助都会很棒!

【问题讨论】:

    标签: makefile nested


    【解决方案1】:

    这样做有很多话要说。阅读Recursive Make Considered Harmful。也在PDF form

    简短的版本是递归 make 有效地构建了几个不相交但可能重叠的依赖树,并且不能保证正确或最大效率的构建。如果您希望并行构建,问题会变得更糟。

    为了解决这个问题,你安排了一个单一的、非递归的 make,它构建了一个单一的全跨依赖树,它允许 make 解决上述所有问题。

    非递归构造的示例结构和编写它们时遇到的几个棘手问题的解决方案可以在原始论文和以下答案中找到:

    【讨论】:

    • 如果不这样做是个坏主意,也许应该建议替代解决方案作为答案。
    • 是的。这个答案的形式在网站上不再可接受。编辑只是部分修复了缺陷,但它是一些东西。
    【解决方案2】:

    递归生成通常被认为是有害的。

    如果您真的希望能够在根目录中键入“make”并让它只使用 POSIX makefile 构建所有内容,那么这是唯一的方法。在这种情况下,将子项目链接到它们自己的目录中,最后将它们放在根目录中。

    如果您愿意使用 gmake 语法,请查看此处的 Makefile:http://github.com/singpolyma/theveeb-ecosystem

    【讨论】:

    • 您可以使用 POSIX(非 GNU)make 通过将其分为两个步骤来执行非递归构建:1)连接所有子目录中的所有 make.inc 文件; 2)运行生成的makefile。但是大多数人还是使用 GNU make,它有“include”指令。
    • 啊,那是真的,我从来没有想过串联黑客。我倾向于使用包含。通常我想要非常 POSIX,但是由于没有包含指令,有时使用 makefile 会有点麻烦:)
    【解决方案3】:

    有更现代的构建系统,例如SCons,它们的语法比 make 更简单,并且避免了许多 make 的陷阱。例如 SCons 扫描源文件以确定它自己的依赖关系,而对于 make 需要手动指定依赖关系。如果你例如向实现文件添加新的#include 语句,如果标头更改,make 将不会重新编译该实现文件(除非您添加新的依赖项)。 SCons 会自动检测新的依赖并重新编译任何必要的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多