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 的关系,结果每次清理都手忙脚乱。
下面这张图帮你快速建立全局认知:
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/ 的区别一定要记清楚,一个是“缓存”,一个是“施工现场”。后面所有章节的操作,都离不开这两个目录。
环境搭好,咱们就可以开始真正的实战了。