Theos(三):GNU Make

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 StandardsMakefile conventions 这一章节中找到

下载 Make

Make 可以在 GNU 的主 ftp 服务器上找到:

  1. (通过 HTTP 的方式)http : //ftp.gnu.org/gnu/make/
  2. (通过 FTP 的方式)ftp://ftp.gnu.org/gnu/make/

Make 同样可以在 GNU mirrors 上通过镜像的方式找到。如果可能,请使用镜像

文档

Make 的文档 可以在线获取,大多数 GNU 软件的文档 也是如此。您还可以通过运行命令 info makeman 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 有以下邮件列表:

  • bug-make 用于讨论 Make 的大多数方面,包括开发请求、增强请求,以及 bug 报告

  • help-make 用于一般用户的帮助和讨论

关于 Make 和大多数其他 GNU 软件的公告都是在 info-gnu (archive) 上发布的

不应该立即公开的安全报告可以直接发送给维护者。如果对紧急问题没有回应,您可以升级到一般 安全 邮件列表以获取建议

参与进来

总的来说,Make 和 GNU 的开发是通过志愿者的努力,并且您也可以做出贡献。相关信息,请阅读 How to help GNU(如何帮助 GNU)。如果您想参与其中,加入讨论邮件列表是一个好主意(见上文)

Licensing(许可)

Make 是免费软件;您可以根据自由软件基金会发布的 GNU General Public License(GNU 通用公共许可证)的条款重新分发和/或修改它;许可证的第 3 版,或(由您选择)任何更高版本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GNU MAKE的详细中文手册,目录如下: 目 录 第一章:概述 1.1 概述 1.2 准备知识 第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第章:Makefile 总述 3.1 Makefile的内容 3.2 makefile文件的命名 3.3 包含其它makefile文件 3.4 变量 MAKEFILES 3.5 变量 MAKEFILE_LIST 3.6 其他特殊变量 3.7 makefile文件的重建 3.8 重载另外一个makefile 3.9 make如何解析makefile文件 3.9.1 变量取值 3.9.2 条件语句 3.9.3 规则的定义 3.10 总结 第四章:Makefile的规则 4.1 一个例子 4.2 规则语法 4.3 依赖的类型 4.4 文件名使用通配符 4.4.1 统配符使用举例 4.4.2 通配符存在的缺陷 4.4.3 函数wildcard 4.5 目录搜寻 4.5.1 一般搜索(变量VPATH) 4.5.2 选择性搜索(关键字vpath) 4.5.3 目录搜索的机制 4.5.4 命令行和搜索目录 4.5.5 隐含规则和搜索目录 4.5.6 库文件和搜索目录 4.6 Makefile伪目标 4.7 强制目标(没有命令或依赖的规则) 4.8 空目标文件 4.9 Makefile的特殊目标 4.10 多目标 4.11 多规则目标 4.12 静态模式 4.12.1 静态模式规则的语法 4.12.2 静态模式和隐含规则 4.13 双冒号规则 4.14 自动产生依赖 第五章:规则的命令 5.1 命令回显 5.2 命令的执行 5.3 并发执行命令 5.4 命令执行的错误 5.5 中断make的执行 5.6 make的递归执行 5.6.1 变量MAKE 5.6.2 变量和递归 5.6.3 命令行选项和递归 5.6.4 -w选项 5.7 定义命令包 5.8 空命令 第六章:Makefile中的变量 6.1 变量的引用 6.2 两种变量定义(赋值 ) 6.2.1 递归展开式变量 6.2.2 直接展开式变量 6.2.3 如何定义一个空格 6.2.4 “?=”操作符 6.3 变量的高级用法 6.3.1 变量的替换引用 6.3.2 变量的套嵌引用 6.4 变量取值 6.5 如何设置变量 6.6 追加变量值 6.7 override 指示符 6.8 多行定义 6.9 系统环境变量 6.10 目标指定变量 6.11 模式指定变量 第七章:Makefile的条件执行 7.1 一个例子 7.2 条件判断的基本语法 7.2.1 关键字“ifeq” 7.2.2 关键字“ifneq” 7.2.3 关键字“ifdef” 7.2.4 关键字“ifndef” 7.3 标记测试的条件语句 第八章:make的内嵌函数 8.1 函数的调用语法 8.2 文本处理函数 8.2.1 $(subst FROM,TO,TEXT) 8.2.2 $(patsubst PATTERN,REPLACEMENT,TEXT) 8.2.3 $(strip STRINT) 8.2.4 $(findstring FIND,IN) 8.2.5 $(filter PATTERN…,TEXT) 8.2.6 $(filter-out PATTERN...,TEXT) 8.2.7 $(sort LIST) 8.2.8 $(word N,TEXT) 8.2.9 $(wordlist S,E,TEXT) 8.2.10 $(words TEXT) 8.2.11 $(firstword NAMES…) 8.3 文件名处理函数 8.3.1 $(dir NAMES…) 8.3.2 $(notdir NAMES…) 8.3.3 $(suffix NAMES…) 8.3.4 $(basename NAMES…) 8.3.5 $(addsuffix SUFFIX,NAMES…) 8.3.6 $(addprefix PREFIX,NAMES…) 8.3.7 $(join LIST1,LIST2) 8.3.8 $(wildcard PATTERN) 8.4 foreach 函数 8.5 if 函数 8.6 call函数 8.7 value函数 8.8 eval函数 8.9 origin函数 8.10 shell函数 8.11 make的控制函数 8.11.1 $(error TEXT…) 8.11.2 $(warning TEXT…) 第九章:执行make 9.1 指定makefile文件 9.2 指定终极目标 9.3 替代命令的执行 9.4 防止特定文件重建 9.5 替换变量定义 9.6 使用make进行编译测试 9.7 make的命令行选项 第十章:make的隐含规则 10.1 隐含规则的使用 10.2 make的隐含规则一览 10.3 隐含变量 10.3.1 代表命令的变量 10.3.2 命令参数的变量 10.4 make隐含规则链 10.5 模式规则 10.5.1 模式规则介绍 10.5.2 模式规则示例 10.5.3 自动化变量 10.5.4 模式的匹配 10.5.5 万用规则 10.5.6 重建内嵌隐含规则 10.6 缺省规则 10.7 后缀规则 10.8 隐含规则搜索算法 第十一章:使用make更新静态库文件 11.1 库成员作为目标 11.2 静态库的更新 11.2.1 更新静态库的符号索引表 11.3 make静态库的注意事项 11.4 静态库的后缀规则 第十二章 : GNU make的特点 12.1 源自System v的特点 12.2 源自其他版本的特点 12.3 GNU make自身的特点 第十章 和其它版本的兼容 第十四章 Makefile的约定 14.1 基本的约定 14.2 规则命令行的约定 14.3 代表命令变量 14.4 安装目录变量 14.5 Makefile的标准目标名 14.6 安装命令分类 第十五章 make的常见错误信息   附录:关键字索引 1. GNU make可识别的指示 符 2. GNU make函数 3. GNU make的自动化变量 4. GNU make环境变量 后序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值