如果没有指定目标,“make”应用程序如何知道要构建的默认目标?

Posted

技术标签:

【中文标题】如果没有指定目标,“make”应用程序如何知道要构建的默认目标?【英文标题】:How does "make" app know default target to build if no target is specified? 【发布时间】:2011-01-04 16:30:22 【问题描述】:

大多数 Linux 应用程序编译时使用:

make
make install clean

据我了解,make 命令将构建目标的名称作为参数。所以例如install 通常是一个将一些文件复制到标准位置的目标,clean 是一个删除临时文件的目标。

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

【问题讨论】:

【参考方案1】:

bmake 相当于 GNU Make 的 .DEFAULT_GOAL.MAIN

$ cat Makefile
.MAIN: foo

all:
    @echo all

foo:
    @echo foo
$ bmake
foo

请参阅bmake(1) manual page。

【讨论】:

【参考方案2】:

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

参考:The Gnu Make manual - Special Variables

【讨论】:

【参考方案3】:

默认情况下,它首先处理第一个不以. aka the default goal 开头的目标;为此,它可能必须处理其他目标 - 特别是第一个目标所依赖的目标。

GNU Make Manual 涵盖了所有这些内容,阅读起来非常简单且内容丰富。

【讨论】:

调用第一个目标all只是一个约定。 如果您为其他用户安装,单独运行它们很有用,因为您只需要在 sudo 中运行 make install,而不是整个构建。 仅供参考,make 的默认 man 条目没有提及当您不指定目标时会发生什么.. 如果 GNU make 手册涵盖了这些东西,为什么要问这个问题?该手册非常擅长记录如何编写规则,但没有提及如何编写 Makefile。 我正在查看 includes 另一个 makefile 的 make 文件,其第一个目标是 %.o : %.cpp。所以默认目标是……构建所有的.cpp文件?【参考方案4】:

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

.DEFAULT_GOAL := mytarget

如果执行“make”但未指定目标,则 mytarget 现在将成为运行的目标。

如果您有旧版本的 make (

.PHONY: default
default: mytarget ;

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

【讨论】:

@nathan 如果有人在没有任何参数的情况下运行“make”,它会使 mytarget 成为默认目标。 请注意 .DEFAULT_GOAL 在 GNU make v3.80 中似乎不受支持,我也假设以前的版本(不过 v3.81 确实支持它)。如果您运行的是旧版本的 make,则必须确保默认目标是 make 文件中的第一个/最顶层目标。 default: 一个特殊的目标名称,或者这是因为它是文件中的第一个目标? “...让他们免于阅读手册”是 SO 的要点之一:快速回答在古代文献中需要一段时间才能挖掘的问题。 这应该是正确的答案。在这种情况下,显式胜过隐式胜出。

以上是关于如果没有指定目标,“make”应用程序如何知道要构建的默认目标?的主要内容,如果未能解决你的问题,请参考以下文章

Cmake 中的可选目标

如何调试makefile

调试 GNU make

找出生成文件的预期目标系统

make: *** 没有指明目标并且找不到 makefile。 停止

linux 源代码程序终端安装make后出现 make: *** 没有指明目标并且找不到 makefile。 停止。