GNU make中文手册
ver - 3.8
第一章:概述
1.1 概述
1.2 准备知识
第二章 GNU make 介绍
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 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 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 为规则书写命令
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 使用变量
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 Makefile的条件判断
7.1 一个例子
7.2 条件判断的基本语法
7.3 标记测试的条件语句
第八章:make的内嵌函数
8 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 执行make
9.1 指定makefile文件
9.2 指定终极目标
9.3 替代命令的执行
9.4 防止特定文件重建
9.5 替换变量定义
9.6 使用make进行编译测试
9.7 Tmake的命令行选项
第十章:make的隐含规则
10 使用隐含规则
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 自动化变量
T10.5.4 T模式的匹配
10.5.5 万用规则
10.5.6 重建内嵌隐含规则
10.6 缺省规则
10.7 后缀规则
10.8 隐含规则搜索算法
第十一章:使用make更新静态库文件
11 更新静态库文件
11.1 库成员作为目标
11.2 静态库的更新
11.2.1 更新静态库的符号索引表
11.3 make静态库的注意事项
11.4 静态库的后缀规则
第十二章 : GNU make的特点
12 GNU make的一些特点
12.1 源自System v的特点
12.2 源自其他版本的特点
12.3 GNU make 自身的特点
第十三章 和其它版本的兼容
13 不兼容性
第十四章 Makefile的约定
14 书写约定
14.1 基本的约定
14.2 规则命令行的约定
14.3 代表命令变量
14.4 安装目录变量
14.5 Makefile的标准目标名
14.6 安装命令分类
第十五章 make的常见错误信息
15 make产生的错误信息
附录1:关键字索引
GNU make可识别的指示符:
GNU make函数:
GNU make的自动化变量
GNU make环境变量
后序
### GNU makefile中文手册知识点概览
#### 一、概述
**1.1 概述**
- **GNU make** 是一款强大的工具,用于自动化构建软件项目。它通过读取一个或多个 *Makefile* 文件来确定项目的构建顺序,并管理整个构建流程。
- Makefile 文件包含了项目的构建规则和依赖关系。
**1.2 准备知识**
- 在深入学习 GNU make 之前,读者应具备基本的编程知识,了解文本编辑器的使用方法以及基本的 shell 脚本编写技巧。
- 对于操作系统命令行界面有一定的熟悉度。
#### 二、GNU make 介绍
**2.1 Makefile简介**
- Makefile 是一个文本文件,其中定义了构建项目的规则和目标。
- 它指定了构建过程中的依赖关系,帮助 make 工具决定哪些文件需要被构建,以及构建的顺序。
**2.2 Makefile规则介绍**
- **规则** 是 Makefile 的核心组件之一,用于定义目标文件及其依赖文件。
- 规则通常由目标、依赖项和命令组成。
- 示例格式如下:
```makefile
target: dependencies
command
```
**2.3 简单的示例**
- 简单的 Makefile 示例可能如下所示:
```makefile
all: prog.o lib.o
gcc -o prog prog.o lib.o
prog.o: prog.c
gcc -c -o prog.o prog.c
lib.o: lib.c
gcc -c -o lib.o lib.c
clean:
rm -f prog prog.o lib.o
```
**2.4 make如何工作**
- make 工具读取 Makefile 文件,解析其中的规则,并根据文件的时间戳来决定是否需要重新构建某个目标。
- 如果目标比其依赖项更新,则 make 认为该目标是最新的,无需重新构建。
**2.5 指定变量**
- **变量** 是 Makefile 中的一个重要概念,可以用来存储路径、文件名或其他值。
- 变量在 Makefile 中被引用时,通常采用 `$(variable)` 或 `${variable}` 的形式。
- 示例:
```makefile
CC = gcc
CFLAGS = -Wall -g
prog: prog.o lib.o
$(CC) $(CFLAGS) -o prog prog.o lib.o
```
**2.6 自动推导规则**
- make 支持 **自动推导规则**,即根据文件扩展名自动应用预定义的构建步骤。
- 例如,如果 Makefile 中包含 `.c.o` 规则,则 make 可以自动推断出如何从 .c 文件构建 .o 文件。
**2.7 另类风格的makefile**
- Makefile 的风格多种多样,可以根据项目的需求和个人偏好进行调整。
- 有些 Makefile 使用更复杂的结构,如条件语句、循环等,以实现更灵活的功能。
**2.8 清除工作目录过程文件**
- Makefile 中通常会包含一个名为 `clean` 的规则,用于清理构建过程中产生的临时文件。
- 示例:
```makefile
clean:
rm -f *.o prog
```
#### 三、Makefile 总述
**3.1 Makefile的内容**
- Makefile 通常包含以下内容:
- 目标及规则
- 变量定义
- 包含其他 Makefile 文件
- 特殊目标和规则
**3.2 makefile文件的命名**
- Makefile 文件通常命名为 `Makefile` 或 `makefile`。
- make 工具默认查找这些文件名。
**3.3 包含其它makefile文件**
- 可以使用 `include` 指令来包含其他 Makefile 文件,这有助于组织大型项目的构建脚本。
- 示例:
```makefile
include common.mk
```
**3.4 变量MAKEFILES**
- **MAKEFILES** 变量用于记录当前 makefile 文件名列表。
- 这个变量主要用于调试目的,帮助理解 make 如何解析 makefile 文件。
**3.5 变量MAKEFILE_LIST**
- **MAKEFILE_LIST** 变量用于存储所有已读取的 makefile 文件名。
- 类似于 **MAKEFILES**,但包含了所有文件名。
**3.6 其他特殊变量**
- Makefile 中还存在一些特殊的内置变量,如 `$@`、`$<`、`$^` 等,它们在构建过程中具有特殊的意义。
- 例如,`$@` 表示目标文件,`$<` 表示第一个依赖项。
**3.7 makefile文件的重建**
- make 工具支持自动检测并重建 makefile 文件。
- 这对于确保 makefile 文件与源代码同步非常有用。
**3.8 重载另外一个makefile**
- 可以使用 `-I` 或 `--include` 选项来指定额外的目录,使 make 能够从这些目录中搜索包含文件。
**3.9 make如何解析makefile文件**
- **3.9.1 变量取值**
- 变量在 Makefile 中被解析和取值的方式。
- 包括直接展开式变量和递归展开式变量。
- **3.9.2 条件语句**
- Makefile 支持使用条件语句来根据不同的情况执行不同的构建逻辑。
- **3.9.3 规则的定义**
- 规则的定义方式和解析过程。
**3.10 总结**
- 本章总结了 Makefile 的基本概念和功能,为后续章节奠定了基础。
#### 四、Makefile的规则
**4.1 一个例子**
- 通过示例来展示 Makefile 规则的编写方式。
- 示例通常包括目标、依赖项和命令。
**4.2 规则语法**
- 详细介绍了 Makefile 规则的语法结构。
**4.3 依赖的类型**
- Makefile 支持多种类型的依赖,包括显式依赖、隐式依赖等。
**4.4 文件名使用通配符**
- 介绍了如何在 Makefile 中使用通配符来匹配多个文件。
- 例如,`*.c` 匹配所有 .c 扩展名的文件。
**4.5 目录搜寻**
- **4.5.1 一般搜索(变量VPATH)**
- 通过设置 VPATH 变量来指定 make 在哪些目录中搜索依赖文件。
- **4.5.2 选择性搜索(关键字vpath)**
- 使用 `vpath` 关键字来指定特定目标的搜索路径。
- **4.5.3 目录搜索的机制**
- 解释了 make 如何根据指定的路径搜索依赖文件。
- **4.5.4 命令行和搜索目录**
- 说明如何通过命令行选项来影响目录搜索行为。
- **4.5.5 隐含规则和搜索目录**
- 探讨了隐含规则在目录搜索中的作用。
- **4.5.6 库文件和搜索目录**
- 描述了如何搜索库文件。
**4.6 Makefile伪目标**
- 伪目标是在 Makefile 中定义的目标,它们不代表实际文件,而是用于触发一系列命令的执行。
**4.7 强制目标(没有命令或依赖的规则)**
- 强制目标是 Makefile 中的一种特殊规则,即使没有明确的命令或依赖项也会被执行。
**4.8 空目标文件**
- 空目标文件是一种特殊的情况,用于表示没有任何内容的目标。
**4.9 Makefile的特殊目标**
- Makefile 支持一些特殊目标,如 `.PHONY`、`.SECONDEXPANSION` 等。
**4.10 多目标**
- 介绍如何在一个规则中指定多个目标。
**4.11 多规则目标**
- 多规则目标是指一个目标可以在多个规则中出现。
**4.12 静态模式**
- **4.12.1 静态模式规则的语法**
- 静态模式规则允许使用模式匹配来简化规则的定义。
- **4.12.2 静态模式和隐含规则**
- 静态模式规则与隐含规则之间的相互作用。
**4.13 双冒号规则**
- 双冒号规则提供了一种机制来覆盖现有的规则。
**4.14 自动产生依赖**
- make 支持自动生成依赖项,这对于大型项目特别有用。
#### 五、规则的命令
**5.1 命令回显**
- 当 make 执行命令时,可以设置选项让命令在执行前显示出来。
**5.2 命令的执行**
- 详细介绍了命令如何被 make 工具执行。
**5.3 并发执行命令**
- make 支持并发执行命令,提高了构建效率。
- 可以通过 `-j` 或 `--jobs` 选项指定并行执行的进程数。
**5.4 命令执行的错误**
- 介绍了如何处理命令执行过程中的错误。
**5.5 中断make的执行**
- 有时需要在特定条件下中断 make 的执行。
**5.6 make的递归执行**
- 递归执行是指 make 在执行某个规则时调用另一个 make 进程。
- 这种机制可以用于分层构建大型项目。
**5.7 定义命令包**
- 可以定义一组命令作为命令包,在需要的地方重复使用。
**5.8 空命令**
- 空命令是 Makefile 中的一个特殊概念,用于定义不需要任何命令执行的目标。
#### 六、Makefile中的变量
**6.1 变量的引用**
- 介绍了如何在 Makefile 中引用变量。
**6.2 两种变量定义(赋值)**
- **6.2.1 递归展开式变量**
- 递归展开式变量会在使用时才被解析。
- **6.2.2 直接展开式变量**
- 直接展开式变量在定义时立即被解析。
- **6.2.3 定义一个空格**
- 介绍如何在 Makefile 中定义包含空格的变量。
- **6.2.4 “?=”操作符**
- 该操作符用于定义条件变量,只有当变量未被定义时才会被设置。
**6.3 变量的高级用法**
- **6.3.1 变量的替换引用**
- 介绍如何使用变量替换功能。
- **6.3.2 变量的套嵌引用**
- 说明如何在一个变量定义中引用另一个变量。
**6.4 变量取值**
- 详细介绍了如何在 Makefile 中获取变量的实际值。
**6.5 如何设置变量**
- 介绍了在 Makefile 中设置变量的不同方法。
**6.6 追加变量值**
- 说明如何向已有的变量追加值。
**6.7 override 指示符**
- `override` 指示符用于改变 Makefile 中变量的默认行为。
**6.8 多行定义**
- 介绍如何在 Makefile 中定义多行变量。
**6.9 系统环境变量**
- 说明如何在 Makefile 中使用系统环境变量。
**6.10 目标指定变量**
- 目标指定变量允许为特定的目标定义变量。
**6.11 模式指定变量**
- 模式指定变量允许基于文件名模式来定义变量。
#### 七、Makefile的条件执行
**7.1 一个例子**
- 通过示例来展示条件执行的使用方法。
**7.2 条件判断的基本语法**
- 介绍了 Makefile 中条件判断的基本语法。
**7.3 标记测试的条件语句**
- 介绍如何使用条件语句来执行标记测试。
#### 八、make的内嵌函数
**8.1 函数的调用语法**
- 介绍了 make 内置函数的调用方式。
**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)**
- 提取文本中的第 N 个单词。
- **8.2.9 $(wordlist S,E,TEXT)**
- 提取文本中从第 S 个到第 E 个单词。
- **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 函数**
- `foreach` 函数用于在 Makefile 中实现循环操作。
**8.5 if 函数**
- `if` 函数用于实现条件判断。
**8.6 call函数**
- `call` 函数用于调用其他函数。
**8.7 value函数**
- `value` 函数用于返回变量的值。
**8.8 eval函数**
- `eval` 函数用于执行动态定义的 Makefile 代码。
**8.9 origin函数**
- `origin` 函数用于返回变量的定义来源。
**8.10 shell函数**
- `shell` 函数用于在 Makefile 中执行 shell 命令。
**8.11 make的控制函数**
- **8.11.1 $(error TEXT…)**
- 用于生成错误信息。
- **8.11.2 $(warning TEXT…)**
- 用于生成警告信息。
#### 九、执行make
**9.1 指定makefile文件**
- 说明如何在命令行中指定 Makefile 文件。
**9.2 指定终极目标**
- 介绍如何在命令行中指定构建的目标。
**9.3 替代命令的执行**
- 介绍如何替代 Makefile 中定义的命令。
**9.4 防止特定文件重建**
- 介绍如何防止 make 重新构建某些文件。
**9.5 替换变量定义**
- 说明如何在命令行中更改 Makefile 中定义的变量。
**9.6 使用make进行编译测试**
- 介绍如何使用 make 进行编译测试。
**9.7 Tmake的命令行选项**
- 介绍 make 支持的各种命令行选项。
#### 十、make的隐含规则
**10.1 隐含规则的使用**
- 介绍了 make 的隐含规则如何被使用。
**10.2 make的隐含规则一览**
- 列出了 make 默认提供的隐含规则。
**10.3 隐含变量**
- **10.3.1 代表命令的变量**
- 用于指定隐含规则中的命令。
- **10.3.2 命令参数的变量**
- 用于指定命令中的参数。
**10.4 make隐含规则链**
- 介绍 make 如何处理隐含规则链。
**10.5 模式规则**
- **10.5.1 模式规则介绍**
- 介绍模式规则的概念。
- **10.5.2 模式规则示例**
- 通过示例来展示模式规则的应用。
- **10.5.3 自动化变量**
- 介绍模式规则中使用的自动化变量。
- **10.5.4 模式的匹配**
- 介绍模式规则中的模式匹配方式。
- **10.5.5 万用规则**
- 介绍万用规则的概念。
- **10.5.6 重建内嵌隐含规则**
- 说明如何重建内嵌的隐含规则。
**10.6 缺省规则**
- 介绍 make 的缺省规则。
**10.7 后缀规则**
- 介绍 make 的后缀规则。
**10.8 隐含规则搜索算法**
- 详细介绍 make 如何搜索和应用隐含规则。
#### 十一、使用make更新静态库文件
**11.1 库成员作为目标**
- 介绍如何将静态库文件的成员作为 Makefile 中的目标。
**11.2 静态库的更新**
- 说明如何更新静态库文件。
**11.3 make静态库的注意事项**
- 提供了一些在使用 make 构建静态库时需要注意的问题。
**11.4 静态库的后缀规则**
- 介绍用于静态库构建的后缀规则。
#### 十二、GNU make的特点
**12.1 源自System v的特点**
- 介绍了源自 System v 的 make 特点。
**12.2 源自其他版本的特点**
- 介绍了源自其他 make 版本的特点。
**12.3 GNU make 自身的特点**
- 重点介绍了 GNU make 的独特特性。
#### 十三、和其它版本的兼容
**13 不兼容性**
- 介绍了 GNU make 与其他 make 版本之间可能存在的不兼容性问题。
#### 十四、Makefile的约定
**14 书写约定**
- **14.1 基本的约定**
- 介绍了 Makefile 书写的基本约定。
- **14.2 规则命令行的约定**
- 介绍了规则命令行的约定。
- **14.3 代表命令变量**
- 介绍了代表命令的变量约定。
- **14.4 安装目录变量**
- 介绍了安装目录变量的约定。
- **14.5 Makefile的标准目标名**
- 介绍了 Makefile 中标准目标名称的约定。
- **14.6 安装命令分类**
- 介绍了安装命令的分类约定。
#### 十五、make的常见错误信息
**15 make产生的错误信息**
- 列出了 make 在运行过程中可能会产生的常见错误信息,并提供了相应的解决方法。
#### 附录
- **关键字索引**
- **GNU make函数**
- **GNU make的自动化变量**
- **GNU make环境变量**
以上是对 GNU makefile 中文手册的主要知识点的总结,涵盖了从 Makefile 的基础知识到高级用法的各个方面。通过学习这些内容,读者可以深入了解如何使用 GNU make 来高效地管理和构建软件项目。
1