我仍然不明白为什么Makefile中的“假冒”规则将“.PHONY”作为目标。它作为先决条件会更合乎逻辑。
我需要详细说明吗?如果A
取决于B
且B
是虚假的,那么A
也是虚假的。因此,与.PHONY
→B
→A
相比,依赖关系图.PHONY
←B
→A
令人惊讶。 (另一个论点是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。)
答案 0 :(得分:3)
使用target_A: .PHONY
的一个大问题是它使得使用许多make的内置变量变得更加困难。以这个常见的食谱为例:
%.a: $(OBJ_FILES)
$(LD) $(LFLAGS) -o $@ $^
$^
变量会将所有列为先决条件。如果.PHONY
也被列在那里,那么它将被传递到命令行上的链接器,这可能不会导致任何好的事情发生。使用.PHONY
之类的元目标作为先决条件会使这些内置变量显着降低其用处,因为每次使用它们都需要进行大量额外处理,如$(filter-out .PHONY,$^)
。为了考虑依赖树,反转关系而不是使.PHONY
目标有点尴尬,但它会清理makefile的其余部分。