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

我需要详细说明吗?如果A依赖于B并且B是假的,则A也是假的。因此,与.PHONYBA相比,依赖图.PHONYBA令人惊讶。 (另一个论点是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的其余部分。

08-25 14:48