一个完整的Makefile中,包含有:显示规则、隐式规则、变量定义、指示符、注释、伪目标。
显示规则:它描述了在何种情况下如何更新一个或者多个目标文件。书写Makefile是需要明确的给出目标文件、目标依赖文件列表以及更新目标文件需要的命令(有些规则没有命令,这样的规则只是描述文件之间的依赖关系)
隐式规则:它是make根据目标文件(典型的是根据文件名的后缀)而自动推导出来的规则。make根据目标文件名,自动产生目标的依赖文件并使用默认的命令来对目标进行更新(建立一个规则)。
变量定义:使用一个字符或字符串代表一段文本串,当定义了一个变量后,Makefile后续需要使用此文本的地方,通过引用这个变量来实现对文本串的使用。
Makefile指示符:指示符指明在make程序读取Makefile文件过程中要执行的一个动作。包括:
- 读取一个文件,读取给定文件名的文件,将其内容作为Makefile文件中的一部分。(include filename)
- 决定(通常是根据一个变量的值)处理或忽略Makefile中的某一特定部分。 (ifeq )
- 多行定义。 (define ... endef )
注释:Makefile中 “#”字符后的内容作为注释内容处理。如果此行的第一个非空字符为“#”,那么此行为注释行。注释行的结尾如果有反斜线(\),那么下一行也被作为注释行。
伪目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时也会讲一个伪目标称为标签。讲一个目标声明为伪目标的方法是将它作为特殊目标 .PHONY的依赖。如: .PHONY : clean
这样目标“clean”就被声明为一个目标。
make的执行过程:
- 依次读取变量“MAKEFILES”定义的Makefile文件列表。
- 读取工作目录下的Makefile文件(根据命名的查找顺序“GNUmakefile” “makefile” “Makefile”)
- 依次读取工作目录Makefile文件中使用指示符“include”包含的文件
- 查找重建所有已读取的Makefile文件的规则(如果存在一个目标是当前读取的某一个Makefile文件,则执行此规则重建此Makefile文件,完成后从第一步看是重新执行)
- 第石化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
- 根据“终极目标”以及其他目标的依赖关键建立依赖关系链表
- 执行除“终极目标”以外的所有目标的规则(规则中人如果依赖文件中人一个文件的时间戳比目标文件新,则使用规则定义的命令重建目标文件)
- 执行“终极目标”所在的规则。