
0 Preface/Foreword1 构建规则构建规则中的三要素目标target依赖dependancies / prerequisites命令commands三要素的关系可以简单归纳为为了生成目标需要哪些依赖文件并通过执行什么命令来完成。1.1 三要素的定义和角色1.1.1 目标目标相关描述如下定义要生成的最终产物或中间产物。形式通常是一个文件名可以是可执行文件main、目标文件main.o也可以是一个动作标签比如clean、install称为伪目标.PHONY角色目标是构建过程的输出。1.1.2 依赖依赖相关描述如下定义生成目标所必须的文件或另一个目标。形式源文件*.c, *.cpp、头文件*.h、库文件或者其他已生成的目标文件*.o。角色作为构建过程的输入。如果依赖文件比目标文件新依赖被修改过或者目标文件不存在Make就会认为目标“过期”需要重新构建。1.1.3 命令命令相关描述如下定义将依赖转换为目标的具体操作步骤。形式shell命令比如gcc -c main.c、 rf -f *.o .关键语法要求命令行的开头必须使用Tab键缩进不能使用空格否则Make会报错。1.2 三要素之间的逻辑关系Makefile的规则本质上是描述一个自动化构建流程逻辑如下触发条件Make工具检查目标文件是否存在以及依赖文件的最后修改时间是否晚于目标文件。执行判断目标不存在任意一个依赖文件比目标文件都更新文件修改时间目标是伪目标Phony Target结果命令执行完成后生成或更新目标文件。1.3 注意事项注意事项如下Tab键强制要求不能用空格替代否则会造成make工具读取makefile文件时候解析失败。依赖的完整性假设main.c中包含了utils.h那么main.o的依赖需要写成main.o : main.c utils.h。否则修改头文件时make不会重新编译对应的源文件导致构建错误。伪目标.PHONY例如clean这样的目标并不会对应实际文件如果不申明为伪目标.PHONY: clean并且路径下有一个名为clean的文件make会认为目标已是最新而拒绝执行删除命令。所以建议始终使用.PHONY声明非文件类目标。1.3.1 伪目标通过.PHONY进行设定的目标。1.4 自动变量为了简化Makefile的编写Make提供了自动变量$:代表当前规则的目标。$^:代表当前规则的所有依赖。$:代表当前规则的第一个依赖。1.5 构建三要素组合规则作为一个构建规则中的三要素不同场景会出现不同的组合方式不是所有场景三要素都必须存在具体情况如下面表格所示组合情况是否合法典型应用注意事项目标依赖命令是✅️标准构建规则NULL目标命令是✅️伪目标all, clean, install若非伪目标文件存在命令不会执行目标依赖是✅️依赖聚合、阻止隐含规则impicit rule仅触发依赖检查不执行shell命令目标是✅️占位符、配合隐含规则placeholder、coordinate若无隐含规则且文件不存在会报错