从源代码构建软件
make 实用程序自动确定需要重新编译大型程序的哪些部分,并发出重新编译它们的命令。
该手册描述了由 jack Stallman 和 Roland McGrath 编写的 make 的 GNU 实现。
make 实用程序不仅限于程序。
我们可以使用它来描述某些文件必须在其他文件发生更改时从其他文件自动更新的任何任务。
make 命令最常用于从源代码构建软件的通用过程中。
如何在 Linux 中使用 Make 命令
这是如何在 Linux 上使用 make 命令的常见示例。
通常,这是从源代码构建开源应用程序的简单三步过程的一部分。
- 安装 Git(如果没有)以及软件构建工具。
apt install git build-essential
- 选择要使用的应用程序,或者下载 VLC。
apt build-dep vlc
- 克隆 VLC 源代码。
git clone https://github.com/videolan/vlc.git
- 将目录更改为克隆的 VLC 源代码,然后运行配置脚本。
cd vlc ./bootstrap ./configure
- 运行带有 -j 标志的 make 命令,然后是系统拥有的 CPU 内核/线程数。
make -j4
- 这需要一些时间才能完成。完成后,使用 make install 安装应用程序。
sudo make install
通常情况下,这就是我们看到 make 命令使用的方式。
可能有比这更复杂的程序或者一些细微的变化,但它永远不会太复杂。
make 实用程序的语法和准备
make 实用程序的语法是
make [ -f makefile ] [ option ] ... target ...
要准备使用 make,我们必须编写一个名为 makefile 的文件,该文件描述程序中文件之间的关系并说明更新每个文件的命令。
通常,可执行文件是从目标文件更新而来,而目标文件又是通过编译源文件生成的。
一旦存在合适的 makefile,每次更改某些源文件时,shell 命令 make 就足以执行所有必要的重新编译。
make 程序使用 makefile 数据库和文件的最后修改时间来决定哪些文件需要更新。
对于这些文件中的每一个,它都会发出记录在数据库中的命令。
make 实用程序执行 makefile 中的命令以更新一个或者多个目标名称,其中名称通常是一个程序。
如果不存在 -f 选项,则 make 会按顺序查找 makefile GNUmakefile 、 makefile 和 Makefile 。
通常你应该调用 makefile 或者 makefile 或者 Makefile 。
(建议我们使用 Makefile,因为它显眼地出现在目录列表的开头附近,靠近其他重要文件,例如 README。
)大多数 makefile 不推荐使用第一个名称检查的 GNUmakefile。
仅当 makefile 特定于 GNU make 并且其他版本的 make 无法理解时才使用此名称。
如果 makefile 是 ,则读取标准输入。
如果目标取决于自上次修改目标后已修改的准备工作文件,或者目标不存在,则 make 实用程序会更新目标。
Make 实用程序的选项
-b 和 -m 选项被忽略以与其他版本的 make 兼容。
-C dir 在读取 makefile 或者执行其他任何操作之前更改为目录 dir。
如果指定了多个 -C 选项,则每个选项都相对于前一个选项进行解释: -C/-C etc 等效于 -C /etc 。
这通常与 make 的递归调用一起使用。
-d 选项除了正常处理外还打印调试信息。
调试信息说明正在考虑重新制作哪些文件,正在比较哪些文件时间以及哪些结果,哪些文件需要重新制作,以及考虑哪些隐式规则以及应用哪些。
-e 选项使从环境中获取的变量优先于来自 makefile 的变量。
-f 文件选项将文件用作生成文件。
-i 选项忽略为重新制作文件而执行的命令中的所有错误。
-I dir 选项指定用于搜索包含的 makefile 的目录 dir。
如果使用多个 -I 选项指定多个目录,则按指定的顺序搜索目录。
与 make 的其他标志的参数不同,带有 -I 标志的目录可能直接出现在标志之后: -Idir 和 -I dir 是允许的。
允许此语法与 C 预处理器的 -I 标志兼容。
-j 作业选项指定要同时运行的作业(命令)的数量。
如果有多个 -j 选项,则最后一个有效。
如果在没有参数的情况下提供 -j 选项,则 make 不会限制同时运行的作业数。
-k 选项在出错后尽可能继续。
失败的目标,以及依赖它的目标,无法重造。
但是,这些目标的其他依赖项可以完全相同地处理。
-l 和 -l 负载选项指定如果有其他作业正在运行,则不应启动新作业(命令),并且平均负载至少为负载(浮点数)。
没有参数,它删除了以前的负载限制。
-n 选项打印将要执行的命令,但不执行它们。
-o 文件选项不会重新制作文件,即使它比其依赖项旧,并且不会因文件中的更改而重新制作任何内容。
本质上,该文件被视为旧文件,其规则被忽略。
-p 选项打印从读取 makefile 产生的数据库(规则和变量值)。
然后它照常执行或者按其他规定执行。
这也会打印 -v 开关给出的版本信息(见下文)。
要在不尝试重新制作任何文件的情况下打印数据库,请使用 make -p -f/dev/null 。
-q 选项设置问题模式。
它不运行任何命令或者打印任何内容。
如果指定的目标是最新的,则返回一个退出状态为零,否则返回非零。
-r 选项消除了内置隐式规则的使用。
它还清除后缀规则的默认后缀列表。
-s 选项使操作静音。
它不会在执行命令时打印命令。
-S 选项取消 -k 选项的效果。
这不是必需的,除非在递归 make 中 -k 可能通过 MAKEFLAGS 从顶级 make 继承,或者如果我们在环境中的 MAKEFLAGS 中设置 -k。
-t 选项涉及文件(将它们标记为最新而不更改它们)而不是运行它们的命令。
这用于假装命令已完成,以欺骗将来的 make 调用。
-v 选项打印 make 程序的版本以及版权、作者列表和没有保证的通知。
-w 选项在其他处理之前和之后打印一条包含工作目录的消息。
这对于从递归 make 命令的复杂嵌套中查找错误可能很有用。
-W 文件选项假装目标文件已被修改。
当与 -n 标志一起使用时,这会显示如果我们要修改该文件会发生什么。
没有 -n ,几乎和在运行 make 之前在给定文件上运行 touch 命令一样,只是修改时间只是在 make 的想象中改变。