### GNU Makefile 中文手册知识点概览 #### 一、Makefile 编写规则与概述 **1.1 概述** - **Makefile 的作用**:Makefile 是一种脚本文件,主要用于自动化构建项目的过程,它告诉 `make` 工具如何编译和链接程序。 - **Makefile 的格式**:遵循一定的格式规范,如规则、依赖关系等。 **1.2 准备知识** - **基本概念**:理解目标(target)、依赖(dependency)和命令(command)的概念。 - **工具链**:熟悉编译器、链接器等工具的使用方法。 - **操作系统**:了解 Linux 系统下的文件结构和权限管理。 #### 二、GNU make 介绍 **2.1 Makefile 简介** - **定义**:Makefile 是用于自动化构建项目的脚本文件。 - **作用**:简化编译过程,避免重复劳动。 **2.2 Makefile 规则介绍** - **规则格式**:target: dependencies\ncommand - **规则类型**:简单规则、模式规则、静态模式规则、双冒号规则等。 **2.3 简单示例** ``` all: prog1 prog2 prog1: prog1.o gcc -o prog1 prog1.o prog1.o: prog1.c gcc -c prog1.c ``` **2.4 make 如何工作** - **读取 Makefile**:make 工具首先读取 Makefile 文件。 - **分析依赖关系**:根据 Makefile 中的规则分析出依赖关系。 - **执行命令**:按需执行命令以更新目标文件。 **2.5 指定变量** - **定义方式**:`VAR = value` 或 `VAR := value` - **使用场合**:在 Makefile 中可以定义各种变量来简化规则的编写。 **2.6 自动推导规则** - **自动推导**:当 Makefile 中没有明确给出某些目标文件的构建规则时,make 会尝试自动推导构建规则。 - **常见后缀**:如 `.c`、`.o` 等。 **2.7 另类风格的 Makefile** - **Makefile 变体**:有些项目可能采用不同于标准格式的 Makefile。 - **兼容问题**:这种风格的 Makefile 可能需要特定版本的 make 来支持。 **2.8 清除工作目录过程文件** - **clean 目标**:通常定义一个名为 `clean` 的目标,用来清理编译过程中产生的中间文件。 #### 三、Makefile 总述 **3.1 Makefile 的内容** - **结构**:包括规则、变量定义、函数调用等。 - **功能**:描述了项目构建的所有细节。 **3.2 makefile 文件的命名** - **默认文件名**:`Makefile` 或 `makefile`。 - **自定义文件名**:可以通过 `-f` 参数指定。 **3.3 包含其他 makefile 文件** - **包含命令**:使用 `include` 命令可以包含其他 makefile 文件。 - **用途**:便于模块化管理 Makefile。 **3.4 变量 MAKEFILES** - **定义**:用于指定额外的 makefile 文件。 - **用途**:在多个 makefile 文件之间共享变量和规则。 **3.5 变量 MAKEFILE_LIST** - **定义**:包含了所有被 make 读取的 makefile 文件列表。 - **用途**:可用于调试目的。 **3.6 其他特殊变量** - **MAKE**:当前 make 进程的名称。 - **MAKECMDSTR**:当前执行的命令字符串。 - **?**:未完全定义的目标。 **3.7 makefile 文件的重建** - **条件**:当 Makefile 文件比其依赖的源文件新时,make 会重新读取 Makefile。 - **影响**:可能导致规则和命令重新解释。 **3.8 重载另一个 makefile** - **使用场景**:当需要在运行时更改 makefile 时。 - **方法**:通过 `-R` 或 `--reload` 选项来实现。 **3.9 make 如何解析 makefile 文件** - **变量取值**:make 在解析 makefile 时会处理变量引用。 - **条件语句**:支持 `ifeq`、`ifdef`、`ifneq` 等条件语句。 - **规则定义**:解析并存储规则供后续使用。 **3.10 总结** - **要点回顾**:本章介绍了 Makefile 的基本结构和关键特性。 - **实践建议**:通过编写实际的 Makefile 来加深理解。 #### 四、Makefile 的规则 **4.1 一个例子** - **示例代码**: ``` all: prog prog: prog.o gcc -o prog prog.o prog.o: prog.c gcc -c prog.c ``` **4.2 规则语法** - **格式**:target: dependencies\ncommand - **注意事项**:注意缩进和空格的正确使用。 **4.3 依赖的类型** - **普通依赖**:直接列出文件作为依赖。 - **模式依赖**:使用通配符来匹配一系列文件。 **4.4 文件名使用通配符** - **通配符**:如 `*` 和 `?`。 - **使用限制**:不能用于所有情况下。 **4.5 目录搜寻** - **VPATH 变量**:用于指定搜索路径。 - **vpath 关键字**:更精细地控制搜索行为。 **4.6 Makefile 伪目标** - **定义**:用于表示不是真实文件的目标。 - **常见目标**:`all`、`clean` 等。 **4.7 强制目标(没有命令或依赖的规则)** - **定义**:仅作为标记使用的规则。 - **用途**:帮助组织 Makefile 的结构。 **4.8 空目标文件** - **定义**:不包含任何命令的目标。 - **用途**:标记某些条件已完成。 **4.9 Makefile 的特殊目标** - **定义**:具有特殊含义的目标。 - **例子**:`.PHONY`、`.PRECIOUS` 等。 **4.10 多目标** - **定义**:一条规则可以有多个目标。 - **用途**:同时构建多个目标文件。 **4.11 多规则目标** - **定义**:一个目标可以由多个规则定义。 - **优先级**:先定义的规则优先级更高。 **4.12 静态模式** - **定义**:用于匹配目标文件的模式。 - **例子**:`%.o: %.c` 表示所有 `.c` 文件转换成 `.o` 文件。 **4.13 双冒号规则** - **定义**:使用 `::` 来定义替代规则。 - **用途**:允许同一个目标对应不同的规则。 **4.14 自动产生依赖** - **定义**:通过工具自动生成依赖关系。 - **工具**:如 `makedepend` 等。 #### 五、规则的命令 **5.1 命令回显** - **定义**:显示命令而非直接执行。 - **用途**:调试 Makefile。 **5.2 命令的执行** - **默认行为**:逐条执行。 - **控制流**:通过 `$(MAKE)` 实现递归调用。 **5.3 并发执行命令** - **定义**:同时执行多条命令。 - **配置**:通过 `-j` 选项控制并发数。 **5.4 命令执行的错误** - **定义**:处理命令执行失败的情况。 - **策略**:可以设置 make 忽略某些错误继续执行。 **5.5 中断 make 的执行** - **定义**:在 Makefile 中提前终止 make 的执行。 - **指令**:使用 `false` 或 `error`。 **5.6 make 的递归执行** - **定义**:make 调用自身来执行子 makefile。 - **变量 MAKE**:用于控制递归调用的行为。 **5.7 定义命令包** - **定义**:将多个命令打包在一起作为一个整体执行。 - **语法**:使用 `\n` 分隔多行命令。 **5.8 空命令** - **定义**:空命令表示不执行任何操作。 - **用途**:占位符,用于保持 Makefile 结构的一致性。 #### 六、Makefile 中的变量 **6.1 变量的引用** - **基本语法**:`$(VARIABLE)` 或 `${VARIABLE}`。 - **用途**:复用常量或表达式。 **6.2 两种变量定义(赋值)** - **递归展开式变量**:使用 `:=`。 - **直接展开式变量**:使用 `=`。 - **区别**:递归变量在使用时才展开,而直接变量在定义时立即展开。 **6.3 变量的高级用法** - **替换引用**:替换文本中的模式。 - **套嵌引用**:变量之间的嵌套引用。 **6.4 变量取值** - **定义**:变量在何时何地取值。 - **影响因素**:makefile 的加载顺序、变量定义的位置等。 **6.5 如何设置变量** - **命令行参数**:使用 `-D` 或 `--define-variable`。 - **环境变量**:通过系统环境设置变量。 **6.6 追加变量值** - **操作**:使用 `+=` 运算符追加值到变量。 - **用途**:扩展变量的功能。 **6.7 override 指示符** - **定义**:使用 `.override` 指示符可以覆盖变量的值。 - **用途**:在特定规则中临时改变变量的值。 **6.8 多行定义** - **定义**:使用 `\` 来换行。 - **用途**:使 Makefile 更易阅读。 **6.9 系统环境变量** - **定义**:Makefile 可以访问系统环境变量。 - **用途**:根据环境变化调整构建过程。 **6.10 目标指定变量** - **定义**:特定于目标的变量。 - **用途**:根据不同目标定制构建过程。 **6.11 模式指定变量** - **定义**:针对模式匹配的目标的变量。 - **用途**:进一步细化变量的作用范围。 #### 七、Makefile 的条件执行 **7.1 一个例子** - **示例代码**: ``` ifeq ($(DEBUG),yes) CFLAGS += -g endif ``` **7.2 条件判断的基本语法** - **条件语句**:`ifeq`、`ifdef`、`ifneq`。 - **逻辑运算**:支持逻辑运算符。 **7.3 标记测试的条件语句** - **测试命令**:用于检查文件属性、字符串比较等。 - **示例**:`$(filter-out .o, $(SOURCES))`。 #### 八、make 的内嵌函数 **8.1 函数的调用语法** - **基本语法**:`$(function arguments)`。 **8.2 文本处理函数** - **函数列表**: - `subst`:字符串替换。 - `patsubst`:模式匹配替换。 - `strip`:去除字符串两端空白。 - `findstring`:查找子串。 - `filter`:过滤字符串。 - `filter-out`:反向过滤。 - `sort`:排序。 - `word`:提取单词。 - `wordlist`:提取单词列表。 - `words`:统计单词数量。 - `firstword`:获取第一个单词。 #### 结论 通过以上章节的学习,我们可以了解到 Makefile 的核心概念及其在项目构建过程中的重要作用。掌握这些知识点对于提高开发效率、简化项目管理具有重要意义。此外,合理利用 Makefile 的高级特性可以进一步优化构建过程,提高项目的可维护性和可扩展性。
- 粉丝: 4
- 资源: 19
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Linux基础命令学习-哔哩哔哩搜索:泷羽sec
- 基于FPGA的信号发生器
- 【Unity可视化着色器编辑器插件】Amplify Shader Editor 轻松设计出复杂的视觉效果
- 基于Python Go的期货价差数据采集监控平台
- Windows系统远程桌面设置(附win11家庭版开启组策略功能及远程桌面)
- 软件工程-22-6班-刘思远-第二次课后作业.docx
- 健身房预约课程微信小程序.zip
- VCP-DCV for vSphere 8.x (Exam 2V0- 21.23).pdf
- 毕业设计基于python的LSTM神经网络的股票价格趋势预测的研究与实现项目源码+文档说明
- 找出浅色块,颜色第六感小游戏