#Makefile#Makefile过程分析

make的执行过程分为两个阶段。
第一阶段:读取所有的makefile文件(包括“MAKEFILES”变量指定的,指示符“include”指定的,以及命令行选项“-f”指定的makefile文件),内建所有的变量,明确规则和
隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。
第二阶段:根据第一个阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。

理解make执行过程的两个阶段是很重要的。它能帮助我们更深入的了解执行过程中变量以及函数是如何被展开的。变量和函数的展开问题是书写Makefile时容易犯错误和引起大家迷惑的地方之一。本节将对这些不同的结构的展开阶段进行简单的总结。首先,明确以下基本的概念;在make执行的第一阶段中如果变量和函数被展开,那么称此展开是“立即”的,此时所有的变量和函数被展开在需要构建的结构链表的对应规则中。其他的展开称之为“延后”的,这些变量和函数不会被“立即”展开,而是知道后续某些规则需要使用时或者在make处理的第二阶段它们才会被展开。
一、变量取值
变量定义解析的规则如下:

IMMEDIATE = DEFERRED
IMMEDIATE ?= DEFERRED
IMMEDIATE := IMMEDIATE
IMMEDIATE += DEFERRED or IMMEDIATE
define

IMMEDIATE
DEFERRED
endif
当变量使用追加符(+=)时,如果此前这个变量时一个简单变量(使用:=定义的)则认为它是立即展开的,其他情况时都被认为是“延后”展开的变量。
二、条件语句
所有使用到条件语句在产生分支的地方,make程序会根据预设条件将正确地分支展开。就是说条件分支的展开是“立即”的。其中包括:ifdef,ifeq,ifndef,ifneq 所确定的所有分支命令。
三、规则的定义
所有的规则在make执行时,都按照如下的模式展开:
IMMEDIATE:IMMEDIATE;DEFERRED
DEFERRED

其中,规则中目标和依赖如果引用其他的变量,则被立即展开。而规则的命令行中的变量引用会被延后展开。此模板适合所有的规则,包括明确规则、模式规则、后缀规则、静态模式规则。

总结
make的执行过程如下:
1、一次读取变量“MAKEFILES”定义的makefile文件列表
2、读取工作目录下的makefile文件(根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到哪个就读取哪个)
3、依次读取工作目录makefile文件中使用指示符“include”包含的文件
4、查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取

的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)
5、初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
6、根据“终极目标”以及其他目标的依赖管理建立依赖关系链表
7、执行除“终极目标”以外的所有目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则锁定义的命令重建目标文件)
8、执行“终极目标”所在的规则

自我总结:
每个make命令在调用时都会执行上述过程(可以通过make -d来查看执行过程),比如在命令行调用make -C或者make -f等;如果一个依赖规则的变量在执行之前的文件并不存在,可以使用make -C或者make -f重新进入当前makefile,这样所有的变量又会重新生成一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值