3、基础配置:make menuconfig入门、目标架构选择、工具链配置、内核配置入口
好,咱们正式开始动手配置 Buildroot。说实话,很多新手第一次打开 make menuconfig 时,面对满屏的选项会有点懵。我当年也一样,盯着那个蓝底白字的界面,心里直打鼓:「这玩意儿到底该怎么填?」
别急,咱们一步步来。这一章我带你走通最基础的配置流程,包括目标架构、工具链和内核入口。你跟着走一遍,后面就顺了。
3.1 make menuconfig 入门
先说说这个命令本身。在 Buildroot 源码根目录下,直接敲:
make menuconfig
你会看到一个基于 Kconfig 的图形界面。嗯,跟 Linux 内核的配置界面是同一套东西。上下键移动,回车进入子菜单,空格或 Y 键选中,N 键取消,按 ? 可以看帮助。
我个人习惯是先把所有选项扫一遍,心里有个数。你想想看,Buildroot 的配置项其实分几大块:
- Target options —— 目标架构和 CPU 特性
- Build options —— 编译行为,比如是否开启 ccache
- Toolchain —— 工具链类型和版本
- System configuration —— 根文件系统的基础设置
- Kernel —— 内核选择与配置入口
- Target packages —— 你要装哪些软件包
这里有个小技巧:按 / 可以搜索选项。比如你想找 openssh,直接搜,它会告诉你这个选项在哪个菜单下。我在项目中经常用这个功能,省得一层层翻菜单。
.config 文件。你可以备份一份,比如 cp .config config_myboard,方便以后复用。
3.2 目标架构选择
进入 Target options,这是第一步。你得告诉 Buildroot:「我为谁编译?」
常见的选项有:
| 选项 | 说明 | 常见值 |
|---|---|---|
| Target Architecture | 目标 CPU 架构 | ARM、ARM64、x86_64、RISC-V |
| Target Architecture Variant | CPU 变体,比如 cortex-a7 | cortex-a7、cortex-a53 |
| Target ABI | 应用程序二进制接口 | EABI、EABIhf(硬浮点) |
| Floating point strategy | 浮点运算策略 | VFPv4、NEON |
举个例子,如果你用的是全志 H3 芯片(比如香橙派),它基于 ARM Cortex-A7,支持硬浮点。那你就选:
- Target Architecture:ARM (little endian)
- Target Architecture Variant:cortex-a7
- Target ABI:EABIhf
- Floating point strategy:VFPv4-D16
为什么会这么选?因为选错了,编译出来的程序可能跑不起来,或者性能很差。我曾经帮一个同事排查问题,他选了个 cortex-a9 的变体,结果在 cortex-a7 的板子上跑,浮点运算直接崩了。嗯,这种坑其实很容易避免,只要仔细看芯片手册就行。
cat /proc/cpuinfo 在目标板上查看。或者查芯片的 datasheet。别瞎猜,猜错了浪费时间。
3.3 工具链配置
接下来是 Toolchain 菜单。这里决定了你用哪个编译器来编译整个系统。
Buildroot 支持几种方式:
- Buildroot 内部工具链 —— 它自己下载源码编译 gcc、binutils、glibc 等。最灵活,但第一次编译很慢。
- 外部工具链 —— 用现成的,比如 Linaro 的 ARM 工具链、ARM 官方工具链。省时间。
- 系统工具链 —— 直接用你 PC 上的 gcc。不推荐,因为交叉编译容易出问题。
我个人建议:如果是做产品,用外部工具链更稳定。比如我做一个基于 STM32MP1 的项目,直接用了 ST 官方提供的工具链,省去了自己编译 gcc 的麻烦。
配置时要注意几个关键点:
- Toolchain type:选 External toolchain
- Toolchain path:指向你下载好的工具链路径
- Toolchain prefix:比如
arm-linux-gnueabihf- - External toolchain gcc version:必须跟实际版本一致,否则编译会报错
这里有个坑:工具链的 C 库类型必须匹配。比如你的工具链是 glibc 的,那 Buildroot 里也要选 glibc。选成 uclibc 的话,链接阶段会报一堆 undefined reference。我曾经在这个问题上折腾了一下午,最后发现是库类型不匹配。
3.4 内核配置入口
最后说说内核。在 Kernel 菜单里,你可以选择是否编译内核,以及用什么配置。
选项如下:
- Linux Kernel —— 选上,表示要编译内核
- Kernel version —— 自定义版本,或者用 Buildroot 提供的
- Kernel configuration —— 这里最关键,有三种方式:
- Use defconfig:用内核自带的默认配置,比如
sunxi_defconfig - Use a custom config file:用你自己写好的
.config文件 - Use the Buildroot configuration:直接在这里改,但不推荐
- Use defconfig:用内核自带的默认配置,比如
- Kernel binary format:zImage、uImage、Image 等,取决于你的 bootloader
我一般这么干:先用 make linux-menuconfig 单独配置内核,把配置保存下来,然后在 Buildroot 里指定这个文件。这样互不干扰,清晰明了。
举个例子,如果你用的是树莓派 3,内核配置可以选 bcm2837_defconfig。但如果你用的是自己的板子,那就得自己从头配内核了。嗯,这部分内容我后面会专门讲,这里先知道入口在哪就行。
3.5 本章小结
这一章我们走通了 Buildroot 的基础配置流程。说白了,就是三步:选架构、配工具链、指定内核入口。你只要把这三件事做对了,后面的软件包配置就简单多了。
下一章我会带你实际跑一次编译,看看整个流程怎么走。到时候你会看到,配置只是第一步,真正的挑战在于调试和排错。不过别担心,我会把那些坑一个个指出来。
好,今天就到这儿。你去试试配置一个你手头板子的项目,有问题随时回来翻这一章。