Makefile:所有vs默认目标

时间:2014-12-02 06:04:50

标签: makefile gnu-make

谈到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 个答案:

答案 0 :(得分:23)

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

有一个约定有一个名为all的目标可以构建所有内容,但这只是人类约定,而不是特殊情况或者就Make而言是一个要求。

类似地,有一个(弱)约定来调用默认目标default,但同样地,这只是一个人类标签(有些重叠,可能与all约定冲突)。< / p>

所以下面的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(并且您应该有一个具有此名称的目标,只是为了满足人类约定,即使它不是默认值)但这显然取决于您的项目和用户的期望。

  

不要叫我雪莉。

答案 1 :(得分:2)

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

请注意,在上面的示例中,两个目标都不是虚假的。你必须这样声明它们:

.PHONY: all

答案 2 :(得分:1)

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