4. Buildroot基础配置:从目录结构到图形化配置
说实话,很多刚接触Buildroot的朋友,第一反应就是「这目录怎么这么多?」。我当年也是这样,对着解压出来的文件夹愣了半天。别急,咱们一步步来,先把Buildroot的「骨架」摸清楚。
4.1 Buildroot目录结构:你得知道每个文件夹是干嘛的
Buildroot的目录设计其实很有章法。我个人习惯把它分成三类:核心工具、配置层、输出层。下面这张图能帮你快速建立整体认知。
嗯,这里要注意:output/ 目录是编译时自动生成的,你第一次 make 之前它并不存在。我见过有人把 output 提交到 Git 仓库,结果每次编译都冲突——千万别这么干。
| 目录/文件 | 作用 | 我常用的操作 |
|---|---|---|
| package/ | 软件包构建规则(.mk + Config.in) | 添加新包时在这里建目录 |
| configs/ | 板级默认配置 | 复制一份改名为自己的板子 |
| board/ | 板级文件(设备树、分区表等) | 放自己写的 .dts 和分区脚本 |
| output/images/ | 最终固件(uboot.img, rootfs.ext4 等) | 编译完直接去这里拿镜像 |
| dl/ | 源码包缓存 | 团队共享时,我会把 dl 目录软链到 NAS |
board/ 下建一个以板子型号命名的目录,把所有板级文件扔进去。这样换项目时,直接拷贝整个目录就行,不会乱。
4.2 make menuconfig:图形化配置入门
配置Buildroot最直观的方式就是 make menuconfig。它基于 Kconfig 框架,跟 Linux 内核配置是同一套东西。你想想看,如果你配过内核,那上手这个基本零成本。
# 在 Buildroot 根目录执行
$ make menuconfig
执行后会弹出一个蓝底白字的界面。上下键移动,回车进入子菜单,空格或 Y 键选中,N 键取消。我个人觉得最常用的快捷键就这几个:
- Y —— 将包编译进固件(
[*]) - M —— 编译为模块(
[M]),仅内核模块有效 - N —— 不编译
- ? —— 查看帮助,里面经常有依赖关系和版本说明
- / —— 搜索,输入关键词快速定位配置项
Save,默认保存为 .config。我刚开始用的时候,经常忘了保存就直接 Exit,结果白配一场。后来养成了习惯:改完配置立刻按两下 Tab 选 Save。
4.3 Target options 详解:你的目标平台长什么样
进入 Target options,这里定义的是你最终系统要跑在什么硬件上。说白了,就是告诉Buildroot:「我要给一块什么样的芯片做系统」。
对于 Rockchip 平台,我一般这样配:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Target Architecture | ARM (little endian) | Rockchip 芯片都是 ARM 架构 |
| Target Binary Format | ELF | Linux 标准格式,不用改 |
| Target Architecture Variant | cortex-a72 / cortex-a53 等 | 根据具体芯片选,RK3588 选 cortex-a72 |
| Target ABI | EABIhf | 硬浮点,性能更好 |
| Floating point strategy | NEON/VFPv4 | Rockchip 芯片都支持 NEON 指令集 |
| ARM instruction set | ARM | Thumb2 也可以,但 ARM 模式兼容性更好 |
这里有个坑:Target Architecture Variant 选错了,编译出来的工具链可能无法运行。我之前给 RK3568 做系统时,不小心选成了 cortex-a72,结果跑起来总出 SIGILL 信号。查了半天才发现是芯片不支持某些指令。RK3568 是 cortex-a55,得选对应的变体。
快速查芯片架构的方法:
# 在板子上执行
$ cat /proc/cpuinfo | grep "model name"
# 或者查芯片手册,Rockchip 的 TRM 里会写明 CPU 核心类型
4.4 Build options 详解:控制编译过程的「开关」
Build options 这部分,说白了就是告诉Buildroot「怎么编译」。它不决定系统里装什么软件,但决定了编译速度、调试难度和最终镜像的大小。
我挑几个最常用的说说:
| 配置项 | 我的推荐 | 为什么这么设 |
|---|---|---|
| Number of jobs to run simultaneously | CPU核心数 × 1.5 | 充分利用多核,我 8 核机器设 12 |
| Enable compiler cache | ON | 二次编译能省 50% 时间,强烈推荐 |
| Build packages with debugging symbols | 开发板 ON / 量产 OFF | 调试时需要,量产时关掉能省空间 |
| strip target binaries | ON | 去掉符号表,根文件系统能小 30% 以上 |
| gcc optimization level | Os(优化大小) | 嵌入式设备存储有限,Os 比 O2 更实用 |
| Download dir | $(TOPDIR)/dl | 默认就行,团队协作可以改到共享路径 |
/dev/shm/ccache。这样编译速度还能再快一截。不过要注意,内存盘重启就没了,适合连续多次编译的场景。
还有一个容易被忽略的:Enable large file support。如果你要处理超过 2GB 的文件系统镜像,这个必须打开。Rockchip 的根文件系统动不动就 1~2GB,加上应用数据很容易超限。我遇到过打包时提示文件大小溢出,查了半天才发现是这个选项没开。
4.5 配置文件的保存与复用
配置完成后,.config 文件会保存在 Buildroot 根目录。但我不建议直接拿它做版本管理。更好的做法是生成 defconfig:
# 保存当前配置为板级默认配置
$ make savedefconfig
# 这会生成一个 defconfig 文件,内容更精简
# 或者手动复制
$ cp .config configs/my_rockchip_defconfig
为什么推荐 defconfig?因为 .config 里包含了所有默认值的选项,文件很大。而 defconfig 只保存你修改过的选项,干净利落。下次编译时直接用:
$ make my_rockchip_defconfig
$ make
make olddefconfig 来更新配置。
好了,这一章的内容就这些。Buildroot 的配置其实不复杂,关键是理解每个选项背后的含义。你配过一两次之后,就会发现它比手动搭建交叉编译环境省心太多了。