《GNU_makefile中文手册.pdf》由会员分享,可在线阅读,更多相关《GNU_makefile中文手册.pdf(181页珍藏版)》请在三一文库上搜索。
1、 GNU make中文手册 ver - 3.8 GNU make中文手册 目 录Table of Contents GNU make中文手册. 1 ver - 3.8 . 1 第一章:概述.7 1.1 概述 . 7 1.2 准备知识 8 第二章 GNU make 介绍 . 9 2 GNU make 介绍 9 2.1 Makefile简介 10 2.2 Makefile规则介绍. 11 2.3 简单的示例. 12 2.4 make如何工作 . 13 2.5 指定变量 15 2.6 自动推导规则. 16 2.7 另类风格的makefile . 17 2.8 清除工作目录过程文件. 18 第三章:M
2、akefile 总述 20 3 Makefile总述 20 3.1 Makefile的内容. 20 3.2 makefile文件的命名 . 21 3.3 包含其它makefile文件 22 3.4 变量 MAKEFILES 24 3.5 变量 MAKEFILE_LIST 26 3.6 其他特殊变量. 26 3.7 makefile文件的重建 . 27 3.8 重载另外一个makefile 28 3.9 make如何解析makefile文件. 30 3.9.1 变量取值 30 3.9.2 条件语句 31 3.9.3 规则的定义. 31 3.10 总结 .31 第四章:Makefile的规则 33
3、 4 Makefile规则 33 4.1 一个例子 33 4.2 规则语法 34 4.3 依赖的类型. 35 4.4 文件名使用通配符 36 4.4.1 统配符使用举例 37 4.4.2 通配符存在的缺陷 38 4.4.3 函数wildcard 38 4.5 目录搜寻 39 4.5.1 一般搜索(变量VPATH) 39 4.5.2 选择性搜索(关键字vpath) 40 4.5.3 目录搜索的机制 41 4.5.4 命令行和搜索目录 44 4.5.5 隐含规则和搜索目录. 44 4.5.6 库文件和搜索目录 45 2004年9月11日 2 GNU make中文手册 4.6 Makefile伪目标
4、. 46 4.7 强制目标(没有命令或依赖的规则) . 50 4.8 空目标文件. 50 4.9 Makefile的特殊目标 . 51 4.10 多目标 54 4.11 多规则目标. 55 4.12 静态模式 56 4.12.1 静态模式规则的语法 . 56 4.12.2 静态模式和隐含规则 . 58 4.13 双冒号规则. 59 4.14 自动产生依赖. 60 第五章:规则的命令 63 5 为规则书写命令 . 63 5.1 命令回显 63 5.2 命令的执行. 64 5.3 并发执行命令. 65 5.4 命令执行的错误 67 5.5 中断make的执行 68 5.6 make的递归执行 69
5、 5.6.1 变量MAKE . 70 5.6.2 变量和递归. 71 5.6.3 命令行选项和递归 75 5.6.4 -w选项 77 5.7 定义命令包. 78 5.8 空命令 80 第六章:Makefile中的变量. 81 6 使用变量 81 6.1 变量的引用. 82 6.2 两种变量定义(赋值). 83 6.2.1 递归展开式变量 83 6.2.2 直接展开式变量 85 6.2.3 定义一个空格 . 86 6.2.4 “?=”操作符. 87 6.3 变量的高级用法 88 6.3.1 变量的替换引用 88 6.3.2 变量的套嵌引用 88 6.4 变量取值 92 6.5 如何设置变量. 9
6、3 6.6 追加变量值. 94 6.7 override 指示符. 96 6.8 多行定义 98 6.9 系统环境变量. 99 6.10 目标指定变量. 101 6.11 模式指定变量. 103 第七章:Makefile的条件执行. 104 7 Makefile的条件判断. 104 7.1 一个例子 104 7.2 条件判断的基本语法 105 7.3 标记测试的条件语句 108 第八章:make的内嵌函数 109 8 make的函数. 109 2004年9月11日 3 GNU make中文手册 8.1 函数的调用语法 109 8.2 文本处理函数. 110 8.2.1 $(subst FROM
7、,TO,TEXT) . 110 8.2.2 $(patsubst PATTERN,REPLACEMENT,TEXT) . 110 8.2.3 $(strip STRINT). 112 8.2.4 $(findstring FIND,IN) 112 8.2.5 $(filter PATTERN,TEXT). 112 8.2.6 $(filter-out PATTERN.,TEXT). 113 8.2.7 $(sort LIST). 113 8.2.8 $(word N,TEXT) 114 8.2.9 $(wordlist S,E,TEXT) 114 8.2.10 $(words TEXT) 11
8、4 8.2.11 $(firstword NAMES) 115 8.3 文件名处理函数 115 8.3.1 $(dir NAMES) 115 8.3.2 $(notdir NAMES). 116 8.3.3 $(suffix NAMES) . 116 8.3.4 $(basename NAMES) . 117 8.3.5 $(addsuffix SUFFIX,NAMES) . 117 8.3.6 $(addprefix PREFIX,NAMES). 118 8.3.7 $(join LIST1,LIST2). 118 8.3.8 $(wildcard PATTERN) 119 8.4 fore
9、ach 函数 119 8.5 if 函数 120 8.6 call函数 121 8.7 value函数. 123 8.8 eval函数. 124 8.9 origin函数. 125 8.10 shell函数 127 8.11 make的控制函数 128 8.11.1 $(error TEXT). 128 8.11.2 $(warning TEXT) 129 第九章:执行make 130 9 执行make 130 9.1 指定makefile文件. 130 9.2 指定终极目标. 131 9.3 替代命令的执行 133 9.4 防止特定文件重建 135 9.5 替换变量定义. 136 9.6 使
10、用make进行编译测试. 137 9.7 Tmake的命令行选项 138 第十章:make的隐含规则 143 10 使用隐含规则. 143 10.1 隐含规则的使用 143 10.2 make的隐含规则一览. 145 10.3 隐含变量 148 10.3.1 代表命令的变量 149 10.3.2 命令参数的变量 150 10.4 make隐含规则链 151 10.5 模式规则 153 10.5.1 模式规则介绍 153 10.5.2 模式规则示例 155 10.5.3 自动化变量 156 2004年9月11日 4 GNU make中文手册 T10.5.4 T模式的匹配 . 159 10.5.5
11、 万用规则. 160 10.5.6 重建内嵌隐含规则. 161 10.6 缺省规则 162 10.7 后缀规则 162 10.8 隐含规则搜索算法 164 第十一章:使用make更新静态库文件 166 11 更新静态库文件 166 11.1 库成员作为目标 166 11.2 静态库的更新. 167 11.2.1 更新静态库的符号索引表 168 11.3 make静态库的注意事项. 168 11.4 静态库的后缀规则 169 第十二章 : GNU make的特点. 170 12 GNU make的一些特点. 170 12.1 源自System v的特点 170 12.2 源自其他版本的特点 17
12、1 12.3 GNU make自身的特点. 172 第十三章 和其它版本的兼容 174 13 不兼容性 174 第十四章 Makefile的约定 176 14 书写约定 176 14.1 基本的约定. 176 14.2 规则命令行的约定 178 14.3 代表命令变量. 179 14.4 安装目录变量. 180 14.5 Makefile的标准目标名 185 14.6 安装命令分类. 190 第十五章 make的常见错误信息. 193 15 make产生的错误信息. 193 附录1:关键字索引 196 GNU make可识别的指示符: 196 GNU make函数: . 197 GNU mak
13、e的自动化变量. 197 GNU make环境变量 198 后序 . 198 2004年9月11日 5 GNU make中文手册 关于本书关于本书 本文瑾献给所有热爱 Linux 的程序员!本中文文档版权所有。 本文比较完整的讲述 GNU make 工具,涵盖 GNU make 的用法、语法。同时重点 讨论如何为一个工程编写 Makefile。作为一个 Linux 程序员,make 工具的使用以及编 写Makefile是必需的。 系统、 详细讲述make的中文资料比较少, 出于对广大中文Linuxer 的支持,本人在工作之余,花了 18 个多月时间完成对“info make”的翻译整理,完成
14、这个中文版手册。本书不是一个纯粹的语言翻译版本,其中对 GNU make 的一些语法 和用法根据我个人的工作经验进行了一些详细分析和说明, 也加入了一些个人的观点和 实践总结。 本书的所有的例子都可以在支持V3.8版本的GNU make的系统中正确执行。 由于个人水平限制, 本文在一些地方存在描述不准确之处。 恳请大家在阅读过程中, 提 出 您 宝 贵 的 意 见 , 也 是 对 我 个 人 的 帮 助 。 我 的 个 人 电 子 邮 箱 地 址 : 。非常愿意和大家交流!共同学习。 阅读本书之前,读者应该对 GNU 的工具链和 Linux 的一些常用编程工具有一定的 了解。诸如:gcc、as
15、、ar、ld、yacc 等;同时在书写 Makefile 时,需要能够进行一些 基本的 shell 编程。这些工具是维护一个工程的基础。如果大家对这些工具的用法不是 很熟悉,可参考项目资料。 阅读本文的几点建议: 1. 如果之前你对 GNU make 没有了解、当前也不想深入的学习 GNU make 的读 者。可只阅读本文各章节前半部分的内容(作为各章节的基础知识) 。 2. 如果你已经对 GNU make 比较熟悉,你更需要关心此版本的新增特点、功能、 和之前版本不兼容之处;也可以作为开发过程过程的参考手册。 3. 之前你对 GNU make 没有概念、或者刚开始接触,本身又想成为一个 Li
16、nux 下 的专业程序员,那么建议:完整学习本文的各个章节,包括了基础知识和高级 用法、技巧。它会为你在 Linux 下的工程开发、工程管理提供非常有用的帮助。 4. 此 中 文 文 档 当 前 版 本 v1.5 , 本 文 的 所 有 勘 误 和 最 新 版 本 可 在 主 页 http:/ 上获取! ! 谢谢! 徐海兵 2005-12-31 2004年9月11日 6 GNU make中文手册 第一章:概述第一章:概述 1.1 概述 Linux 环境下的程序员如果不会使用 GNU make 来构建和管理自己的工程,应该 不能算是一个合格的专业程序员,至少不能称得上是 Unix 程序员。在 L
17、inux(unix)环 境下使用 GNU 的 make 工具能够比较容易的构建一个属于你自己的工程, 整个工程的 编译只需要一个命令就可以完成编译、 连接以至于最后的执行。 不过这需要我们投入一 些时间去完成一个或者多个称之为 Makefile 文件的编写。此文件正是 make 正常工作 的基础。 所要完成的 Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程 中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文 件、如何最后产生我们想要得可执行文件。尽管看起来可能是很复杂的事情,但是为工 程编写 Makefile 的好处是能够使用一行命令来完成“自动
18、化编译” ,一旦提供一个(通 常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一的一件 事就是在 shell 提示符下输入 make 命令。整个工程完全自动编译,极大提高了效率。 make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则) 。在 Makefile 文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、 关键字、函数。像 C 语言有自己的格式、关键字和函数一样。而且在 Makefile 中可以 使用系统 shell 所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能 是另外的文件名
19、)在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译 方法。 目前,系统完整的介绍 make 工具和如何编写 Makefile 的中文文档比较少。我整 理这个文档就是希望能使众多的 Linux 环境下的程序员能够比较容易的掌握和学会使 用 GNU make。本文所要介绍的是 GNU 的 make,采用 Red Hat FC3(包括最新发布 的 GNU Linux 系统)所集成的 GUN make 工具。 本文中所有示例均采用 C 语言的源程序,因为它是目前最普遍使用的一种语言。 当然 make 工具不仅仅是用来管理 C 语言工程的,那些编译器只要能够在 shell 下运行 的语言
20、所构建的工程都可以使用 make 工具来管理。Make 工作不仅仅可以用来编译源 代码,它也可以完成一些其它的功能。例如,有这样的需求:当我们修改了某个或者某 2004年9月11日 7 GNU make中文手册 些文件后, 需要能够根据修改的文件来自动对相关文件进行重建或者更新。 那么应该考 虑使用 GNU make 工具。 GNU make 工具为我们实现这个目的提供了非常有利的支持。 工程中根据源文件的修改情况来进行代码的编译正是使用了 make 的这个特征。make 执行时,根据 Makefile 的规则检查文件的修改情况,决定是否执行定义的动作(那些 修改过的文件将会被重新编译) 。这
21、是 GNU make 的执行依据。 1.2 准备知识 在开始我们关于 make 的讨论之前,首先需要明确一些基本概念: 编译: 把高级语言书写的代码转换为机器可识别的机器指令。 编译高级语言后生成 的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、 函数与变量的声明是否正确。 只有所有的语法正确、 相关变量定义正确编译器就可以编 译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在 Linux 中默认后缀为“.o” (如“foo.c”的目标文件为“foo.o” ) 。 为了和规则的目标文件相区别。本文将编译高级语言后生成的目标文件成为为了和规则
22、的目标文件相区别。本文将编译高级语言后生成的目标文件成为.o 文 件。 文 件。 链接:将多.o 文件,或者.o 文件和库文件链接成为可被操作系统执行的可执行程 序(Linux 环境下,可执行文件的格式为“ELF”格式) 。链接器不检查函数所在的源文 件,只检查所有.o 文件中的定义的符号。将.o 文件中使用的函数和其它.o 或者库文件 中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位) ,并链接系统相 关文件(程序启动文件等)最终生成可执行程序。链接过程使用 GNU 的“ld”工具。 静态库:又称为文档文件(Archive File) 。它是多个.o 文件的集合。Linux 中静
23、态 库文件的后缀为“.a” 。静态库中的各个成员(.o 文件)没有特殊的存在格式,仅仅是 一个.o 文件的集合。使用“ar”工具维护和管理静态库。 共享库:也是多个.o 文件的集合,但是这些.o 文件时有编译器按照一种特殊的方 式生成(Linux 中,共享库文件格式通常为“ELF”格式。共享库已经具备了可执行条 件) 。模块中各个成员的地址(变量引用和函数调用)都是相对地址。使用此共享库的 程序在运行时, 共享库被动态加载到内存并和主程序在内存中进行连接。 多个可执行程 序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不 共享数据) 。另外共享库的成员对象可被执行(由
24、 libdl.so 提供支持) 。 参考 info ld 了解更加详细的关于 ld 的说明和用法。 2004年9月11日 8 GNU make中文手册 第二章第二章 GNU make 介绍介绍 2 GNU make 介绍介绍 make 在执行时,需要一个命名为 Makefile 的文件。这个文件告诉 make 以何种方 式编译源代码和链接程序。典型地,可执行文件可由一些.o 文件按照一定的顺序生成 或者更新。如果在你的工程中已经存在一个活着多个正确的 Makefile。当对工程中的若 干源文件修改以后, 需要根据修改来更新可执行文件或者库文件, 正如前面提到的你只 需要在 shell 下执行“
25、make” 。make 会自动根据修改情况完成源文件的对应.o 文件的 更新、库文件的更新、最终的可执行程序的更新。 make 通过比较对应文件(规则的目标和依赖, )的最后修改时间,来决定哪些文 件需要更新、那些文件不需要更新。对需要更新的文件 make 就执行数据库中所记录的 相应命令(在 make 读取 Makefile 以后会建立一个编译过程的描述数据库。此数据库 中记录了所有各个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要 重建的文件 make 什么也不做。 而且可以通过make的命令行选项来指定需要重新编译的文件。 可参考 9.2 指定终 极目标 一节 Proble
26、ms and Bugs = If you have problems with GNU make or think youve found a bug, please report it to the developers; we cannot promise to do anything but we might well want to fix it. Before reporting a bug, make sure youve actually found a real bug.Carefully reread the documentation and see if it reall
27、y says you can do what youre trying to do. If its not clear whether you should be able to do something or not, report that too; its a bug in the documentation! Before reporting a bug or trying to fix it yourself, try to isolate it to the smallest possible makefile that reproduces the problem. Then s
28、end us the makefile and the exact results make gave you, including any error or warning messages. Please dont paraphrase these messages: its best to cut and paste them into your report. When generating this small makefile, be sure to not use any non-free or unusual tools in your commands: you can al
29、most always emulate what such a tool would do with simple shell commands. Finally, be sure to explain what you expected to occur; this will help us decide whether the problem was really in the documentation. Once you have a precise problem you can report it in one of two ways.Either send electronic
30、mail to: bug-makegnu.org or use our Web-based project management tool, at: http:/savannah.gnu.org/projects/make/ 2004年9月11日 9 GNU make中文手册 In addition to the information above, please be careful to include the version number of make you are using. You can get this information with the command make -
31、version. Be sure also to include the type of machine and operating system you are using. One way to obtain this information is by looking at the final lines of output from the command make -help. 以上时 GNU make 的 bug 反馈方式。如果在你使用 GNU make 过程中。发现 bug 或者问题。可以通过以上的方式和渠道反馈。 好了。开始我们的神奇之旅吧! 2.1 Makefile简介 在执
32、行 make 之前,需要一个命名为 Makefile 的特殊文件(本文的后续将使用 Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什么任务) ,该 怎么做。通常,make 工具主要被用来进行工程编译和程序链接。 本节将分析一个简单的 Makefile,它对一个包含 8 个 C 的源代码和三个头文件的 工程进行编译和链接。这个 Makefile 提供给了 make 必要的信息,make 程序根据 Makefile 中的规则描述执行相关的命令来完成指定的任务(如:编译、链接和清除编译 过程文件等) 。复杂的 Makefile 我们将会在本文后续进行讨论。 当使用ma
33、ke工具进行编译时, 工程中以下几种文件在执行make时将会被编译 (重 新编译) : 1. 所有的源文件没有被编译过,则对各个所有的源文件没有被编译过,则对各个 C 源文件进行编译并进行链接,生成最 后的可执行程序; 源文件进行编译并进行链接,生成最 后的可执行程序; 2. 每一个在上次执行每一个在上次执行 make 之后修改过的之后修改过的 C 源代码文件在本次执行源代码文件在本次执行 make 时将会 被重新编译; 时将会 被重新编译; 3. 头文件在上一次执行头文件在上一次执行 make 之后被修改。则所有包含此头文件的之后被修改。则所有包含此头文件的 C 源文件在本 次执行 源文件在
34、本 次执行 make 时将会被重新编译。时将会被重新编译。 后两种情况是 make 只将修改过的 C 源文件重新编译生成.o 文件,对于没有修改 的文件不进行任何工作。重新编译过程中,任何一个源文件的修改将产生新的对应的.o 文件,新的.o 文件将和以前的已经存在、此次没有重新编译的.o 文件重新连接生成最 后的可执行程序。 首先让我们先来看一些 Makefile 相关的基本知识。 2004年9月11日 10 GNU make中文手册 2.2 Makefile规则介绍 一个简单的 Makefile 描述规则组成: TARGET. : PREREQUISITES. COMMAND . . tar
35、get:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需 的中间过程文件名。可以是.o文件、也可以是最后的可执行程序的文件名等。另外,目 标也可以是一个make执行的动作的名称,如目标“clean” ,我们称这样的目标是“伪 目标” 。参考4.6 Makefile伪目标 一节 prerequisites:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依 赖于一个或者多个文件。 command:规则的命令行。是规则所要执行的动作(任意的 shell 命令或者是可在 shell 下执行的程序) 。它限定了 make 执行这条规则时所需要的动作。 一个规则可以有多个命令行,
36、 每一条命令占一行。 注意: 每一个命令行必须以注意: 每一个命令行必须以Tab 字符开始,字符开始,Tab字符告诉字符告诉 make 此行是一个命令行。此行是一个命令行。make 按照命令完成相应的动作。 这也是书写 按照命令完成相应的动作。 这也是书写 Makefile 中容易产生,而且比较隐蔽的错误。中容易产生,而且比较隐蔽的错误。 命令就是在任何一个目标的依赖文件发生变化后重建目标的动作描述。 一个目标可 以没有依赖而只有动作(指定的命令) 。比如 Makefile 中的目标“clean” ,此目标没有 依赖, 只有命令。 它所定义的命令用来删除 make 过程产生的中间文件 (进行清
37、理工作) 。 在 Makefile 中“规则”就是描述在什么情况下、如何重建规则的目标文件,通常 规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令。make 执行重建 目标的命令, 来创建或者重建规则的目标 (此目标文件也可以是触发这个规则的上一个 规则中的依赖文件) 。 规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。 一个 Makefile 文件中通常还包含了除规则以外的很多东西(后续我们会一步一步 的展开) 。一个最简单的 Makefile 可能只包含规则。规则在有些 Makefile 中可能看起来 非常复杂
38、,但是无论规则的书写是多么的复杂,它都符合规则的基本格式。 make 程序根据规则的依赖关系,决定是否执行规则所定义的命令的过程我们称之 为执行规则执行规则。 2004年9月11日 11 GNU make中文手册 2.3 简单的示例 本小节开始我们在第一小节中提到的例子。此例子由3个头文件和8个C文件组成。 我们将书写一个简单的Makefile,来描述如何创建最终的可执行文件“edit” ,此可执行 文件依赖于8个C源文件和3个头文件。Makefile文件的内容如下: #sample Makefile edit : main.o kbd.o command.o display.o insert
39、.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert
40、.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o 首先书写时,可以将一个较长行使用反斜线()来分解
41、为多行,这样可以使我们 的Makefile书写清晰、容易阅读理解。但需要注意:反斜线之后不能有空格(这也是大 家最容易犯的错误,错误比较隐蔽) 。 但需要注意:反斜线之后不能有空格(这也是大 家最容易犯的错误,错误比较隐蔽) 。我们推荐将一个长行分解为使用反斜线连接得多 个行的方式。在完成了这个Maekfile以后;需要创建可执行程序“edit” ,所要做的就是 在包含此Makefile的目录(当然也在代码所在的目录)下输入命令“make” 。删除已经 此目录下之前使用“make”生成的文件(包括那些中间过程的.o文件) ,也只需要输入 命令“make clean”就可以了。 在这个Makef
42、ile中,我们的目标(target)就是可执行文件“edit”和那些.o文件 (main.o,kbd.o.) ;依赖(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。 2004年9月11日 12 GNU make中文手册 所有的.o文件既是依赖(相对于可执行程序edit)又是目标(相对于.c和.h文件) 。命令 包括 “cc c maic.c” 、 “cc c kbd.c” 当规则的目标是一个文件,在它的任何一个依赖文件被修改以后,在执行“make” 时这个目标文件将会被重新编译或者重新连接。 当然, 此目标的任何一个依赖文件如果 有必要则首先会被重新编译。在这个例子中
43、, “edit”的依赖为8个.o文件;而“main.o” 的依赖文件为“main.c”和“defs.h” 。当“main.c”或者“defs.h”被修改以后,再次 执行“make” , “main.o”就会被更新(其它的.o文件不会被更新) ,同时“main.o” 的 更新将会导致“edit”被更新。 在描述依赖关系行之下通常就是规则的命令行(存在一些些规则没有命令行) ,命 令行定义了规则的动作(如何根据依赖文件来更新目标文件) 。命令行必需以Tab键开 始,以和Makefile其他行区别。就是说所有的命令行必需以就是说所有的命令行必需以Tab 字符开始,但并不是 所有的以 字符开始,但并不
44、是 所有的以Tab键出现行都是命令行。 但键出现行都是命令行。 但make程序会把出现在第一条规则之后的所有以程序会把出现在第一条规则之后的所有以 Tab字符开始的行都作为命令行来处理字符开始的行都作为命令行来处理。 (记住:make程序本身并不关心命令是如何 工作的,对目标文件的更新需要你在规则描述中提供正确的命令。 “make”程序所做的 就是当目标程序需要更新时执行规则所定义的命令) 。 目标“clean”不是一个文件,它仅仅代表执行一个动作的标识。正常情况下,不 需要执行这个规则所定义的动作,因此目标“clean”没有出现在其它任何规则的依赖 列表中。因此在执行make时,它所指定的动
45、作不会被执行。除非在执行make时明确地 指定它。而且目标“clean”没有任何依赖文件,它只有一个目的,就是通过这个目标 名来执行它所定义的命令。Makefile中把那些没有任何依赖只有执行动作的目标称为 “伪目标” ( 中把那些没有任何依赖只有执行动作的目标称为 “伪目标” (phony targets) 。 参考4.6 Makefile伪目标 一节。 需要执行 “clean”目标 所定义的命令,可在shell下输入:make clean。 2.4 make如何工作 默认的情况下,make执行的是Makefile中的第一个规则,此规则的第一个目标称 之为“最终目的”或者“终极目标” (就是
46、一个Makefile最终需要更新或者创建的目标, 参考9.2 指定终极目标 一节) 。 上例的 Makefile,目标“edit”在 Makefile 中是第一个目标,因此它就是 make 的 “终极目标” 。当修改了任何 C 源文件或者头文件后,执行 make 将会重建终极目标 “edit” 。 2004年9月11日 13 GNU make中文手册 当在 shell 提示符下输入“make”命令以后。make 读取当前目录下的 Makefile 文 件,并将 Makefile 文件中的第一个目标作为其执行的“终极目标” ,开始处理第一个规 则(终极目标所在的规则) 。在我们的例子中,第一个规
47、则就是目标“edit”所在的规 则。 规则描述了 “edit” 的依赖关系, 并定义了链接.o 文件生成目标 “edit” 的命令; make 在执行这个规则所定义的命令之前,首先处理目标“edit”的所有的依赖文件(例子中 的那些.o 文件)的更新规则(以这些.o 文件为目标的规则) 。对这些.o 文件为目标的规 则处理有下列三种情况: 1. 目标.o 文件不存在,使用其描述规则创建它; 2. 目标.o 文件存在, 目标.o 文件所依赖的.c 源文件、 .h 文件中的任何一个比目标.o 文件“更新” (在上一次 make 之后被修改) 。则根据规则重新编译生成它; 3. 目标.o 文件存在,
48、目标.o 文件比它的任何一个依赖文件(的.c 源文件、.h 文件) “更新” (它的依赖文件在上一次 make 之后没有被修改) ,则什么也不做。 这些.o 文件所在的规则之所以会被执行,是因为这些.o 文件出现在“终极目标” 的依赖列表中。在 Makefile 中一个规则的目标如果不是“终极目标”所依赖的(或者 “终极目标”的依赖文件所依赖的) ,那么这个规则将不会被执行,除非明确指定执行 这个规则(可以通过 make 的命令行指定重建目标,那么这个目标所在的规则就会被执 行,例如 “make clean” ) 。在编译或者重新编译生成一个.o 文件时,make 同样会去 寻找它的依赖文件的
49、重建规则(是这样一个规则:这个依赖文件在规则中作为目标出 现) , 在这里就是.c 和.h 文件的重建规则。 在上例的 Makefile 中没有哪个规则的目标是.c 或者.h 文件,所以没有重建.c 和.h 文件的规则。不过 C 言语源程序文件可以使用工具 Bison 或者 Yacc 来生成(具体用法可参考相应的手册) 。 完成了对.o 文件的创建(第一次编译)或者更新之后,make 程序将处理终极目标 “edit”所在的规则,分为以下三种情况: 1. 目标文件“edit”不存在,则执行规则以创建目标“edit” 。 2. 目标文件“edit”存在,其依赖文件中有一个或者多个文件比它“更新” ,则根 据规则重新链接生成“edit” 。 3. 目标文件“edit”存在,它比它的任何一个依赖文件都“更新” ,则什么也不做。 上例中,如果更改了源文件“insert.c”后执行 make, “insert.o”将被更新,之后 终极目标 “edit” 将会被重生成; 如果我们修改了头文件 “command.h” 之后运行 “make” , 那么“kbd.o” 、
链接地址:https://www.31doc.com/p-3655984.html