4. Buildroot基础配置:从目录结构到图形化配置

说实话,很多刚接触Buildroot的朋友,第一反应就是「这目录怎么这么多?」。我当年也是这样,对着解压出来的文件夹愣了半天。别急,咱们一步步来,先把Buildroot的「骨架」摸清楚。

4.1 Buildroot目录结构:你得知道每个文件夹是干嘛的

Buildroot的目录设计其实很有章法。我个人习惯把它分成三类:核心工具、配置层、输出层。下面这张图能帮你快速建立整体认知。

Buildroot 目录结构总览 buildroot/ 核心工具 配置层 输出层 package/ toolchain/ support/ configs/ Config.in board/ output/ dl/ host/ 关键目录说明 • package/:所有软件包的构建脚本和补丁,按包名分目录 • configs/:官方预置的板级配置文件,如 rockchip_xxx_defconfig • board/:板级支持文件,包括设备树、分区表、启动脚本 • output/:编译产物,包括 images/(镜像)、build/(编译中间文件) • dl/:下载的源码包缓存,避免重复下载

嗯,这里要注意: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 默认就行,团队协作可以改到共享路径
关于 ccache 的配置:我习惯把 ccache 的缓存目录设到内存盘上,比如 /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
避坑:不同版本的 Buildroot,配置项可能会有变化。我试过把 2023.02 的 .config 直接拿到 2024.02 上用,结果 make 报了一堆错。所以跨版本时,建议用 make olddefconfig 来更新配置。

好了,这一章的内容就这些。Buildroot 的配置其实不复杂,关键是理解每个选项背后的含义。你配过一两次之后,就会发现它比手动搭建交叉编译环境省心太多了。