Gnu
make的执行过程分为两个阶段
第一阶段:读取所有的makefile文件(包括“MAKEFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(--file)”指定的makefile文件),内建的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。
第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。
make的执行过程如下:
1. 依次读取变量“MAKEFILES”定义的makefile文件列表
2.
读取工作目录下的makefile文件(缺省的是根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到那个就读取那个)
3. 依次读取工作目录makefile文件中使用指示符“include”包含的文件
4.
查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)
5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
7.
执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
8. 执行“终极目标”所在的规则
(1)
在当前环境中查看一下有没有定义“MAKEFILES”这个环境变量,如果环境变量MAKEFILES被定义了,那么make会在读取其它makefile之前,先读取MAKEFILE定义的列表中的名字(由空格分隔)。建议大家不要去定义这个环境变量,因为我们并不太了解这个变量的使用,那么经常会造成一些奇怪的错误。
(2)读取工作目录下的makefile文件
(3)
比如在u-boot的主Makefile文件中可以找到下面这“include”,它就是将顶层目录下的config.mk文件包含到Makefile文件中。
(4)
(5)初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
(6)根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
(7)
(8)
注意:make和shell script的执行区别。shell script 的执行方式是由上而下、由左而右。 |
|
来自: cherish_dokkem > 《script》