文章目录
- 一、概述
- 二、形象比喻:建筑工地
- 三、GNU Make 核心机制
- 3.1 规则语法
- 3.2 SDK 顶层 Makefile 核心变量
- 3.3 Make 执行流程
- 四、Kbuild 内核构建系统
- 4.1 核心变量
- 4.2 Kbuild 编译流程
- 4.3 内核顶层 Makefile 关键变量
- 五、SDK 中 Make 与 build.sh 的协作
- 六、实际调试技巧
- 6.1 查看 Make 变量展开
- 6.2 Kbuild 条件编译追踪
- 6.3 SDK 编译日志位置
- 📝 本章小结
- 核心概念对比
- 🏠 课后练习
上一章搞清楚了交叉编译工具链–arm-linux-gnueabihf-gcc是怎么回事、为什么要"交叉"编译。工具链有了,接着一个自然的问题:SDK 里几百上千个.c,到底是谁在指挥它们按什么顺序编、哪些编进内核、哪些编成模块、哪些压根不编?答案就是 GNU Make 和 Kbuild。
这章解决四个问题:make命令怎么从Makefile里找到规则、怎么决定先编谁后编谁;Kbuild 的obj-y、obj-m变量怎么控制哪些代码参与编译;Makefile和Kconfig到底什么关系,为什么总是成对出现;只改一个.c文件然后增量编译,make 怎么知道只重编这一个、不全部重来。开讲前先在内核目录翻一个Makefile,比如drivers/net/ethernet/stmicro/stmmac/Makefile,看一眼那行obj-$(CONFIG_STMMAC_ETH) += stmmac.o,带着疑问往下听,讲完就懂它什么意思。
一、概述
整个 SDK 的编译由两套构建系统协作完成:GNU Make 负责顶层调度,Kbuild 负责内核和 U-Boot 内部的模块化编译。
Make 是通用的,任何 C/C++ 项目都能用;Kbuild 是 Linux 内核专用的,可以理解为 Make 的"上层扩展"。SDK 里 M