2012-07-20 76 views
7

我还是不明白为什么Makefiles中的“假冒”规则有“.PHONY”作为他们的目标。作为先决条件将更合乎逻辑。为什么.PHONY:目标而不是目标:.PHONY?

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

尽管这种批评可能看起来相当理论化(毫无意义) - “因为make是如此古老,它的语法在这里停留”。但我不建议任何语法变化,还存在另一种:

随着GNU使(至少),下面的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 S,GNU提出的是,我有一些经验与唯一实现 - 读,写Makefile文件)

+0

(应该有RTFM)实际上GNU Make手册[提到这个配方](http://www.gnu.org/software/make/manual/html_node/Force-Targets.html#Force-Targets)高效,但更便携。我猜想速度增益是可以忽略不计的。这表明对问题2的否定答案。(?) – tiwo 2012-07-20 21:25:02

回答

3

使用target_A: .PHONY时遇到的一个大问题是,它使得使用许多make的内置变量要困难得多。就拿这个共同的食谱作为例子:

%.a: $(OBJ_FILES) 
    $(LD) $(LFLAGS) -o [email protected] $^ 

$^可变拉进一切,列出的一个先决条件。如果.PHONY也在那里列出,那么它将被传递给命令行上的链接器,这可能不会导致任何事情发生。使用像.PHONY这样的meta-targets作为先决条件使得这些内置变量的用处明显不足,因为每次使用它们时都需要大量额外的处理,如$(filter-out .PHONY,$^)。为了考虑依赖关系树,反转关系并改为使目标有点尴尬,但是它清除了makefile的其余部分。

+0

哦,我明白了。 [其他“特殊”目标“的存在)(http://www.gnu.org/software/make/manual/html_node/Special-Targets。html#Special-Targets) - 包括一些根本不适合(依赖语义)的依赖关系图 - 似乎减轻了“为什么这么特别”的反对意见。 – tiwo 2012-07-20 22:50:44

相关问题