### GNU Make中文手册知识点梳理 #### 一、概述与准备知识 **1.1 概述** GNU Make 是一种强大的工具,用于管理程序构建过程。它读取名为 Makefile 的文件来确定如何编译和链接程序。Makefile 中定义了各种规则和变量,指导 make 如何构建最终的可执行文件或库。 **1.2 准备知识** 在深入学习 GNU Make 之前,了解基本的 Unix/Linux 命令和 shell 脚本是很有帮助的。此外,熟悉 C/C++ 编程语言也会对理解 Makefile 构建过程有好处。 #### 二、GNU Make 介绍 **2.1 Makefile 简介** Makefile 是一个文本文件,包含了用于构建项目的规则和指令。这些规则指定了如何从源代码生成可执行文件或其他输出。 **2.2 Makefile 规则介绍** 每个 Makefile 规则通常包含一个目标、一个或多个依赖项以及一组命令。这些规则定义了如何更新目标文件。例如: ```make target: dependency command ``` **2.3 简单的示例** 一个简单的 Makefile 示例可能如下所示: ```make all: program program: main.o gcc -o program main.o main.o: main.c gcc -c main.c ``` **2.4 make 如何工作** 当运行 `make` 命令时,它会读取 Makefile 文件并根据其中的规则执行相应的命令。如果目标文件不存在或比其依赖项旧,则 make 会执行命令来更新该目标。 **2.5 指定变量** Makefile 可以包含变量定义,如: ```make CC = gcc CFLAGS = -Wall ``` 这些变量可以在规则中使用,例如: ```make all: program program: main.o $(CC) $(CFLAGS) -o program main.o ``` **2.6 自动推导规则** GNU Make 支持自动推导规则,这意味着它可以自动检测如何从一种文件类型转换为另一种文件类型。例如,如果 Makefile 包含: ```make %.o: %.c gcc -c $< -o $@ ``` 那么 make 可以自动处理 `.c` 文件到 `.o` 文件的转换。 **2.7 另类风格的 Makefile** 除了标准的 Makefile,还可以使用其他名称的文件,如 `GNUmakefile` 或 `makefile`。 **2.8 清除工作目录过程文件** 通过定义一个名为 `clean` 的规则,可以轻松地清理构建过程中产生的临时文件。例如: ```make clean: rm -f *.o program ``` #### 三、Makefile 总述 **3.1 Makefile 的内容** Makefile 文件通常包括: - 目标定义 - 依赖项列表 - 命令行 - 变量定义 **3.2 makefile 文件的命名** 默认情况下,make 会查找名为 `Makefile` 的文件。还可以指定其他名称的文件作为 Makefile 使用。 **3.3 包含其它 makefile 文件** 可以使用 `-include` 命令行选项或 `include` 指令来引入其他 Makefile 文件。例如: ```make include common.mk ``` **3.4 变量 MAKEFILES** `MAKEFILES` 变量用来指定 make 应该读取的额外 Makefile 文件。 **3.5 变量 MAKEFILE_LIST** `MAKEFILE_LIST` 变量包含 make 已读取的所有 Makefile 文件的列表。 **3.6 其他特殊变量** 还有一些特殊变量,如 `$@` (代表目标文件) 和 `$<` (代表第一个依赖文件)。 **3.7 makefile 文件的重建** 可以通过修改 Makefile 或其依赖文件来触发 makefile 的重建。 **3.8 重载另外一个 makefile** 可以使用 `make -f` 选项重新加载另一个 Makefile 文件。 **3.9 make 如何解析 makefile 文件** - **3.9.1 变量取值** - **3.9.2 条件语句** - **3.9.3 规则的定义** #### 四、Makefile 的规则 **4.1 一个例子** 通过具体的例子来展示如何定义和使用 Makefile 规则。 **4.2 规则语法** Makefile 规则的基本语法包括目标、依赖项和命令。 **4.3 依赖的类型** 依赖项可以是静态的也可以是动态的。动态依赖项通常由自动推导规则或用户定义的模式匹配规则来处理。 **4.4 文件名使用通配符** 通配符如 `*` 和 `?` 可以用来匹配文件名的一部分。 **4.5 目录搜寻** 通过 `VPATH` 变量或 `vpath` 关键字来指定搜索目录。 **4.6 Makefile 伪目标** 伪目标是指没有实际文件对应的 Makefile 目标,如 `clean` 或 `all`。 **4.7 强制目标** 强制目标是没有依赖项或命令的目标,它们总是被认为是“最新的”。 **4.8 空目标文件** 空目标文件是指那些没有依赖项也没有命令的目标。 **4.9 Makefile 的特殊目标** 有些目标具有特殊含义,如 `PHONY` 目标。 **4.10 多目标** 一个规则可以有多个目标。 **4.11 多规则目标** 一个目标可以被多个规则共享。 **4.12 静态模式** 静态模式规则允许使用通配符来定义模式匹配规则。 **4.13 双冒号规则** 双冒号规则允许一个目标有多个更新规则。 **4.14 自动产生依赖** 通过工具如 `gcc -MM` 或 `makedepend` 来自动生成依赖关系。 #### 五、规则的命令 **5.1 命令回显** 命令在执行前可以被回显出来。 **5.2 命令的执行** 命令按顺序执行,并且可以使用 shell 的功能。 **5.3 并发执行命令** 通过 `-j` 选项使 make 同时执行多个命令。 **5.4 命令执行的错误** 命令执行失败时,make 会停止执行后续命令。 **5.5 中断 make 的执行** 可以使用 `break` 命令来提前结束 make 的执行。 **5.6 make 的递归执行** 递归执行 make 可以用于构建复杂的项目结构。 **5.7 定义命令包** 通过 `define` 和 `endef` 关键字来定义命令包。 **5.8 空命令** 空命令表示该目标不需要任何动作即可视为是最新的。 #### 六、Makefile 中的变量 **6.1 变量的引用** 变量可以通过 `$()` 或 `${}` 来引用。 **6.2 两种变量定义(赋值)** - **6.2.1 递归展开式变量** - **6.2.2 直接展开式变量** - **6.2.3 定义一个空格** - **6.2.4 “?=” 操作符** **6.3 变量的高级用法** 包括变量替换引用和套嵌引用。 **6.4 变量取值** 如何从不同上下文中获取变量值。 **6.5 如何设置变量** 通过命令行选项、Makefile 文件或自动变量来设置变量。 **6.6 追加变量值** 如何在现有值的基础上添加新值。 **6.7 override 指示符** 如何覆盖已定义的变量值。 **6.8 多行定义** 如何在一个变量定义中包含多行内容。 **6.9 系统环境变量** 如何使用环境变量来定制 Makefile 的行为。 **6.10 目标指定变量** 如何为特定的目标定义变量。 **6.11 模式指定变量** 如何为符合特定模式的目标定义变量。 #### 七、Makefile 的条件执行 **7.1 一个例子** 通过具体示例来展示如何使用条件语句。 **7.2 条件判断的基本语法** 条件语句的基本语法,如 `ifeq`、`ifdef` 等。 **7.3 标记测试的条件语句** 如何使用条件语句来标记测试结果。 #### 八、make 的内嵌函数 **8.1 函数的调用语法** 函数的调用方式,如: ```make $(call function-name,arguments) ``` **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 $(filter-out PATTERN,TEXT)** 这些函数可以帮助在 Makefile 中进行更复杂的数据处理。 通过以上知识点的梳理,读者可以全面了解 GNU Make 的核心概念和用法,从而更好地利用这个工具来管理软件构建过程。
- 粉丝: 6
- 资源: 20
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Chrome代理 switchyOmega
- GVC-全球价值链参与地位指数,基于ICIO表,(Wang等 2017a)计算方法
- 易语言ADS指纹浏览器管理工具
- 易语言奇易模块5.3.6
- cad定制家具平面图工具-(FG)门板覆盖柜体
- asp.net 原生js代码及HTML实现多文件分片上传功能(自定义上传文件大小、文件上传类型)
- whl@pip install pyaudio ERROR: Failed building wheel for pyaudio
- Constantsfd密钥和权限集合.kt
- 基于Java的财务报销管理系统后端开发源码
- 基于Python核心技术的cola项目设计源码介绍