将 `all` 声明为 .PHONY 的目的?

问题描述 投票:0回答:2

GNU Make 手册描述了 .PHONY 的以下

用例

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
    cc -o prog1 prog1.o utils.o

prog2 : prog2.o
    cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
    cc -o prog3 prog3.o sort.o utils.o

它指出我现在只需调用

make
即可重新制作所有三个程序。这很好,但我可以在不声明
all
作为
.PHONY
的先决条件的情况下实现相同的目标(因为
all
是默认目标)。因此,我的问题是:

all被列为

.PHONY
的先决条件的
唯一
目的是,即使我不小心,在不太可能的情况下,在名为
all
的同一目录中创建一个文件,我仍然可以重新制作所有三个程序?我很想知道还有其他原因吗,谢谢。

makefile gnu-make
2个回答
3
投票

all被列为

.PHONY
的先决条件的
唯一
目的是,即使我不小心,在不太可能的情况下,在名为
all
的同一目录中创建一个文件,我仍然可以重新制作所有三个程序?

你看起来很怀疑,但是是的。这是在该示例中声明

all
为虚假的唯一目的。

正如您链接的手册部分所解释的:

使用虚假目标有两个原因:避免与同名文件发生冲突,以及提高性能。

就是这样。这两个结果都源于

make
不根据目标是否对应于现有文件的名称来调节虚假目标配方的执行,或者如果是,则根据该文件相对于任何先决条件的时间戳来调节。它甚至不寻找这样的文件。这就是宣布目标为虚假的实际效果的全部。

另请注意,尽管在所提供的示例中使用

.PHONY
的优势可能看起来很小,但为什么要防止将名为“all”的文件添加到目录中这种不太可能发生的事件呢? ——我们确实时常会收到因(非)虚假问题而产生的问题。所以,帮自己一个忙,在适当的时候宣布你的目标
.PHONY
。这并不难,而且可能会给您、您的团队或您的客户带来不相称的悲伤。


-1
投票

实际上,因为没有“全部”的秘诀,所以即使不声明为“PHONY”,事情也可以顺利进行。

根据Makefile的规则链,如果有内容发生变化,make all最终会更新目标all的相应先决条件。

不需要将'all'声明为'PHONY',因为我们只是希望目标'all'的先决条件能够及时更新。

© www.soinside.com 2019 - 2024. All rights reserved.