Makefile:所有vs默认目标

sin*_*ter 9 makefile gnu-make

谈到GNU make,PHONY目标all:与之间的区别是什么default:.

CC=g++
default: hello

hello: hello.cpp
     $(CC) -o hello hello.cpp
Run Code Online (Sandbox Code Playgroud)

CC=g++
all: hello

hello: hello.cpp
     $(CC) -o hello hello.cpp
Run Code Online (Sandbox Code Playgroud)

他们俩都做同样的工作.

tri*_*eee 23

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)
Run Code Online (Sandbox Code Playgroud)

你可以省略上面的任何或所有虚假目标,唯一的区别是人类无法说出make shirley他们(有效)的意思make hello.

底线:构建您的Makefile,以便在make没有读取太多README文件或检查文件的情况下完成合理的最终用户期望Makefile.通常情况下make all(你应该有一个这个名字的目标,只是为了满足人类惯例,即使它不是默认值),但这显然取决于你的项目和用户的期望.

不要叫我雪莉.

  • 指定`.DEFAULT`特殊目标不是**覆盖默认目标的方式.默认目标是makefile中第一个不以'.'开头的规则. - 除非通过指定特殊变量`.DEFAULT_GOAL`来覆盖.要告知读者一个非常长的makefile,最好在makefile中尽早指定.DEFAULT_GOAL或编写一个规则(通常是一个伪规则,如`default:all`,没有配方). (4认同)

Mar*_*eck 5

唯一的区别是allGNU Make 手册中建议将其作为第一个(默认)目标,并且default没有这样的特殊建议。