GNU make解析makefile的两个阶段-CFD数值模拟原理

需积分: 50 47 下载量 144 浏览量 更新于2024-08-08 收藏 1.24MB PDF 举报
"GNU make中文手册 ver-3.8" GNU make是用于自动化构建软件的工具,它通过解析Makefile文件来确定需要构建的目标及其依赖。理解make的工作原理和解析过程对于编写有效的Makefile至关重要。 在 GNU make 的执行过程中,整个流程可以分为两个阶段: 1. **第一阶段:读取与解析 makefile** 在这个阶段,make会读取所有指定的makefile文件,包括`MAKEFILES`变量指定的、`include`指令引入的以及`-f (--file)`命令行选项指定的文件。在这个过程中,它会处理变量定义、明确规则和隐含规则,建立目标与依赖之间的依赖关系结构链表。理解这一阶段是关键,因为在这个阶段,变量和函数的"立即"展开会发生。这意味着,如果变量和函数在这个阶段被用到,它们会被立即计算并在构建依赖关系链表时使用。 2. **第二阶段:目标更新与执行** 在依赖关系结构链表建立好之后,make会根据链表决定哪些目标需要更新,然后使用对应的规则来执行命令重建这些目标。在这个阶段,那些在第一阶段未"立即"展开的变量和函数,会在需要时进行"延后"展开,即在实际执行命令时才进行计算。 在编写Makefile时,区分变量和函数的"立即"和"延后"展开非常重要。正确的使用方式可以避免错误和混淆。例如,如果你希望一个变量在规则执行时才计算其值,那么应该使用延后展开的方式。反之,如果变量的值在解析Makefile时就需要确定,那么应该使用立即展开。 Makefile的基本结构包括目标、依赖和命令。规则通常由目标、依赖目标和命令组成,如: ```make target : dependency... command ``` `target`是需要构建的文件,`dependency...`是目标依赖的文件,`command`是在更新目标时执行的命令。 Makefile中的变量可以提前定义,也可以在运行时动态赋值。自动变量如`$@`表示当前目标,`$<`表示第一个依赖,这些都是在规则执行时展开的。 此外,`make`还支持条件语句(如`if`、`ifdef`等)和函数(如`$(patsubst)`、`$(filter-out)`等)来增强Makefile的逻辑和处理能力。 `make`的隐含规则是预定义的一些通用构建规则,如编译C程序时的`.c.o`规则。可以通过`vpath`来控制搜索依赖文件的目录,`VPATH`变量则全局地设置搜索路径。 理解`make`的工作原理和Makefile的编写规范,可以帮助开发者更高效地管理和构建项目,节省时间和资源。通过熟练掌握makefile的规则、变量和函数,可以编写出灵活、可维护的构建脚本。