2014-12-02 2953 views
6

谈到GNU make时,PHONY目标all:default:之间有什么区别。Makefile:所有与默认目标

CC=g++ 
default: hello 

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

CC=g++ 
all: hello 

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

他们都做同样的工作。

回答

13

,如果你喜欢,你可以打电话给他们shirley;你提到的标签都没有任何特殊的语义。如果您没有将目标指定为命令行参数,则默认行为make将运行Makefile中的第一个目标。如果您想要覆盖此行为,则有.DEFAULT:特殊目标。

有一个约定有一个名为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能够完成合理的最终用户所期望的操作,而不会读取太多的文件或检查Makefile文件或检查文件或检查Makefile文件或检查Makefile。通常情况下,这将是make all(为了满足人们的习惯,即使它不是默认设置,你也应该有一个这个名字的目标),但这显然取决于你的项目和用户的期望。

别叫我雪莉。

+4

指定'.DEFAULT'特殊目标是**不是**重写默认目标的方法。默认目标是makefile中不是以'。'开头的第一条规则。 - 除非通过指定特殊变量'.DEFAULT_GOAL'来覆盖。为了通知读者很长的makefile文件,最好在makefile文件的早期指定.DEFAULT_GOAL或者编写一个规则(通常是一个虚拟的规则,比如'default:all',没有配方)。 – 2017-02-28 12:51:39

+0

@DavidHammen我同意你的最终结论。但是,我认为'.DEFAULT_GOAL'黑客主要是应该避免的深奥后门,并且[手册](https://www.gnu.org/software/make/manual/html_node/Special-Variables。 HTML)如何使用它的例子肯定会强化这种印象。 – tripleee 2017-02-28 13:20:45

1

一个拼写为“all”,另一个拼写为“default”。他们之间没有其他区别。也许如果你解释了为什么你问我们可以提供更多帮助。

请注意,在您的示例中,上述两个目标都不是真正的假。你必须把他们定义为这样:

.PHONY: all 

+0

雅,我没有将它们指定为'PHONY',但是那两个关键字是用来表示相同的东西?这不是很奇怪,为什么任何人需要另一个,如果已经存在? – sinister 2014-12-02 06:22:23

+0

@qwerty查看tripleee的回答:'all'和'default'规则没有特别的含义,它们是常规规则的常规名称。 – Dettorer 2014-12-02 08:52:06

0

唯一的区别是,all在GNU建议进行手动,成为第一个(默认)目标,并default没有这样的特别推荐。