GNU make中文手册
ver - 3.8
翻译整理:徐海兵
2004-09-11
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
第三章:Makefile 总述 .............................................................................................................. 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
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.12.1
4.12.2
4.6 Makefile伪目标............................................................................................................... 46
4.7 强制目标(没有命令或依赖的规则) ............................................................................. 50
4.8 空目标文件..................................................................................................................... 50
4.9 Makefile的特殊目标 ....................................................................................................... 51
4.10 多目标............................................................................................................................ 54
4.11 多规则目标..................................................................................................................... 55
4.12 静态模式 ........................................................................................................................ 56
静态模式规则的语法 ....................................................................................... 56
静态模式和隐含规则 ....................................................................................... 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.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
“?=”操作符 ............................................................................................................. 87
6.2.4
6.3 变量的高级用法.............................................................................................................. 88
6.3.1 变量的替换引用........................................................................................................ 88
6.3.2 变量的套嵌引用........................................................................................................ 88
6.4 变量取值 ........................................................................................................................ 92
6.5 如何设置变量 ................................................................................................................. 93
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.3.1
8.3.2
8.3.3
8.3.4
8.3.5
8.3.6
8.3.7
8.3.8
8.2.1
8.2.2
8.2.3
8.2.4
8.2.5
8.2.6
8.2.7
8.2.8
8.2.9
8.2.10
8.2.11
8.1 函数的调用语法............................................................................................................ 109
8.2 文本处理函数 ............................................................................................................... 110
$(subst FROM,TO,TEXT) ..................................................................................... 110
$(patsubst PATTERN,REPLACEMENT,TEXT) ................................................... 110
$(strip STRINT)..................................................................................................... 112
$(findstring FIND,IN) ............................................................................................ 112
$(filter PATTERN…,TEXT) ................................................................................... 112
$(filter-out PATTERN...,TEXT)............................................................................. 113
$(sort LIST)........................................................................................................... 113
$(word N,TEXT) .................................................................................................... 114
$(wordlist S,E,TEXT)............................................................................................ 114
$(words TEXT) ............................................................................................ 114
$(firstword NAMES…) ................................................................................ 115
8.3 文件名处理函数............................................................................................................ 115
$(dir NAMES…) .................................................................................................... 115
$(notdir NAMES…)............................................................................................... 116
$(suffix NAMES…) ............................................................................................... 116
$(basename NAMES…) ....................................................................................... 117
$(addsuffix SUFFIX,NAMES…) ........................................................................... 117
$(addprefix PREFIX,NAMES…)........................................................................... 118
$(join LIST1,LIST2)............................................................................................... 118
$(wildcard PATTERN) .......................................................................................... 119
8.4
foreach 函数................................................................................................................ 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
$(error TEXT…) ........................................................................................... 128
$(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 使用make进行编译测试 ............................................................................................... 137
9.7
Tmake的命令行选项 .................................................................................................... 138
第十章:make的隐含规则........................................................................................................ 143
10
使用隐含规则 ............................................................................................................... 143
10.1 隐含规则的使用............................................................................................................ 143
10.2 make的隐含规则一览................................................................................................... 145
10.3 隐含变量 ...................................................................................................................... 148
代表命令的变量 ............................................................................................ 149
命令参数的变量 ............................................................................................ 150
10.4 make隐含规则链.......................................................................................................... 151
10.5 模式规则 ...................................................................................................................... 153
模式规则介绍 ................................................................................................ 153
模式规则示例 ................................................................................................ 155
自动化变量.................................................................................................... 156
8.11.1
8.11.2
10.3.1
10.3.2
10.5.1
10.5.2
10.5.3
2004年9月11日
4
GNU make中文手册
T10.5.4
10.5.5
10.5.6
T模式的匹配 ................................................................................................. 159
万用规则 ....................................................................................................... 160
重建内嵌隐含规则......................................................................................... 161
10.6 缺省规则 ...................................................................................................................... 162
10.7 后缀规则 ...................................................................................................................... 162
10.8 隐含规则搜索算法........................................................................................................ 164
第十一章:使用make更新静态库文件...................................................................................... 166
11
更新静态库文件............................................................................................................ 166
11.1 库成员作为目标............................................................................................................ 166
11.2 静态库的更新 ............................................................................................................... 167
更新静态库的符号索引表 .............................................................................. 168
11.3 make静态库的注意事项 ............................................................................................... 168
11.4 静态库的后缀规则........................................................................................................ 169
第十二章 : GNU make的特点............................................................................................... 170
12
GNU make的一些特点 ................................................................................................. 170
12.1 源自System v的特点.................................................................................................... 170
12.2 源自其他版本的特点 .................................................................................................... 171
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 make的自动化变量..................................................................................................... 197
GNU make环境变量............................................................................................................ 198
后序 ......................................................................................................................................... 198
11.2.1
2004年9月11日
5
GNU make中文手册
关于本书
本文瑾献给所有热爱 Linux 的程序员!本中文文档版权所有。
本文比较完整的讲述 GNU make 工具,涵盖 GNU make 的用法、语法。同时重点
讨论如何为一个工程编写 Makefile。作为一个 Linux 程序员,make 工具的使用以及编
写Makefile 是必需的。系统、详细讲述make 的中文资料比较少,出于对广大中文Linuxer
的支持,本人在工作之余,花了 18 个多月时间完成对“info make”的翻译整理,完成
这个中文版手册。本书不是一个纯粹的语言翻译版本,其中对 GNU make 的一些语法
和用法根据我个人的工作经验进行了一些详细分析和说明,也加入了一些个人的观点和
实践总结。本书的所有的例子都可以在支持 V3.8 版本的 GNU make 的系统中正确执行。
由于个人水平限制,本文在一些地方存在描述不准确之处。恳请大家在阅读过程中,
提 出 您 宝 贵 的 意 见 , 也 是 对 我 个 人 的 帮 助 。 我 的 个 人 电 子 邮 箱 地 址 :
xhbdahai@126.com。非常愿意和大家交流!共同学习。
阅读本书之前,读者应该对 GNU 的工具链和 Linux 的一些常用编程工具有一定的
了解。诸如:gcc、as、ar、ld、yacc 等;同时在书写 Makefile 时,需要能够进行一些
基本的 shell 编程。这些工具是维护一个工程的基础。如果大家对这些工具的用法不是
很熟悉,可参考项目资料。
阅读本文的几点建议:
1. 如果之前你对 GNU make 没有了解、当前也不想深入的学习 GNU make 的读
者。可只阅读本文各章节前半部分的内容(作为各章节的基础知识)。
2. 如果你已经对 GNU make 比较熟悉,你更需要关心此版本的新增特点、功能、
和之前版本不兼容之处;也可以作为开发过程过程的参考手册。
3. 之前你对 GNU make 没有概念、或者刚开始接触,本身又想成为一个 Linux 下
的专业程序员,那么建议:完整学习本文的各个章节,包括了基础知识和高级
用法、技巧。它会为你在 Linux 下的工程开发、工程管理提供非常有用的帮助。
4. 此 中 文 文 档 当 前 版 本 v1.5 , 本 文 的 所 有 勘 误 和 最 新 版 本 可 在 主
页 http://xhbdahai.cublog.cn 上获取!!
谢谢!
2004年9月11日
徐海兵 2005-12-31
6
GNU make中文手册
1.1 概述
第一章:概述
Linux 环境下的程序员如果不会使用 GNU make 来构建和管理自己的工程,应该
不能算是一个合格的专业程序员,至少不能称得上是 Unix 程序员。在 Linux(unix)环
境下使用 GNU 的 make 工具能够比较容易的构建一个属于你自己的工程,整个工程的
编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一
些时间去完成一个或者多个称之为 Makefile 文件的编写。此文件正是 make 正常工作
的基础。
所要完成的 Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程
中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文
件、如何最后产生我们想要得可执行文件。尽管看起来可能是很复杂的事情,但是为工
程编写 Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通
常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一的一件
事就是在 shell 提示符下输入 make 命令。整个工程完全自动编译,极大提高了效率。
make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则)。在 Makefile
文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、
关键字、函数。像 C 语言有自己的格式、关键字和函数一样。而且在 Makefile 中可以
使用系统 shell 所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能
是另外的文件名)在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译
方法。
目前,系统完整的介绍 make 工具和如何编写 Makefile 的中文文档比较少。我整
理这个文档就是希望能使众多的 Linux 环境下的程序员能够比较容易的掌握和学会使
用 GNU make。本文所要介绍的是 GNU 的 make,采用 Red Hat FC3(包括最新发布
的 GNU Linux 系统)所集成的 GUN make 工具。
本文中所有示例均采用 C 语言的源程序,因为它是目前最普遍使用的一种语言。
当然 make 工具不仅仅是用来管理 C 语言工程的,那些编译器只要能够在 shell 下运行
的语言所构建的工程都可以使用 make 工具来管理。Make 工作不仅仅可以用来编译源
代码,它也可以完成一些其它的功能。例如,有这样的需求:当我们修改了某个或者某
2004年9月11日
7
GNU make中文手册
些文件后,需要能够根据修改的文件来自动对相关文件进行重建或者更新。那么应该考
虑使用 GNU make 工具。GNU make 工具为我们实现这个目的提供了非常有利的支持。
工程中根据源文件的修改情况来进行代码的编译正是使用了 make 的这个特征。make
执行时,根据 Makefile 的规则检查文件的修改情况,决定是否执行定义的动作(那些
修改过的文件将会被重新编译)。这是 GNU make 的执行依据。
1.2 准备知识
在开始我们关于 make 的讨论之前,首先需要明确一些基本概念:
编译:把高级语言书写的代码转换为机器可识别的机器指令。编译高级语言后生成
的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、
函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确编译器就可以编
译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在
Linux 中默认后缀为“.o”(如“foo.c”的目标文件为“foo.o”)。
为了和规则的目标文件相区别。本文将编译高级语言后生成的目标文件成为.o 文
件。
链接:将多.o 文件,或者.o 文件和库文件链接成为可被操作系统执行的可执行程
序(Linux 环境下,可执行文件的格式为“ELF”格式)。链接器不检查函数所在的源文
件,只检查所有.o 文件中的定义的符号。将.o 文件中使用的函数和其它.o 或者库文件
中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相
关文件(程序启动文件等)最终生成可执行程序。链接过程使用 GNU 的“ld”工具。
静态库:又称为文档文件(Archive File)。它是多个.o 文件的集合。Linux 中静态
库文件的后缀为“.a”。静态库中的各个成员(.o 文件)没有特殊的存在格式,仅仅是
一个.o 文件的集合。使用“ar”工具维护和管理静态库。
共享库:也是多个.o 文件的集合,但是这些.o 文件时有编译器按照一种特殊的方
式生成(Linux 中,共享库文件格式通常为“ELF”格式。共享库已经具备了可执行条
件)。模块中各个成员的地址(变量引用和函数调用)都是相对地址。使用此共享库的
程序在运行时,共享库被动态加载到内存并和主程序在内存中进行连接。多个可执行程
序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不
共享数据)。另外共享库的成员对象可被执行(由 libdl.so 提供支持)。
参考 info ld 了解更加详细的关于 ld 的说明和用法。
2004年9月11日
8