如果没有指定目标,"make"app如何知道要构建的默认目标?

gri*_*yvp 163 makefile

大多数linux应用程序都使用以

make
make install clean
Run Code Online (Sandbox Code Playgroud)

据我所知,make将构建目标的名称作为参数.所以install是一个目标是复制一些文件,之后clean是一个目标即删除临时文件.

但是make如果没有指定参数,会构建什么目标(例如我的例子中的第一个命令)?

小智 213

默认情况下,它首先处理不以'.'开头的第一个目标.又名默认目标 ; 要做到这一点,它可能必须处理其他目标 - 特别是第一个目标依赖的目标.在GNU使手册涵盖了所有这些东西,是一个非常容易和信息读取.

  • 调用第一个目标`all`只是一个约定. (53认同)
  • 不,不是目标'全部'. (3认同)
  • 仅供参考,make 的默认 man 条目没有提及当您未指定目标时会发生什么。 (3认同)
  • 如果 GNU make 手册涵盖了这些内容,为什么会问这个问题?该手册非常擅长记录如何编写规则,但没有提及如何编写 Makefile。 (2认同)

Sam*_*uel 156

为了节省其他人几秒钟,并保存他们不必阅读手册,这里是简短的答案.将其添加到make文件的顶部:

.DEFAULT_GOAL := mytarget
Run Code Online (Sandbox Code Playgroud)

如果执行"make"并且未指定目标,则mytarget现在将成为运行的目标.

如果你有一个旧版本的make(<= 3.80),这将无效.如果是这种情况,那么您可以执行anon提到的操作,只需将其添加到make文件的顶部:

.PHONY: default
default: mytarget ;
Run Code Online (Sandbox Code Playgroud)

参考文献:https: //www.gnu.org/software/make/manual/html_node/How-Make-Works.html

  • "......以免他们不必阅读手册"是SO的要点之一:快速回答在古代文档中需要花费一些时间来挖掘的问题. (4认同)
  • @nathan 如果有人在不带任何参数的情况下运行“make”,它会使 mytarget 成为默认目标。 (2认同)
  • 这应该是正确的答案.在这种情况下显式隐式胜利. (2认同)

San*_*rya 32

GNU Make还允许您使用名为.DEFAULT_GOAL的特殊变量指定默认的make目标.您甚至可以在makefile的中间取消设置此变量,从而使文件中的下一个目标成为默认目标.

非常有趣,但深奥的东西.但我同意那里的东西 - gnu make手册非常易读.你可能认为你不需要知道其中的大部分东西,但是一旦你看到一个非常全面的东西,你会非常感谢你能用它做的一些非常奇特的东西 - 字符串操作,文件/目录函数,等等

参考:Gnu制作手册 - 特殊变量