【问题标题】:Depend on the make file itself取决于make文件本身
【发布时间】:2010-11-11 02:01:33
【问题描述】:

如果 Makefile 本身发生更改,安全的做法是认为所有目标都已过期。

有没有一种巧妙的方法来添加这种依赖关系?有其他选择吗?

【问题讨论】:

  • 不久前我问过同样的问题:stackoverflow.com/questions/3871444/…
  • 奇怪的是它没有出现在搜索中,甚至没有相关性。
  • 这可能还不够。当变量发生变化时会发生什么? (例如,您可能需要在make CDEFS=debugmake CDEFS=release 之间进行clean。)

标签: makefile gnu-make


【解决方案1】:

确保目标文件依赖于 makefile:

$(OBJFILES) : Makefile

Makefile 是 make 文件的名称。

【讨论】:

  • 我想我需要自己填充 SRCFILES?
  • 是的。我的问题可能听起来有点自大,但我的意思是你想要从替代解决方案中获得什么样的属性。我不知道如何依赖“每个目标”。
【解决方案2】:

一个安全的赌注,但一个糟糕的主意。示例:您正在使用 automake 并更新 Makefile.am 以添加单个源文件。正确的做法是只编译新文件并将其链接。在您的方案中,所有内容都将被重建。

此外,除非您触摸文件,否则添加依赖项不会做任何事情,例如:

$(SRCS): Makefile
    touch $@

这会导致使用 mtime 检测并发修改的编辑器出错(emacs 就是一个例子)。

如果您正在做一些重要的事情,只需在更改后运行make clean all

【讨论】:

  • 我不认为来源不会更新。但是如果所有的 targets 都依赖于 Makefile 怎么办? +1 提出一个好观点。
  • @Matt Joiner:它会起作用(您还必须包括所有包含的 .mk 文件的传递闭包),但您仍然需要进行多余的重新编译,通常情况下。最好不要打扰:然后默认情况下您会进行短构建,并且可以在需要时进行完整构建。如果你把它放进去,如果你只做了一个小的调整,你就无法进行简短的构建。我知道你做了很多 C++ 的东西。您不能认真建议完全重建 C++ 项目的成本很小吗?
  • 为什么你必须触摸 Makefile?该规则仅在 Makefile 已经比目标文件更新时运行。
  • 它没有触及Makefile。它正在触及源文件。如果不碰源文件,它会一直认为源过期,也就是说每次调用make都会重新编译。
  • 不,不,不。在使用automake 时,您不要使用这样的依赖!我很少对答案投反对票,尤其是提问者选择的答案,但这是一个糟糕的答案。对于使用自定义 Makefile 的项目,这是一个有效的问题。就个人而言,我尽量避免这种情况,并尽可能使用autotools,但我现在有一个项目,但这是不可行的。
【解决方案3】:

由于 GNU make 版本 4.3 现在可以使用这两个 special variable:

  1. .EXTRA_PREREQS
    • 为每个目标添加新的先决条件
  2. MAKEFILE_LIST
    • 获取make文件的路径

让每个目标都依赖于当前的 make 文件:

将以下行放在文件顶部附近(在任何包含之前,因为它会影响 MAKEFILE_LIST):

.EXTRA_PREREQS:= $(abspath $(lastword $(MAKEFILE_LIST)))

让每个目标都依赖于当前的 make 文件以及包含的 make 文件

将以下行放在文件末尾:

    .EXTRA_PREREQS+=$(foreach mk, ${MAKEFILE_LIST},$(abspath ${mk}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2015-08-26
    • 2021-04-09
    • 2011-05-25
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多