GNU下Makefile执行顺序

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”定义的makefile文件列表
在当前环境中查看一下有没有定义 “MAKEFILES”这个环境变量, 如果环境变量MAKEFILES被定义了,那么make会在读取其它makefile之前,先读取MAKEFILE定义的列表中的名字(由空格分隔)。建议大家不要去定义这个环境变量,因为我们并不太了解这个变量的使用,那么经常会造成一些奇怪的错误。
(2)读取工作目录下的makefile文件
         指定 makefile 文件名的方法是使用‘ -f ’或‘ --file ’选项(‘ --makefile ’也能工作)。例如,‘ -f altmake ’说明名为‘ altmake ’的文件作为 makefile 文件。 如果您不使用‘-f’或‘--file’选项,缺省的是按次序查找 ‘GNUmakefile' , ‘makefile' , ‘Makefile' ,使用这三个中第一个能够找到的存在文件或能够创建的文件。
(3) 依次读取工作目录makefile文件中使用指示符“include”包含的文件
比如在u-boot的主Makefile文件中可以找到下面这“include”,它就是将顶层目录下的config.mk文件包含到Makefile文件中。
linux下makefile的执行顺序

(4) 查找重建所有已读取的makefile文件的规则

(5)初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
    变量跟函数都比较熟悉了,那预设条件是指什么?就是条件语句啦!比如: ifeq... else....endif这样的条件语句,根据条件来确定执行分支。
(6)根据“终极目标”以及其他目标的依赖关系建立依赖关系链表

(7)  执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
(8) 执行“终极目标”所在的规则。

注意:make和shell script的执行区别。shell script 的执行方式是由上而下、由左而右。

猜你喜欢

转载自blog.csdn.net/wujiafei_njgcxy/article/details/78024013