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 的板子上跑,浮点运算直接崩了。嗯,这种坑其实很容易避免,只要仔细看芯片手册就行。

注意:如果你不确定 CPU 变体,可以用 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。我曾经在这个问题上折腾了一下午,最后发现是库类型不匹配。

核心要点:工具链的架构、ABI、C 库类型、内核头文件版本,这四个必须跟你的目标板完全一致。少一个都不行。

3.4 内核配置入口

最后说说内核。在 Kernel 菜单里,你可以选择是否编译内核,以及用什么配置。

选项如下:

  • Linux Kernel —— 选上,表示要编译内核
  • Kernel version —— 自定义版本,或者用 Buildroot 提供的
  • Kernel configuration —— 这里最关键,有三种方式:
    • Use defconfig:用内核自带的默认配置,比如 sunxi_defconfig
    • Use a custom config file:用你自己写好的 .config 文件
    • Use the Buildroot configuration:直接在这里改,但不推荐
  • Kernel binary format:zImage、uImage、Image 等,取决于你的 bootloader

我一般这么干:先用 make linux-menuconfig 单独配置内核,把配置保存下来,然后在 Buildroot 里指定这个文件。这样互不干扰,清晰明了。

举个例子,如果你用的是树莓派 3,内核配置可以选 bcm2837_defconfig。但如果你用的是自己的板子,那就得自己从头配内核了。嗯,这部分内容我后面会专门讲,这里先知道入口在哪就行。

小技巧:如果你不确定内核配置对不对,可以先编译一次,看看有没有报错。内核编译失败通常会有明确的错误信息,比如缺少某个驱动或文件系统支持。

3.5 本章小结

这一章我们走通了 Buildroot 的基础配置流程。说白了,就是三步:选架构、配工具链、指定内核入口。你只要把这三件事做对了,后面的软件包配置就简单多了。

下一章我会带你实际跑一次编译,看看整个流程怎么走。到时候你会看到,配置只是第一步,真正的挑战在于调试和排错。不过别担心,我会把那些坑一个个指出来。

好,今天就到这儿。你去试试配置一个你手头板子的项目,有问题随时回来翻这一章。