为什么.PHONY:目标而不是目标:.PHONY?

时间:2012-07-20 20:52:05

标签: makefile gnu-make target

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

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

虽然这种批评似乎相当理论化(毫无意义) - “因为制作是如此古老,它的语法就在这里”。但我不建议任何语法更改,还有另一种选择:

使用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。)

1 个答案:

答案 0 :(得分:3)

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

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

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

相关问题