2. 开发环境准备:安装依赖包、下载 Buildroot 源码、了解目录结构

好,咱们正式开始动手。这一章的目标很明确:把开发环境搭好,把 Buildroot 源码拉下来,再把它肚子里那点结构摸清楚。别小看这一步,我见过太多人卡在“装包”和“目录找不到”这种小坑上,一卡就是半天。

2.1 安装依赖包

Buildroot 对宿主机的依赖不算多,但一个都不能少。少了哪个,编译到一半就报错,那才叫闹心。

我个人习惯用 Ubuntu 20.04/22.04 LTS 做宿主机。如果你用其他发行版,包名可能略有不同,但核心依赖差不多。

核心依赖清单(Ubuntu/Debian 系)

sudo apt update
sudo apt install -y \
    git \
    make \
    gcc \
    g++ \
    gperf \
    bison \
    flex \
    texinfo \
    help2man \
    libncurses-dev \
    libssl-dev \
    libelf-dev \
    unzip \
    file \
    wget \
    cpio \
    python3 \
    python3-pip \
    rsync \
    bc

这里面有几个容易漏的:

  • libncurses-dev:没有它,make menuconfig 跑不起来。
  • libssl-dev:编译内核和某些工具链时需要。
  • bc:内核编译脚本里会用到,缺了会报奇怪的语法错误。
  • cpio:制作 initramfs 时必备。

小技巧:如果你用的是 Docker 或虚拟机,建议先跑一遍 sudo apt build-dep linux,它能帮你把内核编译相关的一堆依赖一次性装好。我在项目里经常这么干,省事。

2.2 下载 Buildroot 源码

源码从官方仓库拉就行。我个人推荐用 长期支持版(LTS),比如 2023.02.x 或 2024.02.x。开发版虽然新,但有时候会踩到未稳定的坑。

# 克隆官方仓库
git clone https://git.buildroot.net/buildroot
cd buildroot

# 切换到 LTS 版本(以 2024.02.x 为例)
git checkout 2024.02

如果你网络不好,也可以直接下载 tar.gz 压缩包:

wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02

注意:源码目录不要放在共享文件夹、NTFS 分区或路径包含中文/空格的地方。我曾经在 Windows 的 WSL 里踩过这个坑——编译到一半报错,查了半天发现是路径里有空格。Buildroot 的 Makefile 对路径很敏感,老老实实放 Linux 原生分区下。

2.3 了解目录结构

源码拉下来后,先别急着编译。花 10 分钟把目录结构过一遍,后面你会感谢自己。我刚开始用 Buildroot 时,就是没搞懂 dl 和 output 的关系,结果每次清理都手忙脚乱。

下面这张图帮你快速建立全局认知:

Buildroot 核心目录结构 buildroot/ dl/ output/ board/ configs/ dl/ — 下载缓存 存放所有下载的源码包 tar.gz、git clone 缓存 output/ — 编译输出 build/ images/ target/ staging/ host/ board/ — 板级支持 设备树、分区表、启动脚本 各板子专属配置 configs/ — 默认配置 raspberrypi4_defconfig stm32mp157_dk_defconfig package/ linux/ bootloader/ toolchain/ 关键路径速查 output/build/ — 每个软件包的编译目录 output/images/ — 最终镜像(zImage、rootfs.ext4 等) output/target/ — 目标根文件系统(开发调试用)

2.4 核心目录详解

dl/ — 下载缓存

所有从网上下载的源码包、补丁文件,都放在这里。说白了,它就是 Buildroot 的“本地仓库”。

  • 第一次编译时,Buildroot 会去网上下载,然后缓存到 dl/。
  • 第二次编译时,直接从 dl/ 读取,不用再下载。
  • 避坑:如果你换了网络环境,或者想离线编译,记得把 dl/ 目录备份好。我曾经在客户现场没网,全靠提前备份的 dl/ 目录才把系统跑起来。

output/ — 编译输出

这是 Buildroot 的“施工现场”。所有编译产物都在这里。里面有几个子目录要记住:

子目录 作用 我常用的场景
output/build/ 每个软件包的解压和编译目录 调试某个包编译失败时,进去看 log
output/images/ 最终生成的镜像文件 烧录到板子上的文件都在这里
output/target/ 目标根文件系统的完整目录 检查文件是否被正确安装
output/staging/ 头文件和库的“暂存区” 交叉编译第三方程序时引用
output/host/ 宿主机工具链和工具 交叉编译器、pkg-config 等

重要提醒:output/ 目录可以随时删除。删了之后,Buildroot 会重新编译所有东西。但 dl/ 目录不要轻易删,否则又要重新下载。我习惯把 dl/ 单独放在一个共享位置,多个项目共用。

board/ — 板级支持

这个目录放的是“板子专属”的东西。比如:

  • 设备树文件(.dts)
  • 分区表(genimage.cfg)
  • 启动脚本(busybox 的 inittab、S99 脚本等)
  • U-Boot 的板级配置

每个板子一个子目录,比如 board/raspberrypi/、board/stmicroelectronics/。如果你要移植新板子,这里就是主战场。

configs/ — 默认配置

这里存放的是 make xxx_defconfig 对应的配置文件。比如:

make raspberrypi4_64_defconfig

这个命令会读取 configs/raspberrypi4_64_defconfig,然后生成 .config。说白了,它就是 Buildroot 的“一键配置入口”。

2.5 其他重要目录

  • package/:所有软件包的编译规则(.mk 文件、Config.in)。你想加什么软件,就在这里找。
  • linux/:内核相关的配置和补丁。
  • bootloader/:U-Boot、Barebox 等引导加载程序的配置。
  • toolchain/:工具链相关的配置,包括内部工具链和外部工具链。
  • fs/:文件系统格式的生成逻辑(ext4、squashfs、cpio 等)。

2.6 验证环境

装完依赖、拉完源码后,跑一个简单的验证:

# 进入 Buildroot 目录
cd buildroot

# 选择一个默认配置(以 qemu_x86_64 为例)
make qemu_x86_64_defconfig

# 检查配置是否加载成功
ls -la .config

如果 .config 文件生成成功,说明环境基本没问题。你不需要真的编译完,只要这一步能过,后面的事就好办了。

个人经验:我每次在新机器上搭环境,都会先跑 make qemu_x86_64_defconfig 做“冒烟测试”。它依赖少、编译快,能快速验证工具链和依赖是否齐全。等这个跑通了,再切到目标板子的配置。

2.7 本章小结

到这一步,你的开发环境已经准备好了。依赖包装好了,源码拉下来了,目录结构也心里有数了。嗯,这里要注意:dl/ 和 output/ 的区别一定要记清楚,一个是“缓存”,一个是“施工现场”。后面所有章节的操作,都离不开这两个目录。

环境搭好,咱们就可以开始真正的实战了。