GNU make解析Makefile的过程与变量取值

需积分: 34 34 下载量 44 浏览量 更新于2024-08-10 收藏 1.45MB PDF 举报
"本文介绍了GNU Make工具如何解析Makefile文件,特别是关于变量取值的规则以及make执行过程的两个阶段。" 在编程世界中,`make`是一个强大的自动化构建工具,常用于编译C/C++等语言的项目。GNU Make是其中最常用的版本,它的执行流程分为两个阶段: 1. **第一阶段**:读取所有指定的makefile文件,包括通过`MAKEFILES`变量、`include`指令和`-f (--file)`命令行选项指定的文件。在这个阶段,make会初始化所有变量,定义明确规则和隐含规则,并建立目标与依赖之间的依赖关系链表。 2. **第二阶段**:基于第一阶段构建的依赖关系,make确定哪些目标需要更新,并使用相应的规则去重建这些目标。这个阶段涉及到变量和函数的延迟展开,即在需要时才进行计算。 理解这两个阶段对于编写Makefile至关重要,因为它影响到变量和函数的展开时机。变量和函数的展开分为两种类型:立即展开(在第一阶段完成)和延迟展开(在第二阶段或使用时展开)。 **变量取值规则**: - `IMMEDIATE = DEFERRED`:这种赋值方式是延迟展开的,变量DEFERRED的值在实际使用时才计算。 - `IMMEDIATE ?= DEFERRED`:同样,条件赋值也是延迟展开。 - `IMMEDIATE := IMMEDIATE`:使用双等号`:=`定义的变量是立即展开的,其右边的表达式会在定义时立即计算。 - `IMMEDIATE += DEFERRED or IMMEDIATE`:追加赋值时,如果之前变量是用`:=`定义的,视为立即展开;否则,为延迟展开。 `define`指令用于定义多行变量,其内部的内容是立即展开的。`endef`标记定义的结束。 学习`make`的执行过程,尤其是变量展开的规则,能够帮助编写出更高效、更易维护的Makefile。随着阅读和实践的深入,你将逐步掌握make的全部操作。例如,了解何时使用立即展开和延迟展开,可以避免因错误的变量处理导致的构建问题。 `make`的其他功能包括条件语句、规则定义、通配符匹配、目录搜索、静态模式规则等,这些都在`GNUmake中文手册`中有所阐述。手册中的章节如`Makefile规则`提供了关于如何编写规则、处理依赖关系、使用通配符以及目录搜索的详细信息,这些都是构建复杂项目时不可或缺的知识。 通过学习这个手册,开发者可以有效地利用`make`自动化构建流程,提高开发效率,减少手动编译和链接的繁琐工作。掌握这些知识对于任何涉及编译的软件工程都是必要的。