在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量的定义、指示符和注释
Makefile 中第一个规则之后的所有以[Tab]字符开始的的行,make 程序都会将其给系统的shell 程序去解释执行
可以在shell中直接make name makefile将使用默认规则:将name.c编译连接成name
使用指示符包含进来的Makefile中,如果存在变量或者函数的引用。它们将会在包含它们的Makefile中被展开
通常指示符“include”用在以下场合:
1. 有多个不同的程序,由不同目录下的几个独立的Makefile来描述其创建或者更新规则。它们需要使用一组通用的变量定义。通用的做法是将这些共同使用的变量或者模式规则定义在一个文件中 ,在需要使用的Makefile中使用指示符“include”来包含此文件。
2. 当根据源文件自动产生依赖文件时;我们可以将自动产生的依赖关系保存在另外一个文件中,主Makefile使用指示符“include”包含这些文件。这样的做法比直接在主Makefile中追加依赖文件的方法要明智的多。其它版本的make已经使用这种方式来处理。
环境变量MAKEFILES可以用来在递归调用makefile中通信
执行命令“make
–f mfile –n foo”首先会试图重建“mfile 文件”、并重新读取它,之后会打印出更新目标“foo”规则中所定义的命令但不执行此命令。
总结:make的执行过程如下:
1. 依次读取变量“MAKEFILES”定义的 makefile文件列表
2. 读取工作目录下的 makefile文件(根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到那个就读取那个)
3. 依次读取工作目录 makefile文件中使用指示符“include”包含的文件
4. 查找重建所有已读取的 makefile 文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此 makefile文件,完成以后从第一步开始重新执行)
5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
7. 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
8. 执行“终极目标”所在的规则