Makefile: all与default目标的区别

19

就GNU make而言,PHONY目标和all:default:有何区别?

CC=g++
default: hello

hello: hello.cpp
     $(CC) -o hello hello.cpp

CC=g++
all: hello

hello: hello.cpp
     $(CC) -o hello hello.cpp

它们两个都完成相同的工作。

3个回答

41
你可以称它们为"shirley",如果你愿意;你提到的标签都没有特殊的语义。如果你不在命令行参数中指定目标,make的默认行为是运行Makefile中的第一个目标。如果你想覆盖这个行为,可以使用.DEFAULT_GOAL这个特殊变量。
通常约定的做法是有一个名为all的目标来构建所有内容,但这只是人为的约定,并不是Make所关心的特殊情况或要求。
类似地,有一个(弱)约定将默认目标称为default,但同样,这只是一个人为的标签(可能与all约定有重叠和冲突)。
所以下面的Makefile实际上做的是同样的事情:
.PHONY: shirley all default
default: hello
all: hello
shirley: hello

hello: hello.cpp
# (Make already knows how to build an executable out of a .cpp file)

你可以忽略上面的任何或所有虚假目标,唯一的区别是人们将无法说“make shirley”,而实际上他们是指“make hello”。
底线是:构建你的Makefile,使得make命令能够按照合理的最终用户的期望工作,而不需要阅读太多的README文件或检查Makefile。通常情况下,这将是“make all”(你可能应该有一个名为all的目标,以满足人类的约定,即使它不是默认的),但这显然取决于你的项目和用户的期望。
别叫我Shirley。

11
指定.DEFAULT特殊目标不是覆盖默认目标的方法。默认目标是Makefile中第一个不以点号开头的规则,除非指定了特殊变量.DEFAULT_GOAL覆盖它。为了告知读者一个非常长的Makefile,最好要么指定.DEFAULT_GOAL,要么在Makefile开头编写一个规则(通常是一个名为default: all的虚拟规则,没有配方)。 - David Hammen
1
@DavidHammen 我同意你的最终结论。然而,我认为.DEFAULT_GOAL黑客攻击主要是一种玄学后门,也许应该避免使用,手册中关于如何使用它的示例肯定会加强这种印象。 - tripleee
@DavidHammen我已经建议了一个编辑;.DEFAULT特殊目标显然是另一回事。 - undefined

7
唯一的区别是在GNU Make手册中,建议将all作为第一个(默认)目标,而default没有这样的特殊推荐。

4
一个拼写为“all”,另一个拼写为“default”。它们之间没有其他区别。也许如果你解释一下为什么要问,我们就能更好地帮助你。
请注意,在您上面的示例中,两个目标都不是虚假的。您必须将它们声明为虚假的。
.PHONY: all

etc.


是的,我没有将它们指定为“PHONY”,但这两个关键字是否意味着相同的事情?那不是很奇怪吗?如果已经存在一个,为什么还需要另一个? - Piyush Deshmukh
1
@qwerty 请看tripleee的回答:alldefault规则没有特殊含义,它们只是普通规则,有普通的名称。 - Dettorer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接