【问题标题】:Automake rebuild source file if Makefile changes如果 Makefile 更改,则自动重建源文件
【发布时间】:2011-07-01 17:27:11
【问题描述】:

使用 autoconf/automake 构建系统时,如果 Makefile.am(甚至更高级别,如 configure.ac)中的编译器标志或其他变量发生更改,与该 Makefile 关联的 C++ 源文件将不会自动重新构建。这变得尤为重要,因为我们将 automake 用作仅根据需要重新编译的持续构建系统的一部分。

我的想法是包含 Makefile 作为 .o 文件的依赖项,理论上可以解决上述问题。所以有几个问题:

首先,是否可以添加这样的规则?我宁愿不必将自定义规则添加到每个 Makefile.am,因此可以放入顶级文件(如 configure.ac)的东西会很棒。

其次,这种方法的缺点是在某些情况下,对 Makefile 的更改实际上并不会影响编译,因此我最终会在不需要时重新构建。我想我愿意忍受这个(或者至少尝试一下看看它有多痛苦),以便更好地保证我的构建是正确的,但是有没有更好的方法来解决这个问题?我相信 clearmake 通过保存实际的编译器命令(以及其他依赖项)然后将当前命令与之前的命令进行比较以确定是否需要重新生成文件来解决这个问题。

【问题讨论】:

  • 根据更改的 makefile 变量重新构建东西是错误的,因为它会破坏像 make install prefix=/some/other/prefix 这样的东西,这对于像 GNU stow 这样的工具来说是必需的。
  • @JackKelly 我可以看到这通常是一件坏事,但对于像 AM_CPPFLAGS 这样的特定标志的更改似乎需要重建。例如,如果我从包含.../somelib-v2 更改为.../somelib-v3,则肯定需要重新编译代码。如果我能获得实际的 Makefile* 更改以强制重新编译,我愿意放弃命令行变量设置。

标签: c++ automake rebuild


【解决方案1】:

如果您使用 ccache(./configure CXX='ccache g++',或者只是将 ccache 的 g++ 添加到路径中),虚假重建应该非常便宜且仍然安全。还要确保永远不要使用 AM_MAINTAINER_MODE autoconf 宏,它使依赖项跟踪成为可选(以 --enable-maintainer-mode 标志为条件)。

【讨论】:

  • 感谢您的指针。似乎只有在makefile规则会调用编译器时才会调用ccache?所以在我更改构建标志并且 automake 没有检测到需要重建的情况下,ccache 仍然有帮助吗?抱歉,如果我对 ccache 的适应方式感到困惑。
  • @Nathan 是的,您仍然需要一些规则来使 *.o 依赖于 Makefile。
  • 感谢您的澄清。我将把这个问题标记为未回答,希望有人可以为我的这部分问题提供答案。
  • --enable-maintainer-mode 不会禁用依赖跟踪,--disable-dependency-tracking 就是这样做的。维护者模式只控制重建规则(处理 lex/yacc 定义,重建Makefile.in,等等):gnu.org/s/hello/manual/automake/maintainer_002dmode.html
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 2010-09-22
  • 2011-08-06
  • 2018-07-03
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
相关资源
最近更新 更多