GNU make中文手册v3.8
### GNU make中文手册v3.8 知识点解析 #### 概述 GNU Make是一款功能强大的自动化构建工具,广泛应用于软件开发过程中。本手册详细介绍了GNU make v3.8版本的功能、工作原理以及如何编写Makefile文件。通过学习本手册,读者可以深入理解make的工作流程,并能够编写出高效且灵活的Makefile。 #### Makefile简介 **Makefile**是make程序使用的配置文件,它定义了构建项目的规则和目标。每个Makefile都由一系列规则组成,这些规则告诉make如何更新文件以及执行必要的构建步骤。 #### Makefile规则介绍 Makefile中的每条规则都定义了一个目标及其依赖项,以及用于构建该目标的一系列命令。规则的基本结构如下: ``` target: prerequisites command ``` - **target**:指明规则的目标文件。 - **prerequisites**:列出创建目标文件所需的文件。 - **command**:一组用来更新目标文件的Shell命令。 #### 简单的示例 一个简单的Makefile示例可能如下所示: ```make all: hello @echo "Building hello world" hello: main.o gcc -o hello main.o main.o: main.c gcc -c main.c ``` 此示例定义了三个规则:`all`、`hello` 和 `main.o`。其中,`all` 规则指定了默认构建目标为 `hello`;`hello` 规则指定了构建 `hello` 所需的依赖为 `main.o` 并给出了相应的构建命令;`main.o` 规则指出了如何从源代码 `main.c` 构建 `main.o` 文件。 #### make如何工作 1. **解析Makefile**:make程序读取Makefile文件,解析其中的规则和变量。 2. **确定目标**:make确定需要构建的目标。如果Makefile中有多个目标,可以指定特定目标来构建。 3. **检查依赖关系**:make检查目标文件是否比其依赖文件更旧,如果是,则执行对应的构建命令。 4. **执行构建命令**:根据规则中的命令来更新文件。 #### 指定变量 Makefile中可以通过以下方式定义变量: ```make VAR = value ``` 或者使用以下格式进行赋值: ```make VAR := value ``` - **等号赋值** (`VAR = value`):表示递归展开式变量,在使用时才被展开。 - **冒号等号赋值** (`VAR := value`):表示直接展开式变量,在定义时立即展开。 例如: ```make CC = gcc CFLAGS = -Wall all: hello $(CC) $(CFLAGS) -o hello main.o ``` #### 自动推导规则 GNU make支持隐含规则(自动推导规则),它允许make根据目标文件的扩展名自动选择适当的构建命令。例如,当目标文件扩展名为`.o`而依赖文件扩展名为`.c`时,make将自动使用`gcc -c`命令进行编译。 #### 另类风格的makefile 除了基本的Makefile写法之外,还可以使用更加复杂的方式来组织Makefile,例如通过包含其他Makefile文件、使用复杂的条件语句等。 #### 清除工作目录过程文件 通常在Makefile中会定义一个名为`clean`的规则,用于删除构建过程中产生的中间文件。例如: ```make clean: rm -f *.o hello ``` #### Makefile总述 - **Makefile的内容**:Makefile可以包含规则、变量定义以及其他指令。 - **makefile文件的命名**:Makefile文件通常命名为`Makefile`或`makefile`。 - **包含其他makefile文件**:可以使用`include`指令来引入其他Makefile文件。 - **变量MAKEFILES**:指定要包含的Makefile文件列表。 - **变量MAKEFILE_LIST**:记录所有被包含的Makefile文件的列表。 - **其他特殊变量**:如`$@`代表目标文件名,`$<`代表第一个依赖文件名等。 - **makefile文件的重建**:如果Makefile文件本身被修改,make会重新读取并解析Makefile。 - **重载另一个makefile**:可以在Makefile中使用`include`指令多次来重载其他Makefile文件。 - **make如何解析makefile文件**: - **变量取值**:变量可以递归展开或直接展开。 - **条件语句**:如`ifeq`、`ifdef`等用于条件执行。 - **规则的定义**:定义构建目标及其依赖关系。 #### Makefile规则 - **规则语法**:定义了如何构建目标文件及其依赖关系。 - **依赖的类型**:可以是文件依赖,也可以是伪目标。 - **文件名使用通配符**:可以使用通配符来匹配多个文件。 - **目录搜寻**:通过设置变量`VPATH`或使用关键字`vpath`来指定搜索路径。 - **Makefile伪目标**:如`all`、`clean`等,这些目标没有对应的文件,主要用于组织构建过程。 - **强制目标**:即使依赖文件不存在也会尝试构建的目标。 - **空目标文件**:用于表示某个目标无需构建即可视为最新的情况。 - **Makefile的特殊目标**:如`.PHONY`等,用于定义伪目标。 - **多目标**:一条规则可以有多个目标。 - **多规则目标**:一个目标可以被多个规则共享。 - **静态模式**:用于描述一组相似的目标文件的构建规则。 - **双冒号规则**:用于定义多重依赖关系。 - **自动产生依赖**:通过特定的命令自动计算依赖关系。 #### 规则的命令 - **命令回显**:显示执行的命令。 - **命令的执行**:命令按顺序执行。 - **并发执行命令**:使用`-j`选项来并行执行命令。 - **命令执行的错误**:遇到错误时的处理方式。 - **中断make的执行**:使用`-k`选项来控制make在遇到错误时是否继续执行。 - **make的递归执行**:在Makefile中调用make来执行其他Makefile。 - **定义命令包**:将一系列命令打包为一个单元。 - **空命令**:表示无需执行任何命令。 #### Makefile中的变量 - **变量的引用**:使用`$(VAR)`或`$VAR`来引用变量。 - **两种变量定义**: - **递归展开式变量**:定义时保留原始形式,使用时才展开。 - **直接展开式变量**:定义时立即展开。 - **变量的高级用法**:如替换引用、套嵌引用等。 - **变量取值**:如何获取变量的实际值。 - **如何设置变量**:包括在Makefile中定义、在命令行中传递等方式。 - **追加变量值**:向已有变量追加新的值。 - **override指示符**:覆盖已定义的变量值。 - **多行定义**:如何定义跨多行的变量值。 - **系统环境变量**:如何在Makefile中引用环境变量。 - **目标指定变量**:为特定的目标定义变量。 - **模式指定变量**:为满足某种模式的目标定义变量。 #### Makefile的条件执行 - **条件判断的基本语法**:如`ifeq`、`ifdef`等用于条件执行。 - **标记测试的条件语句**:用于比较字符串、数字等。 #### make的内嵌函数 - **函数的调用语法**:使用`$(函数名(参数))`的形式调用。 - **文本处理函数**:提供了一系列用于文本处理的功能,如`subst`、`patsubst`等。 以上内容概述了GNU make v3.8版本的核心概念和技术要点,通过学习这些知识点,读者可以更加熟练地使用GNU make来进行项目构建和管理。






























剩余198页未读,继续阅读


- 粉丝: 92
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源


