### Makefile中文手册知识点梳理
#### 一、Makefile概览
**Makefile**是一种用于自动化构建过程的脚本文件,通常与C/C++等语言的项目构建紧密相关。它被广泛应用于各种软件项目的编译过程中,特别是Linux系统中的开源项目。
**1.1 make概述**
- **make**是一款用于自动化构建的工具,可以基于Makefile文件中的规则来构建项目。
- **Makefile**是一种文本文件,其中包含了构建项目所需的各种规则和变量设置。
- **规则**定义了如何构建目标文件以及所需的命令。
**1.2 问题和BUG**
- 如果在使用过程中遇到任何问题或发现BUG,可以通过官方渠道报告。
**二、Makefile文件入门**
- **2.1 规则的格式**:规则的基本格式是目标:依赖;命令。目标是需要构建的文件,依赖是指构建目标所需要的文件,命令则是执行的具体操作。
- **2.2 一个简单的Makefile文件**:例如,`all: prog.o util.o; gcc -o prog prog.o util.o`。这里`all`为目标,`prog.o`和`util.o`为依赖,`gcc -o prog prog.o util.o`为命令。
- **2.3 make处理Makefile文件的过程**:make工具会读取Makefile文件,并按照文件中定义的规则顺序处理。
- **2.4 使用变量简化Makefile文件**:变量可以用来存储经常使用的字符串或命令,例如`CC=gcc`定义了一个名为`CC`的变量,其值为`gcc`。
- **2.5 让make推断命令**:通过指定目标和依赖,make可以自动推断出构建命令。
- **2.6 另一种风格的Makefile文件**:还可以使用更复杂的语法来组织Makefile文件,如条件语句等。
- **2.7 在目录中删除文件的规则**:可以定义特定规则来删除不再需要的文件。
#### 三、深入Makefile文件
**3.1 Makefile文件的内容**:
- Makefile文件可以包含各种规则和变量定义,以及其他配置项。
- **3.2 Makefile文件的命名**:通常命名为`Makefile`或`makefile`,也可以自定义名称但需要通过命令行指定。
- **3.3 包含其他的Makefile文件**:使用`include`指令可以引入其他Makefile文件。
- **3.4 变量MAKEFILES**:这个变量可以用来指定需要包含的其他Makefile文件列表。
- **3.5 Makefile文件重新生成的过程**:当Makefile文件本身发生变化时,make会重新读取并应用新的规则。
- **3.6 重载其他Makefile文件**:如果需要更新已经包含的Makefile文件,可以使用`include`指令重新加载。
- **3.7 make读取Makefile文件的过程**:make会按照顺序读取主Makefile文件及其包含的所有其他Makefile文件。
#### 四、规则编写技巧
**4.1 规则的语法**:包括目标、依赖和命令。
- **4.2 在文件名中使用通配符**:例如`*.o`代表所有`.o`结尾的文件。
- **4.3 在目录中搜索依赖**:使用`VPATH`来定义搜索依赖的路径。
- **4.4 假想目标**:用于执行某些任务但不生成实际文件的目标。
- **4.5 没有命令或依赖的规则**:仅定义目标而不执行任何操作。
- **4.6 使用空目录文件记录事件**:创建一个空文件来标记某些事件的发生。
- **4.7 内置的特殊目标名**:如`.PHONY`用于定义假想目标。
- **4.8 具有多个目标的规则**:可以同时处理多个目标。
- **4.9 具有多条规则的目标**:一个目标可以由多条规则处理。
- **4.10 静态格式规则**:用于匹配特定格式的目标和依赖。
- **4.11 双冒号规则**:定义了目标的多个构建方式。
- **4.12 自动生成依赖**:利用`-MF`选项可以在构建过程中自动生成依赖关系。
#### 五、在规则中使用命令
- **5.1 命令回显**:在命令前添加`@`可以使命令不被显示。
- **5.2 执行命令**:规则中的命令将被执行。
- **5.3 并行执行**:使用`-j`选项可以并行执行命令。
- **5.4 命令错误**:make会在命令执行失败时停止。
- **5.5 中断或关闭make**:使用`-k`选项即使命令失败也会继续执行后续命令。
- **5.6 递归调用make**:可以在Makefile中调用其他make实例。
- **5.7 定义固定次序命令**:确保某些命令按特定顺序执行。
- **5.8 使用空命令**:在某些情况下可以使用空命令占位。
#### 六、变量使用技巧
- **6.1 变量引用基础**:变量引用通过`$(VAR)`或`${VAR}`完成。
- **6.2 变量的两个特色**:包括覆盖默认值和变量的展开。
- **6.3 变量高级引用技术**:如替换引用和嵌套变量引用。
- **6.4 变量取值**:获取变量的实际值。
- **6.5 设置变量**:使用`:=`或`=`来设置变量。
- **6.6 为变量值追加文本**:使用`+=`追加文本到变量值末尾。
- **6.7 override指令**:允许在Makefile文件中重写变量。
- **6.8 定义多行变量**:使用`\`换行符来定义多行变量。
- **6.9 环境变量**:可以在Makefile中使用环境变量。
- **6.10 特定目标变量的值**:为特定目标设置变量值。
- **6.11 特定格式变量的值**:根据目标文件名格式设置变量值。
#### 七、条件语句
- **7.1 条件语句的例子**:如`ifeq`、`ifdef`等用于根据条件执行不同的规则。
- **7.2 条件语句的语法**:条件语句的基本语法。
- **7.3 测试标志的条件语句**:使用`ifeq`等条件语句进行逻辑判断。
#### 八、文本转换函数
- **8.1 函数调用语法**:函数调用的一般形式。
- **8.2 字符串替换和分析函数**:如`patsubst`用于字符串替换。
- **8.3 文件名函数**:处理文件名相关的操作。
- **8.4 函数foreach**:遍历列表中的元素。
- **8.5 函数if**:根据条件返回结果。
- **8.6 函数call**:调用其他函数。
- **8.7 函数origin**:获取变量的来源。
- **8.8 函数shell**:执行shell命令。
- **8.9 控制Make的函数**:如`error`用于终止make进程。
#### 九、运行make
- **9.1 指定Makefile文件的参数**:使用`-f`选项指定Makefile文件。
- **9.2 指定最终目标的参数**:使用`make target`指定构建目标。
- **9.3 代替执行命令**:使用`-n`选项预览而不执行命令。
- **9.4 避免重新编译文件**:通过设置适当的依赖关系可以避免不必要的编译。
- **9.5 变量重载**:在命令行上覆盖Makefile文件中的变量值。
- **9.6 测试编译程序**:使用`-d`选项进行调试输出。
- **9.7 选项概要**:make工具支持的各种命令行选项。
#### 十、使用隐含规则
- **10.1 使用隐含规则**:make支持一系列预定义的规则,用于简化构建过程。
- **10.2 隐含规则目录**:make会在特定的目录下查找隐含规则。
- **10.3 隐含规则使用的变量**:如`CXXFLAGS`等用于控制隐含规则的行为。
- **10.4 隐含规则链**:多个隐含规则可以串联起来。
- **10.5 定义与重新定义格式规则**:格式规则用于匹配特定模式的目标和依赖。
- **10.6 定义最新类型的缺省规则**:为新类型的目标文件定义默认构建规则。
- **10.7 过时的后缀规则**:旧版本的规则现在已被新的规则所取代。
- **10.8 隐含规则**:make内置的一系列规则。
以上是对《Makefile中文手册》的核心知识点总结,希望能帮助读者更好地理解和掌握Makefile的相关知识。