核心
规则定义依赖关系
- 这里的依赖关系可以理解为修改时间的先后,也可以理解为文件依赖
- 执行文件依赖目标文件
- 目标文件依赖源文件以及头文件
特性/组成
- 规则
- 组成
- target 可以为文件,也可以为一个label,也可为多个文件
- pre
- 可空,无法形成依赖链,则必须手动调用,一般用于clean,install等目标
- command
- 一般为cc指令,但也支持linux的bash命令
- 类型
- 显式规则,即手动定义的规则
- 隐式规则,内部默认的规则
- .o 依赖同名的 .c,及目标文件可以只指定头文件依赖
- …
- 默认规则
- 可以手动指定,通过default target来定义
- default : defaulttarget(默认的target名)
- 默认为第一个target
- 可以手动指定,通过default target来定义
- 语法
- target : pre ; command
- target : pre 推荐使用方式
- tab(换行需要tab)command
- 组成
- 变量
作用类似于c的宏定义,只做替换,不做处理 - 文件指示
类似于include,用于模块化的编译,但是实际上作用不是太大,目前没遇到需要使用的场景 - 注释
使用#进行注释 - 其他特性
- 通配
- 伪目标(这个特性很重要) 不是文件的目标,一般用于定义任务,或者为目标定义别名
- 原始用法
- 用于目标和文件重名时,可以区分,因为目标不允许和文件重名
- .PHONY : target 不重名可以不用强制使用这个
- 高级用法
- 可以定义多个任务
- 伪目标也可以作为依赖,即可定义多个任务
- 如最佳实践中的build依赖binary和module,他们都属于伪目标。
- 伪目标也可以作为依赖,即可定义多个任务
- 可以定义多个任务
- 原始用法
- …
- 后续补充,但是这些列举的特性基本能支撑大型项目的编译
makefile处理生命周期
- 读取所有Makefile
- 读入被include的其他Makefile
- 初始化文件中的白你两
- 推到隐式规则,并分析所有规则
- 生成关系链
- 根据依赖关系,决定哪些文件重新生成
- 执行生成命令