目录
GNU Make
GNU Make 是一个工具,用于控制从程序的源文件生成程序的可执行文件和程序的其他非源文件
Make 从一个名为 makefile
的文件中获取有关如何构建程序的知识, makefile
列出了每个非源文件、以及如何从其他文件中计算它。当您编写一个程序时,您应该为它编写一个 makefile
,以便可以使用 Make 来构建和安装该程序
Make 的功能
-
Make 使最终用户能够在不知道详细信息的情况下,构建和安装您的程序包 – 因为这些详细信息被记录在您提供的
makefile
中 -
Make 会根据哪些源文件发生了变化,自动确定哪些非源文件需要更新。Make 还会自动确定更新文件的正确顺序,以防一个非源文件依赖于另一个非源文件
因此,如果您更改了部分源文件然后运行 Make,则不需要重新编译您的整个程序。Make 只更新那些直接或者间接依赖于您更改的源文件的非源文件
-
Make 并不局限于任何特定的语言。对于程序中的每个非源文件,
makefile
指定用于计算它的 shell 命令。这些 shell 命令可以运行编译器来生成目标文件、运行链接器来生成可执行文件、运行ar
指令来更新库、使用TeX
或者Makeinfo
来格式化文档 -
Make 不局限于构建程序包。您还可以使用 Make 来控制安装或者卸载一个程序包,为程序包生成标签表(tags tables),或者任何您想经常做的事情
Make 的规则(Rule)和目标(Target)
makefile
中的规则用于告诉 Make 如何执行一系列命令,以便从源文件构建目标文件。makefile
还指定了目标文件的依赖项列表。此依赖项列表应包括用作规则中的命令的输入的所有文件(无论是源文件还是其他目标文件)
下面是一个简单的规则:
target: dependencies ...
commands
...
运行 Make 时,您可以指定要更新的特定 target
;否则,Make 会更新 makefile
中列出的第一个 target
。当然,作为生成该特定 target
所输入的任何其他 target
必须首先更新
Make 使用 makefile
来确定哪些目标文件应该被更新,然后再确定这些目标文件中哪些实际上需要被更新。如果一个目标文件比它的所有依赖项都新,则该目标文件已经是被更新好的了,不需要重新生成。如果一个目标文件确实需要更新,则需要保证其更新顺序是正确的:在使用该目标文件重新生成其他 target
之前,必须重新生成该目标文件的 target
GNU Make 的优势
GNU Make 有许多强大的功能可用于 makefile
,超过了其他 Make 版本所具有的功能。GNU Make 还可以重新生成、使用、删除不需要保存的中间文件
GNU Make 还具有一些非常方便的简单功能。例如,-o
文件选项:假定源文件没有改变,即使该源文件已经改变。当您向头文件中添加一个新的宏定义时,这一点非常有用。因为,在 Make 的大多数版本中,都会假设它们必须重新编译所有使用头文件的源文件。所以,在您知道您对头文件的更改不需要重新编译源文件的情况下,GNU Make 给您提供了一种避免重新编译的方法
不管怎样,GNU Make 与 Make 的大多数版本之间最重要的区别在于:GNU Make 是自由软件
编写 makefile 的约定
我们已经制定了关于如何编写 makefile
的约定,所有的 GNU 程序包都应该遵守这些约定。即使您不打算将您的程序作为 GNU 软件,在您的程序中遵守这些约定也是一个好主意,这样用户就可以像构建和安装许多其他程序包一样,构建和安装您的程序包,并且在构建和安装您的程序包之前不需要学习任何与构建和安装程序包相关的东西
这些约定可以在 GNU Coding Standards 的 Makefile conventions 这一章节中找到
下载 Make
Make 可以在 GNU 的主 ftp 服务器上找到:
Make 同样可以在 GNU mirrors 上通过镜像的方式找到。如果可能,请使用镜像
文档
Make 的文档 可以在线获取,大多数 GNU 软件的文档 也是如此。您还可以通过运行命令 info make
、man make
,或者查看目录 /usr/share/doc/make/
、/usr/local/doc/make/
。运行 make --help
命令可以获得一个简短的摘要
~ > make --help
Usage(用法):
make [options] [target] ...
Options(选项):
-b, -m # 忽略兼容性
-B, --always-make # 无条件地 make 所有的 target
-C DIRECTORY, --directory=DIRECTORY # 在执行任何操作之前,先切换到 DIRECTORY 所指定的目录
-d # 打印大量的调试信息
--debug[=FLAGS] # 打印各种类型的调试信息,FLAGS 用于指定调试信息的类型
-e, --environment-overrides # 环境变量将覆盖 makefile 中的变量
-f FILE, --file=FILE, --makefile=FILE # 读取 FILE 指定的文件作为 makefile
-h, --help # 打印本帮助信息并退出
-i, --ignore-errors # 忽略命令中的错误
-I DIRECTORY, --include-dir=DIRECTORY # 搜索 DIRECTORY 所指定的目录中包含的 makefile
-j [N], --jobs[=N] # 同时允许 N 个任务。如果不指定参数 N,则不限制任务数量
-k, --keep-going # 当某些 target 不能 make 的时候,仍然继续执行
-l [N], --load-average[=N], --max-load[=N] # 在系统负载高于 N 时不启动多任务
-L, --check-symlink-times # 使用 symlink(软链接) 和 target(软链接目标) 中修改时间较晚的一个
-n, --just-print, --dry-run, --recon # 不要实际运行任何命令,只打印它们的输出
-o FILE, --old-file=FILE, --assume-old=FILE # 将 FILE 指定的文件当做很旧,并且不要重新 make 它
-p, --print-data-base # 打印 make 的内部数据库
-q, --question # 不运行任何命令,退出时的状态码用于说明是否是最新的
-r, --no-builtin-rules # 禁用内置的隐式规则
-R, --no-builtin-variables # 禁用内置的变量设置
-s, --silent, --quiet # 不要 echo 命令
-S, --no-keep-going, --stop # 关闭 -k 指令
-t, --touch # 修改 target 而不是重新 make
-v, --version # 打印 make 的版本号并退出
-w, --print-directory # 打印当前目录
--no-print-directory # 关闭 -w 指令,即使 -w 指令默认开启
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
# 将 FILE 指定的文件当做是最新的
--warn-undefined-variables # 当引用未定义变量的时候发出警告
-N OPTION, --NeXT-option=OPTION # 打开 NeXT 中 OPTION 所指定的值
This program built for i386-apple-darwin11.3.0 # 此程序是为 i386-apple-darwin11.3.0 构建的
Report bugs to <bug-make@gnu.org> # 向 <bug-make@gnu.org> 报告 bug
邮件列表
Make 有以下邮件列表:
关于 Make 和大多数其他 GNU 软件的公告都是在 info-gnu (archive) 上发布的
不应该立即公开的安全报告可以直接发送给维护者。如果对紧急问题没有回应,您可以升级到一般 安全 邮件列表以获取建议
参与进来
总的来说,Make 和 GNU 的开发是通过志愿者的努力,并且您也可以做出贡献。相关信息,请阅读 How to help GNU(如何帮助 GNU)。如果您想参与其中,加入讨论邮件列表是一个好主意(见上文)
-
Test releases(测试版本)
尝试最新的测试版本(当可用时)总是值得赞赏的。Make 的测试版本可以在下列地址找到:
-
Development(开发)
对于源代码开发、问题跟踪、以及其他信息,请参阅 savannah.gnu.org 上的 Make project page
-
Translating Make(翻译 Make)
要将 Make 的消息翻译成其他语言,请参阅 Translation Project page for Make(Make 的翻译项目页面)。如果您有消息字符串的新翻译,或者对现有字符串的更新,请在此存储库中进行更改。只有来自本网站的翻译才会被纳入 Make 中。有关更多信息,请参阅 Translation Project(翻译项目)
-
Maintainer(维护者)
Make 目前由 Paul Smith(保罗·史密斯)维护。请使用邮件列表进行联系
Licensing(许可)
Make 是免费软件;您可以根据自由软件基金会发布的 GNU General Public License(GNU 通用公共许可证)的条款重新分发和/或修改它;许可证的第 3 版,或(由您选择)任何更高版本