### GNU make中文手册知识点概述 #### 一、GNU make简介与使用 GNU make 是一个用于自动化构建过程的工具,广泛应用于软件开发过程中。通过编写 Makefile 文件,开发者可以定义一系列规则来描述如何构建项目。 **1.1 概述** GNU make 主要用于通过解析 Makefile 文件中的规则来构建项目。它支持各种类型的依赖关系,并能够根据这些规则自动构建项目,减少重复劳动。 **1.2 准备知识** 为了更好地理解和使用 GNU make,建议具备以下基础知识: - **基本的 shell 编程知识**:熟悉基本的命令行操作。 - **Makefile 文件的编写**:理解 Makefile 的结构和语法。 #### 二、Makefile 文件详解 **2.1 Makefile 简介** Makefile 文件是 GNU make 解析的主要配置文件,用于定义构建规则。它可以包含多个规则和变量定义。 **2.2 Makefile 规则介绍** - **规则格式**:`target : prerequisites`。其中 `target` 是目标文件,`prerequisites` 是构建该目标所需的先决条件文件。 - **命令**:每条规则可以指定一个或多个命令来执行构建任务。 - **依赖关系**:规则定义了文件之间的依赖关系,GNU make 会根据这些依赖关系决定构建顺序。 **2.3 简单示例** 例如,定义一个简单的 Makefile 文件,用于编译一个 C 程序: ```makefile all: program program: main.o gcc -o program main.o main.o: main.c gcc -c main.c ``` 在这个例子中,`all` 目标是最终目标,它依赖于 `program`;`program` 目标依赖于 `main.o` 文件;`main.o` 文件依赖于 `main.c` 文件。 **2.4 make 如何工作** 当 GNU make 运行时,它首先读取 Makefile 文件,然后根据文件中的规则确定哪些文件需要被构建。如果目标文件不存在或者比其依赖项旧,则执行相应的命令。 **2.5 指定变量** Makefile 文件中可以定义变量,用于简化规则的编写。例如: ```makefile CC = gcc CFLAGS = -Wall -g program: main.o $(CC) $(CFLAGS) -o program main.o ``` 这里定义了两个变量 `CC` 和 `CFLAGS`,分别表示编译器和编译选项。 **2.6 自动推导规则** GNU make 支持自动推导规则,即基于文件扩展名自动确定构建命令。例如,如果目标文件的扩展名为 `.o` 而依赖文件的扩展名为 `.c`,则默认使用 `gcc` 编译。 **2.7 另类风格的 makefile** 可以使用不同的风格来编写 Makefile 文件,如使用模式规则、静态模式规则等,以适应不同的需求。 **2.8 清除工作目录过程文件** 通常会在 Makefile 文件中定义一个 `clean` 目标,用于删除中间文件和目标文件,方便重新构建项目: ```makefile clean: rm -f *.o program ``` #### 三、Makefile 总述 **3.1 Makefile 的内容** Makefile 文件主要包含以下几个部分: - **目标**:构建的目标文件。 - **规则**:描述构建目标所需的步骤。 - **变量**:简化 Makefile 的编写。 **3.2 makefile 文件的命名** Makefile 文件的默认名称为 `Makefile` 或者 `makefile`。此外,还可以使用 `-f` 选项指定其他名称。 **3.3 包含其它 makefile 文件** 可以使用 `include` 命令来引入其他 Makefile 文件,以便复用规则和变量定义: ```makefile include common.mk ``` **3.4 变量 MAKEFILES** `MAKEFILES` 变量用于记录所有包含进来的 Makefile 文件路径。 **3.5 变量 MAKEFILE_LIST** `MAKEFILE_LIST` 变量包含所有 Makefile 文件的列表,包括当前文件和其他被包含的文件。 **3.6 其他特殊变量** GNU make 提供了一些特殊的变量,如 `$@`、`$<` 等,用于简化规则的编写。 **3.7 makefile 文件的重建** 如果 Makefile 文件发生改变,GNU make 会重新读取并解析 Makefile 文件,以确保使用最新的规则。 **3.8 重载另一个 makefile** 可以通过 `include` 命令在 Makefile 文件中动态包含其他 Makefile 文件。 **3.9 make 如何解析 makefile 文件** - **3.9.1 变量取值**:GNU make 在解析 Makefile 文件时会处理变量引用。 - **3.9.2 条件语句**:支持使用条件语句来控制规则的执行。 - **3.9.3 规则的定义**:规则定义了目标和先决条件之间的关系。 **3.10 总结** 本章节总结了 Makefile 文件的基础知识和编写技巧,为后续更深入的学习打下基础。 #### 四、Makefile 的规则 **4.1 一个例子** 通过一个具体的示例来展示如何使用规则: ```makefile all: a b a: c d echo "Building a" b: e f echo "Building b" c: g echo "Building c" d: echo "Building d" e: h echo "Building e" f: i echo "Building f" g: echo "Building g" h: echo "Building h" i: echo "Building i" ``` 这个例子展示了如何使用规则来组织复杂的构建过程。 **4.2 规则语法** 规则的基本语法是 `target : prerequisites`,后跟一系列的命令。命令以 `tab` 开头,表示该命令属于当前规则。 **4.3 依赖的类型** - **显式依赖**:在规则中明确指定的依赖关系。 - **隐式依赖**:基于文件扩展名自动推导出的依赖关系。 - **模式依赖**:使用通配符来匹配多个文件的依赖关系。 **4.4 文件名使用通配符** - **4.4.1 通配符使用举例**:例如,使用 `*` 来匹配任意长度的字符串。 - **4.4.2 通配符存在的缺陷**:通配符可能匹配到意料之外的文件。 - **4.4.3 函数 wildcard**:使用 `wildcard` 函数来生成文件列表。 **4.5 目录搜寻** - **4.5.1 一般搜索(变量 VPATH)**:通过设置 `VPATH` 变量来指定搜索目录。 - **4.5.2 选择性搜索(关键字 vpath)**:使用 `vpath` 关键字来指定特定的搜索路径。 - **4.5.3 目录搜索的机制**:描述了 GNU make 如何搜索文件的详细机制。 - **4.5.4 命令行和搜索目录**:解释如何通过命令行选项来控制搜索行为。 - **4.5.5 隐含规则和搜索目录**:讨论隐含规则与目录搜索的关系。 - **4.5.6 库文件和搜索目录**:介绍如何处理库文件的搜索。 **4.6 Makefile 伪目标** 伪目标用于表示抽象的任务,不对应实际的文件,如 `clean`、`install` 等。 **4.7 强制目标(没有命令或依赖的规则)** 强制目标即使其依赖项较新也不会重新构建,常用于定义构建的最终目标。 **4.8 空目标文件** 空目标文件用于表示没有实际内容的目标文件,通常用于表示一个状态或事件。 **4.9 Makefile 的特殊目标** 特殊目标具有特殊的行为,如 `PHONY` 目标等。 **4.10 多目标** 一个规则可以有多个目标,用于同时构建多个文件。 **4.11 多规则目标** 一个目标可以出现在多个规则中,用于实现不同的构建策略。 **4.12 静态模式** - **4.12.1 静态模式规则的语法**:描述了如何定义静态模式规则。 - **4.12.2 静态模式和隐含规则**:讨论静态模式规则与隐含规则的交互。 **4.13 双冒号规则** 双冒号规则用于定义额外的依赖关系,而不会覆盖已有的规则。 **4.14 自动产生依赖** GNU make 支持自动检测文件间的依赖关系,并据此生成相应的规则。 #### 五、规则的命令 **5.1 命令回显** GNU make 可以在执行命令之前显示命令,方便调试。 **5.2 命令的执行** 命令按照 Makefile 文件中的顺序依次执行。 **5.3 并发执行命令** GNU make 支持并发执行命令,提高构建效率。 **5.4 命令执行的错误** GNU make 会报告命令执行过程中的错误,并根据错误类型采取相应措施。 **5.5 中断 make 的执行** 可以通过在命令中添加 `break` 命令来中断 make 的执行流程。 **5.6 make 的递归执行** GNU make 支持递归调用自身,以实现更复杂的构建逻辑。 **5.7 定义命令包** 可以将一组相关的命令定义为命令包,便于管理和维护。 **5.8 空命令** 空命令用于表示无需执行任何实际命令的情况。 #### 六、Makefile 中的变量 **6.1 使用变量** 变量用于简化 Makefile 文件的编写,提高可维护性。 **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 指示符** 用于在命令行中覆盖 Makefile 文件中定义的变量。 **6.8 多行定义** 描述了如何定义跨多行的变量。 **6.9 系统环境变量** GNU make 支持引用系统环境变量。 **6.10 目标指定变量** 允许为特定的目标定义变量。 **6.11 模式指定变量** 允许为满足特定模式的目标定义变量。 #### 七、Makefile 的条件执行 **7.1 一个例子** 通过一个具体的例子来演示如何使用条件语句。 **7.2 条件判断的基本语法** 描述了条件语句的基本语法和用法。 **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 TEXT)**:获取列表中的第一个元素。 通过以上详细说明,我们可以看到 GNU make 是一个功能强大的工具,不仅提供了丰富的规则和变量机制,还支持复杂的条件判断和内嵌函数,使得自动化构建过程变得简单高效。对于 Linux 程序员来说,掌握 GNU make 的使用方法是非常重要的。
剩余198页未读,继续阅读
- 粉丝: 0
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- springboot172基于springboot的二手车交易系统的设计与实现.zip
- springboot177健身房管理系统.zip
- springboot176基于Spring Boot的装饰工程管理系统.zip
- springboot175图书管理系统.zip
- springboot179基于javaweb的流浪宠物管理系统的设计与实现.zip
- springboot178智能学习平台系统.zip
- springboot180基于spring boot的医院挂号就诊系统.zip
- springboot183基于java的公寓报修管理系统.zip
- springboot182基于springboot的网上服装商城.zip
- springboot181基于springboot的乐享田园系统.zip
- 光伏储能vsg同步发电机simulink模型 含有无功指令+逆变器功率控制 视频讲解 出光伏储能VSG仿真simulink模型 光伏储能联合并网 mppt扰动观察法追踪 功率指令可调,有功无功设
- springboot185基于vue.js的客户关系管理系统(crm)的设计与实现.zip
- springboot186人格障碍诊断系统.zip
- springboot184基于springboot的校园网上店铺的设计与实现.zip
- springboot187社区养老服务平台的设计与实现.zip
- springboot188基于spring boot的校园商铺管理系统.zip