4、Buildroot集成:Tina如何集成Buildroot、Buildroot配置(make menuconfig)、Target packages选择
好,咱们进入第四章。这一章聊的是Tina和Buildroot的集成。说白了,就是搞清楚Tina这个全志的官方SDK,到底是怎么把Buildroot这个开源构建系统“揉”进去的。你拿到一个Tina源码包,第一眼可能会懵——目录结构跟标准的Buildroot不太一样。别急,我带你捋一遍。
4.1 Tina与Buildroot的“联姻”方式
Tina并没有把Buildroot直接扔在根目录下,而是把它当作一个子模块来管理。你会在源码的根目录下看到一个 build 文件夹,里面才是真正的Buildroot核心。
我个人的理解是,全志在Buildroot外面又包了一层壳,这层壳负责处理芯片相关的配置、打包、分区表等等。所以,Tina的构建流程是:
- 先执行
source build/envsetup.sh加载环境。 - 然后
lunch选择你的方案(比如t113-mq-r)。 - 最后
make或者make menuconfig。
这个 make menuconfig 调用的,其实就是Buildroot的配置界面。但Tina在背后做了手脚——它把全志自己的配置项也塞进了这个菜单里。
关键点: Tina的 make menuconfig 打开的是 双重配置。第一层是Tina自己的顶层配置(比如选择哪个内核、哪个rootfs类型),第二层才是Buildroot的标准配置(比如选择哪些软件包)。
为什么会这样设计?我猜是为了降低门槛。你想想看,如果让开发者直接面对原生的Buildroot,光配置一个交叉编译链就能劝退一半的人。Tina把这部分自动化了,你只需要关心“我要装什么软件”就行。
4.2 配置界面:make menuconfig 实战
咱们实际操作一下。假设你已经 source 和 lunch 过了,在源码根目录下输入:
make menuconfig
你会看到一个蓝底白字的界面。这个界面跟Linux内核的配置界面长得几乎一样,但里面的内容全是Tina和Buildroot的选项。
我习惯先按 / 键搜索,比如我想加一个 ssh 服务,直接搜 openssh,就能定位到它在哪个菜单下。这个技巧能省不少时间。
配置项主要分几大类:
| 菜单路径 | 说明 | 我的建议 |
|---|---|---|
Target packages |
这是核心,选你要装的软件包 | 按需选择,别贪多 |
Kernel |
内核版本和模块配置 | 一般保持默认,除非你有特殊驱动 |
System configuration |
主机名、密码、rootfs大小等 | 建议改掉默认密码 |
Filesystem images |
最终生成的镜像格式(squashfs, ext4等) | 根据你的存储介质选 |
小提示: 配置完成后,按 Save 保存。Tina会把配置保存在 target/allwinner/<你的方案>/defconfig 里。下次 lunch 这个方案时,配置会自动加载。
4.3 Target packages 选择:该装什么?
这部分是实战中最容易纠结的地方。 Target packages 下面有几百个软件包,从 busybox 到 python3 应有尽有。选多了,镜像太大,Flash装不下;选少了,功能不全,调试不方便。
我总结了一个“最小可用集”,供你参考:
- 必备:
busybox(默认就有)、libc、dropbear(SSH服务,调试必备)。 - 调试:
strace、gdbserver、i2c-tools、devmem2。这些是我调试驱动时的左膀右臂。 - 网络:
iw(无线工具)、wpa_supplicant(Wi-Fi连接)、curl(下载测试)。 - 文件系统:
e2fsprogs(ext4工具)、dosfstools(FAT工具)。
注意: 我曾经在一个项目里,为了省空间,把 busybox 的 vi 功能裁剪掉了。结果现场调试时,连个改配置文件的编辑器都没有,只能 echo 覆盖,非常痛苦。所以,别在调试工具上省空间。
4.4 集成架构图:Tina + Buildroot 的关系
下面这张图,是我画的Tina集成Buildroot的核心逻辑。你看一眼就能明白它们是怎么配合的。
从这张图你能看到, make menuconfig 其实是在跟Tina封装层交互。封装层把配置拆成两份:一份给Buildroot核心,另一份给全志硬件适配层。最后两者合在一起,才生成最终的固件。
4.5 避坑指南:我踩过的几个坑
嗯,这里我要多说几句。Buildroot集成这块,有几个坑是新手必踩的。
- 坑一:配置不生效。 有时候你改了
make menuconfig,但编译出来的镜像还是老样子。原因往往是没保存,或者保存到了错误的defconfig文件。我建议每次改完,都手动检查一下target/allwinner/<方案>/defconfig文件的时间戳。 - 坑二:软件包依赖缺失。 比如你选了
python3,但它依赖libffi和zlib。Buildroot 理论上会自动选上依赖,但有时候会漏。如果编译报错说找不到某个头文件,八成是依赖没勾全。回到Target packages里手动搜一下补上就行。 - 坑三:空间不足。 默认的rootfs大小可能只有64MB或128MB。如果你装了很多包,编译时会直接报错“磁盘空间不足”。我习惯在
System configuration里把Rootfs size改大一点,比如256MB或512MB,具体看你Flash大小。
核心总结: Tina集成Buildroot的本质,就是“分层+封装”。你只需要关注 Target packages 和 System configuration 这两块,剩下的交给Tina去协调。记住,调试工具宁多勿少,镜像大小宁大勿小。