gpt4 book ai didi

makefile - 为什么.PHONY :target and not target:. PHONY?

转载 作者:行者123 更新时间:2023-12-02 19:28:43 30 4
gpt4 key购买 nike

我仍然不明白为什么 Makefile 中的“虚假”规则将“.PHONY”作为其目标。作为先决条件,这会更合乎逻辑。

我需要详细说明这一点吗?如果A依赖于B并且B是假的,那么A也是假的。因此,与 .PHONYB 相​​比,依赖图 .PHONYBA 令人惊讶A。 (另一个论点是 make 的实现必须处理非常特殊的 .PHONY 目标。)

虽然这种批评可能看起来相当理论化(毫无意义)——“既然 make 如此古老,它的语法就留了下来”。但我不建议任何语法更改,还有一个替代方案:

使用 GNU Make(至少),以下 Makefile 声明一个虚假的 target_A:

target_A: _PHONY
touch target_A

_PHONY:
#noop

问题 1:这是如此简单明了,我肯定不是它的第一个发明者。事实上,考虑到这种替代方案,为什么 make 需要特殊语法?

在我看来,这也可以很好地解决有关 wildcards in phony targets 的问题。 ,甚至可以 shed some light on .PHONY's meaning当初学者有疑问时。

问题 2:您能想到这种方法在哪些情况下较差吗? (调用 make .PHONY 有什么用吗?)

(我应该提到,虽然我调用了其他 make,但 GNU Make 是我有一些经验的唯一实现 - 读取和写入 Makefile。)

最佳答案

使用 target_A: .PHONY 的一个大问题是它使得使用许多 make 的内置变量变得更加困难。以这个常见菜谱为例:

%.a: $(OBJ_FILES)
$(LD) $(LFLAGS) -o $@ $^

$^ 变量提取作为先决条件列出的所有内容。如果 .PHONY 也列在那里,那么它将被传递到命令行上的链接器,这可能不会导致任何好的结果。使用像 .PHONY 这样的元目标作为先决条件会使这些内置变量的用处大大降低,因为它们需要大量额外的处理,例如 $(filter-out .PHONY,$^) 每次使用它们时。为了考虑依赖树,反转关系并将 .PHONY 作为目标有点尴尬,但它清理了 makefile 的其余部分。

关于makefile - 为什么.PHONY :target and not target:. PHONY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11586792/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com