9

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

我必须详细说明这一点吗?如果A依赖B并且B是假的,那么A也是假的。所以依赖图.PHONY←<code>B→<code>A 与 →<code>B→<code>A 相比是非常令人惊讶.PHONY的。(另一个论点是make必须处理.PHONY非常特殊的目标。)

虽然这种批评可能看起来相当理论化(毫无意义) - “既然 make 是如此古老,它的语法就在这里留下来”。但我不建议任何语法更改,还有另一种选择:

使用 GNU Make(至少),以下 Makefile 声明了一个 phony target_A

target_A: _PHONY
        touch target_A

_PHONY:
        #noop

问题 1这很简单,很干净,我肯定不是它的第一个发明者。事实上,考虑到这种选择,为什么make需要特殊语法?

在我看来,这也可以很好地解决有关虚假目标中通配符的问题,甚至可以在初学者怀疑时阐明 .PHONY 的含义。

问题2您能想到这种方法劣势的任何情况吗?(调用make .PHONY有什么用吗?)

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

4

1 回答 1

4

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

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

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

于 2012-07-20T22:35:19.157 回答