【问题标题】:Make target run before all other rules in Makefile -- redux, GNU Make 4.4使目标在 Makefile 中的所有其他规则之前运行——redux、GNU Make 4.4
【发布时间】:2022-12-10 11:36:12
【问题描述】:

这是一个更新的问题,一个问题的答案,即如何确保 Makefile 中的某个规则在所有其他规则之前运行。多年来我一直很高兴地使用Beta's answer to that question

然而,最近,GNU Make 4.4 发布了。不幸的是,它似乎打破了这个把戏。

我正在使用的示例文件在这里:

all: foo

.PHONY: dummy
dummy:
    echo "Generating"

-include dummy

foo:
    echo "FOO"

使用 GNU Make 4.3,makemake all 的输出是:

echo "Generating"
Generating
echo "FOO"
FOO

使用 GNU Make 4.4 时,输出为:

echo "FOO"
FOO

有人已经想出办法让它再次工作了吗?或者确保首先运行特定规则的不同技巧?

我遇到的现实生活用例是:https://github.com/xoreos/xoreos-tools/blob/master/src/version/rules.mk,即我正在使用它读取 git 版本信息(如果可用)。它被放入一个文件中,但只有在发生实际更改时才会写入文件(这就是 `cmp 的用途),因此实际代码(和库,二进制文件......)只有在有一个实际的变化,而不是在每次调用时。

我已经尝试过:重写它以创建一个实际的 .h 包含文件,然后将其包含在内。不幸的是,当使用生成的文件作为依赖项时,在写入文件的规则运行之前检查文件是否已被触及。所以我不能只在它发生变化时用它来重建其余部分。

【问题讨论】:

    标签: makefile build gnu-make gnu


    【解决方案1】:

    使虚拟目标不是 .PHONY 使其在 GNU Make 4.4 中再次工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多