引言
Buildroot 非常强大,它不仅仅是一个 构建嵌入式 Linux 根文件系统(rootfs) 的工具,更是一个 完整的嵌入式开发环境构建工具!它可以 自动构建所有开发所需的工具链、库、应用程序和环境,大大降低嵌入式开发的难度。
Buildroot 能做什么?
1. 生成交叉编译工具链(Toolchain)
- 自动编译生成 GCC 交叉编译工具链
- 自动编译 binutils、glibc/uClibc/musl
- 生成
sysroot
目录,包含目标系统的头文件和库文件,关于sysroot
目录的详细介绍见 http://iyenn.com/rec/1709248.html - 支持预编译工具链(如 Linaro、Sourcery CodeBench),如果不想自己编译 GCC,也可以直接用外部工具链
以下是我利用Buildroot生成的交叉编译工具链以及交叉编译工具链里的 sysroot
目录的截图:
使用Buildroot构建嵌入式开发环境时,Buildroot 会编译生成交叉工具链,显然在编译生成交叉工具链时会一并生成 sysroot
目录。
上面这张截图的目录路径如下:
/home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/host
- 1
上面这张截图的目录路径如下:
/home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/host/arm-buildroot-linux-gnueabihf
- 1
2. 生成嵌入式 Linux 根文件系统(RootFS)
- 自动构建
rootfs
(根文件系统) - 支持 BusyBox 作为轻量级用户空间
- 可选
glibc
/uClibc
/musl
作为 C 库 - 支持各种文件系统格式(ext4、squashfs、cpio 等)
3. 编译 Linux 内核和设备树文件
- 自动下载和编译 Linux 内核
- 支持自定义 Kernel 配置(类似
make menuconfig
) - 支持编译 Device Tree(DTS)
4. 编译 Bootloader(U-Boot)
- 自动编译 U-Boot
- 可配置不同的启动参数
- 支持不同架构的 Bootloader(如 ARM、MIPS、RISC-V)
5. 编译生成eEMMC启动所需的img文件
emmc.img
是一个完整的存储镜像文件,通常包含引导加载程序、内核镜像、设备树文件和根文件系统等。详情见 http://iyenn.com/rec/1709263.html- 把
emmc.img
烧写到开发板的eEMMC中之后整个嵌入式系统就能自动完整启动了。
6. 编译用户空间应用程序
- 提供大量开源软件包(如 Qt、Python、BusyBox、Dropbear SSH 等)
- 支持
make menuconfig
选择需要的应用 - 支持定制自己的软件包
比如在博文 http://iyenn.com/rec/1709264.html 中,我们就利用Buildroot将Qt的库集成到了Linux的内核中了,并且还生成了QtCreator构建工程时所需要的qmake。
7.总结
? Buildroot ≠ 只是一个 RootFS 构建工具,它还是:
- 嵌入式 Linux 交叉编译工具链的自动构建工具
- Linux Kernel 和 U-Boot 的构建工具
- 用户空间应用和库的编译管理工具
- 一键生成完整嵌入式系统环境
它可以帮助你 从零快速构建一个可运行的嵌入式 Linux 系统,包括 工具链、内核、根文件系统、驱动、应用,极大地提升开发效率!?
Buildroot的增量构建机制(第1次构建花时间,后面花的时间就很少了)
问:假如我已经编译成功了一次Buildroot,然后我只修改了Buildroot的U-Boot部分,那还会像第一次编译那样花费七、八个小时吗?
答:不会的。Buildroot 采用的是增量构建机制,如果你只修改了 U-Boot 部分,它不会重新编译整个系统,而只会重新编译 U-Boot 及其相关的依赖项。
一般情况下,Buildroot 编译 U-Boot 的过程包括:
- 下载 U-Boot 源码(如果之前已下载,则不会重复下载)。
- 解压源码(如果之前已解压,可能会跳过)。
- 进行 U-Boot 配置(如
make menuconfig
)。 - 编译 U-Boot(这部分会重新执行)。
- 复制 U-Boot 相关文件到输出目录。
通常,重新编译 U-Boot 只需要几分钟,而不会像第一次编译那样耗时几个小时。
但要注意:
- 如果你执行了
make clean
或make distclean
,那么 Buildroot 可能会删除之前的构建成果,从而导致重新编译所有组件,这样会花费更长的时间。 - 如果你改动的 U-Boot 配置影响了其他组件(比如设备树、启动方式等),可能会触发相关组件的重新编译,但依然不会像初次编译那么久。
如果你只想重新编译 U-Boot,可以使用:
make uboot-rebuild
- 1
或者:
make uboot-dirclean
make uboot
- 1
- 2
这样能最大程度地减少编译时间。
构建方法(使用方法)
第1个使用示例(简单使用)
①以下是我为了使用Qt开发进行的一次利用Buildboot构建的记录,通过这个记录就可以对Buildboot的使用过程有一个大致的了解。
http://iyenn.com/rec/1709264.html
第2个使用示例(完整使用)
②我准备后面从零开始利用Buildroot完整的构建一次自己在嵌入式开发过程中需要的各种东西。从博文 http://iyenn.com/rec/1709264.html 中可以知道,Buildroot的配置文件100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
应该是一个关键点,可以以此为突破口。相关命令如下:
make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
- 1
后面把博文写完后再把链接加到这里。



评论记录:
回复评论: