命令行手册

Man » make 手册在线 - make 手册页的详细在线文档

🌍
make - GNU Make 实用程序,用于维护程序组

概要

make [选项]... [目标]...

描述

make 实用程序将自动确定大型程序中的哪些部分需要重新编译,并发出重新编译它们的命令。手册描述了 GNU 版本的 make,该版本由 Richard Stallman 和 Roland McGrath 编写,目前由 Paul Smith 维护。我们的示例显示了 C 程序,因为它们非常常见,但你可以将 make 与任何编程语言一起使用,只要该语言的编译器可以通过 shell 命令运行。事实上,make 不限于程序。你可以使用它来描述任何任务,只要某些文件可以从其他文件自动更新,每当其他文件发生更改时。

要准备使用 make,你必须编写一个名为 makefile 的文件,该文件描述了程序中文件之间的关系,并提供了用于更新每个文件的命令。在程序中,通常可执行文件是从目标文件更新的,而目标文件则通过编译源代码文件来创建。

一旦存在合适的 makefile,每次你更改一些源代码文件时,只需使用以下简单的 shell 命令:

make

就可以执行所有必要的重新编译。make 程序使用 makefile 描述和文件的上次修改时间来确定哪些文件需要更新。对于这些文件中的每一个,它都会发出在 makefile 中记录的命令。

make 执行 makefile 中的命令以更新一个或多个目标,其中目标通常是一个程序。如果没有指定 -f 选项,make 将按以下顺序查找 makefile 文件:GNUmakefile、makefile 和 Makefile。

通常,你应该将你的 makefile 命名为 makefile 或 Makefile。(我们建议使用 Makefile,因为它在目录列表的开头附近出现,与 README 等其他重要文件一起。)第一个名称 GNUmakefile 不建议用于大多数 makefile。你应该使用此名称,如果有一个 makefile 专门用于 GNU Make,并且其他版本的 make 无法理解它。如果 makefile 是“-”,则读取标准输入。

make 更新一个目标,如果它依赖于自目标上次修改以来已修改的预要求文件,或者如果目标不存在。

选项

-b, -m

这些选项是为了与其他版本的 make 兼容而忽略的。

-B, --always-make

无条件地构建所有目标。

-C 目录, --directory=目录

在读取 makefile 或执行任何其他操作之前,更改到目录目录。如果指定了多个 -C 选项,则每个选项都相对于前一个选项进行解释:-C / -C 等效于 -C /etc。这通常与 make 的递归调用一起使用。


-d   除了正常处理之外,还打印调试信息。调试信息显示正在考虑重新构建哪些文件,正在比较哪些文件的修改时间以及比较结果,哪些文件实际上需要重新构建,哪些隐式规则被考虑以及哪些规则被应用——所有关于 make 如何决定执行的操作的有趣信息。

--debug[=FLAGS]
除了正常处理之外,还打印调试信息。如果省略了 FLAGS,则行为与指定 -d 时相同。FLAGS 可以是以下名称中的任意一个或多个,用逗号或空格分隔。仅第一个字符有意义;其余字符可以省略。all 表示所有调试输出(与使用 -d 相同),basic 表示基本调试,verbose 表示更详细的基本调试,implicit 表示显示隐式规则搜索操作,jobs 表示显示命令调用的详细信息,makefile 表示在重新构建 makefile 时进行调试,print 显示所有运行的配方,即使它们是静默的,why 显示 make 决定重新构建每个目标的原因。使用 none 可以禁用所有以前的调试标志。

-e, --environment-overrides
使从环境中获取的变量优先于从 makefile 中获取的变量。

-E string, --eval string
在解析任何 makefile 之前,使用 eval 函数来解释字符串。

-f file, --file=file, --makefile=FILE
将 file 用作 makefile。

-i, --ignore-errors
忽略在执行以重新构建文件的命令中发生的所有错误。

-I dir, --include-dir=dir
指定一个目录 dir 来搜索包含的 makefile。如果使用多个 -I 选项来指定多个目录,则这些目录将按指定的顺序搜索。与 make 的其他标志的参数不同,使用 -I 标志给出的目录可以直接跟在标志之后:-Idir 也是允许的。这种语法是为了与 C 预处理器的 -I 标志兼容。

-j [jobs], --jobs[=jobs]
指定同时运行的作业(命令)数量。如果存在多个 -j 选项,则最后一个有效。如果给出了带有参数的 -j 选项,make 将不会限制可以同时运行的作业数量。

--jobserver-style=style
要使用的作业服务器的样式。样式可以是 fifo、pipe 或 sem(仅限 Windows)。

-k, --keep-going
在发生错误后,尽可能地继续。虽然失败的目标以及依赖于它的目标无法重新构建,但这些目标的其余依赖项仍然可以处理。

-l [load], --load-average[=load]
指定如果还有其他作业正在运行并且系统负载至少为 load(一个浮点数),则不应启动新的作业(命令)。如果没有提供参数,则会删除以前的负载限制。

-L, --check-symlink-times
使用符号链接和目标之间的最新修改时间。

-n, --just-print, --dry-run, --recon
打印将要执行的命令,但不执行它们(在某些情况下除外)。

-o file, --old-file=file, --assume-old=file
即使文件 file 比其依赖项旧,也不重新构建该文件,并且不因文件中的更改而重新构建任何内容。本质上,该文件被视为非常旧的文件,并且其规则将被忽略。

-O[type], --output-sync[=type]
当使用 -j 运行多个并行作业时,确保每个作业的输出被收集在一起,而不是与其他作业的输出交错。如果未指定 type 或 type 为 target,则将每个目标的整个配方的输出组合在一起。如果 type 为 line,则将配方中每个命令行的输出组合在一起。如果 type 为 recurse,则将整个递归 make 的输出组合在一起。如果 type 为 none,则禁用输出同步。

-p, --print-data-base
打印从读取 makefile 中产生的数据库(规则和变量值);然后按照通常的方式或以其他方式执行。这还会打印 -v 选项给出的版本信息(参见下文)。要打印数据库而不尝试重新构建任何文件,请使用 make -p -f/dev/null。

-q, --question
“提问模式”。不运行任何命令,也不打印任何内容;仅返回一个退出状态,如果指定的target已经是最新的,则返回零,否则返回非零。

-r, --no-builtin-rules
消除对内置隐式规则的使用。同时清除后缀规则的默认后缀列表。

-R, --no-builtin-variables
不定义任何内置变量。

-s, --silent, --quiet
静默操作;不打印正在执行的命令。

--no-silent
取消 -s 选项的效果。

-S, --no-keep-going, --stop
取消 -k 选项的效果。

-t, --touch
触摸文件(标记为最新,而无需实际更改它们),而不是运行其命令。这用于假装命令已经完成,以便欺骗未来的 make 调用。

--trace
打印有关每个目标的信息(为什么目标正在被重新构建以及用于重新构建它的命令)。

-v, --version
打印 make 程序的版本以及版权声明、作者列表和没有保修声明。

-w, --print-directory
打印一条消息,其中包含在其他处理之前和之后的工作目录。这对于跟踪复杂嵌套的递归 make 命令中的错误可能很有用。

--no-print-directory
即使它被隐式启用,也关闭 -w。

--shuffle[=MODE]
启用目标和依赖项顺序的随机化。MODE 是以下之一:none 用于禁用 shuffle 模式,random 用于以随机顺序 shuffle 依赖项,reverse 用于以相反的顺序考虑依赖项,或者是一个整数 <seed>,它使用特定的种子值启用随机模式。如果省略 MODE,则默认值为 random。

-W 文件,--what-if=文件,--new-file=文件,--assume-new=文件
假定目标文件刚刚被修改。与 -n 标志一起使用时,它会显示如果修改该文件会发生什么。如果不使用 -n,它几乎与在运行 make 之前运行 touch 命令相同,除了修改时间仅在 make 的“想象中”发生变化。

--warn-undefined-variables
当引用未定义的变量时发出警告。

退出状态

GNU Make 在所有 Makefile 都已成功解析且构建的任何目标均未失败时,以状态 0 退出。如果使用了 -q 标志并且 make 确定需要重新构建目标,则返回状态 1。如果遇到任何错误,则返回状态 2。

参见

完整的 make 文档作为 Texinfo 手册进行维护。如果 info 和 make 程序已在您的站点上正确安装,则命令

info make

应该可以访问完整的手册。

错误

请参见《GNU Make 手册》中的“问题和错误”章节。

作者

此手册页由斯坦福大学的 Dennis Morse 撰写。Mike Frysinger 贡献了进一步的更新。它已被 Roland McGrath 重新编写。由 Paul Smith 维护。

版权

版权所有 © 1992-1993, 1996-2023 自由软件基金会。此文件是 GNU Make 的一部分。

GNU Make 是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证(版本 3 或更高版本)重新分发和/或修改它。

GNU Make 以希望它对您有用的前提进行分发,但不提供任何保证;甚至不提供适销性或特定用途适用性的暗示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。

您应该已经收到一份 GNU 通用公共许可证的副本,以及本程序。如果没有,请参见 https://www.gnu.org/licenses/。