我仍然不明白为什么Makefile中的“ phony”规则将“ .PHONY”作为目标。作为前提条件,这将更加合乎逻辑。
我需要详细说明吗?如果A
依赖于B
并且B
是假的,则A
也是假的。因此,与.PHONY
→B
→A
相比,依赖图.PHONY
←B
→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的其余部分。