### GNUMake 使用手册知识点概览 #### 一、Makefile与GNUMake的基本概念 - **Makefile**: 是一种脚本文件,用于自动化构建软件项目。它包含了各种规则和命令,用来指导编译器如何编译源代码、链接目标文件等。 - **GNUMake**: 是一个开源的Make工具实现版本,广泛应用于GNU/Linux系统中,能够根据Makefile中的指令自动构建软件项目。 #### 二、Makefile文件介绍 - **规则的格式**: Makefile中最核心的部分是规则,每个规则由目标(target)、依赖(dependencies)和命令(commands)组成。 - **目标**: 规则的目标是指要构建的对象,通常是可执行文件或库文件。 - **依赖**: 目标依赖的文件列表,可以是源代码文件或其他中间文件。 - **命令**: 构建目标所需的Shell命令。 - **一个简单的Makefile示例**: ```make all: prog prog: prog.o foo.o gcc -o prog prog.o foo.o prog.o: prog.c prog.h gcc -c prog.c foo.o: foo.c foo.h gcc -c foo.c clean: rm -f prog *.o ``` - **make处理Makefile文件的过程**: 1. **解析Makefile**: 读取Makefile中的规则、变量和其他信息。 2. **决定做什么**: 根据目标文件的最后修改时间来判断是否需要重新编译。 3. **执行命令**: 对需要更新的目标文件执行相应的命令。 - **使用变量简化Makefile文件**: - 变量可以存储字符串、命令序列或其他变量的值。 - 例如: ```make CFLAGS = -g -Wall CC = gcc all: prog prog: prog.o foo.o $(CC) $(CFLAGS) -o prog prog.o foo.o ``` - **让make推断命令**: - make可以根据文件扩展名自动选择合适的编译命令。 - 隐含规则(implicit rule)是预定义的一组规则,用于推断编译命令。 - **另一种风格的Makefile文件**: - 可以使用模式规则(pattern rule)和静态模式规则(static pattern rule)来简化Makefile。 - **在目录中删除文件的规则**: - 通过定义clean目标来清理临时文件。 #### 三、编写Makefile文件 - **Makefile文件的内容**: - 规则、变量定义、注释等。 - **Makefile文件的命名**: - 默认情况下,make会查找名为`Makefile`或`makefile`的文件。 - **包含其他的Makefile文件**: - 使用`include`指令可以包含其他Makefile文件。 - 示例: ```make include common.mk ``` - **变量MAKEFILES**: - MAKEFILES变量包含了make读取的所有Makefile文件的名称。 - **Makefile文件重新生成的过程**: - 如果Makefile文件自身也需要更新,可以使用特殊的规则来实现。 - **重载其他Makefile文件**: - 使用`include`指令可以按需加载额外的Makefile文件。 - **make读取Makefile文件的过程**: - make默认会按照特定顺序查找Makefile文件,并读取它们。 #### 四、编写规则 - **规则的语法**: - 每个规则由目标、依赖和命令组成。 - **在文件名中使用通配符**: - 通配符(`*`, `?`, `[...]`)可用于匹配文件名。 - 示例: ```make %.o: %.c gcc -c $< ``` - **在目录中搜寻依赖**: - 使用`VPATH`变量可以让make在指定目录中搜索依赖文件。 - **假想目标**: - 假想目标(phony targets)是一些不对应于实际文件的目标,通常用于执行某些操作。 - **没有命令或依赖的规则**: - 有些规则可能只定义了目标,但没有具体的依赖或命令。 - **使用空目录文件记录事件**: - 通过创建空文件来标记某些事件的发生。 - **内建的特殊目标名**: - 特殊目标如`.PHONY`、`.SUFFIXES`等。 - **具有多个目标的规则**: - 单个规则可以有多个目标。 - **具有多条规则的目标**: - 一个目标可以在不同的规则中被定义。 - **静态格式规则**: - 静态格式规则用于定义一组目标文件的构建规则。 - **双冒号规则**: - 双冒号规则允许为同一个目标定义多个规则。 - **自动生成依赖**: - make可以根据源文件自动生成依赖关系。 #### 五、在规则中使用命令 - **命令回显**: - 在执行命令前,make会打印出将要执行的命令。 - **执行命令**: - make会按照规则中的命令顺序执行Shell命令。 - **并行执行**: - 使用`-j`选项可以让make并行执行多个命令。 - **命令错误**: - 如果命令执行失败,make会停止并报告错误。 - **中断或关闭make**: - 使用Ctrl+C可以中断make的执行。 - **递归调用make**: - 在一个makefile中调用另一个makefile的过程称为递归调用。 - **定义固定次序命令**: - 有些命令需要按特定顺序执行。 - **使用空命令**: - 可以使用空命令来跳过某些步骤。 #### 六、使用变量 - **变量引用基础**: - 变量通过`$(name)`或`$name`的方式引用。 - **变量的两个特色**: - 变量可以定义为单个单词或多个单词的序列。 - **变量高级引用技术**: - 包括替换引用、嵌套变量引用等。 - **变量取值**: - 可以使用函数来处理变量的值。 - **设置变量**: - 变量可以通过Makefile文件或命令行参数设置。 - **为变量值追加文本**: - 可以向现有变量值添加文本。 - **override指令**: - 用于在当前Makefile文件中覆盖之前定义的变量。 - **定义多行变量**: - 多行变量可以存储多行文本。 - **环境变量**: - make可以从环境中获取变量值。 - **特定目标变量的值**: - 可以为特定的目标定义变量值。 - **特定格式变量的值**: - 可以为特定的文件名模式定义变量值。 #### 七、Makefile文件的条件语句 - **条件语句的例子**: - 条件语句可以根据不同的条件执行不同的动作。 - **条件语句的语法**: - 使用`ifeq`, `ifdef`等关键字来定义条件语句。 - **测试标志的条件语句**: - 可以使用条件语句来测试变量是否已定义。 #### 八、文本转换函数 - **函数调用语法**: - 函数调用语法为`$(function(arg1, arg2, ...))`。 - **字符串替换和分析函数**: - 如`subst`, `patsubst`等。 - **文件名函数**: - 如`basename`, `dirname`等。 - **函数foreach**: - 用于迭代处理一组值。 - **函数if**: - 用于根据条件执行不同的动作。 - **函数call**: - 用于调用其他函数。 - **函数origin**: - 用于获取变量值的来源。 - **函数shell**: - 用于执行外部Shell命令。 - **控制Make的函数**: - 如`error`, `warning`等。 #### 九、运行make - **指定Makefile文件的参数**: - 可以通过命令行参数指定Makefile文件的位置。 - **指定最终目标的参数**: - 使用`make target`来指定最终的目标。 - **代替执行命令**: - 可以通过命令行参数改变默认的行为。 - **避免重新编译文件**: - 使用`-n`选项可以让make只打印将要执行的操作,而不实际执行。 - **变量重载**: - 可以通过命令行参数重载Makefile文件中的变量。 - **测试编译程序**: - 使用`-t`选项可以测试makefile的有效性。 - **选项概要**: - make提供了丰富的命令行选项来控制其行为。 #### 十、使用隐含规则 - **使用隐含规则**: - make提供了一组预定义的规则,称为隐含规则。 - **隐含规则目录**: - 隐含规则定义了不同文件类型之间的转换。 - **隐含规则使用的变量**: - 可以通过变量定制隐含规则的行为。 - **隐含规则链**: - 一个目标文件可能需要经过多个隐含规则来构建。 - **定义与重新定义格式规则**: - 可以定义新的隐含规则或重定义现有的隐含规则。 - **定义最新类型的缺省规则**: - 可以为新文件类型定义缺省规则。 - **过时的后缀规则**: - 旧版本的make使用后缀规则来定义隐含规则。 - **隐含规则搜寻算法**: - make使用一定的算法来决定哪个隐含规则适用于当前情况。 #### 十一、使用make更新档案文件 - **档案成员目标**: - 可以使用make来更新档案文件中的成员。 - **档案成员目标的隐含规则**: - make提供了用于更新档案文件成员的隐含规则。 - **使用档案的危险**: - 使用档案文件时需要注意一些潜在的问题。 - **档案文件的后缀规则**: - make提供了针对档案文件的后缀规则。 #### 十二、GNUmake的特点 - **特点包括**: - 并行构建支持。 - 文件名通配符支持。 - 条件语句支持。 - 函数支持等。 #### 十三、不兼容性和失去的特点 - **不兼容性**: - GNUmake与其他make版本可能存在一些不兼容的地方。 - **失去的特点**: - 一些老版本的功能可能不再支持。 #### 十四、Makefile文件惯例 - **makefile文件的通用惯例**: - 如文件命名、结构组织等。 - **makefile文件的工具**: - 介绍了一些常用的makefile工具。 - **指定命令的变量**: - 可以定义变量来指定命令。 - **安装路径变量**: - 定义了用于安装文件的路径变量。 - **用户标准目标**: - 用户可以定义自己的标准目标。 - **安装命令分类**: - 安装命令可以根据功能进行分类。 以上内容涵盖了GNUMake使用手册中的关键知识点,对于深入理解和使用GNUMake以及编写高效的Makefile文件具有重要的指导意义。
剩余63页未读,继续阅读
- 粉丝: 827
- 资源: 434
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助