为什么要使用buildroot

Buildroot 是一个简单、高效和易于使用的工具,可以通过交叉编译生成嵌入式 Linux 系统。

文件系统通常要包含很多第三方软件,比如busybox,tftp等,为了避免繁杂的移植工作。buildroot应运而生。通过menuconfig配置我们需要的功能,不需要的功能去掉,再执行make指令编译,buildroot就会自动从指定的服务器上下载源码包,自动编译,自动搭建成我们所需要的嵌入式根文件系统。让我们的工作效率成百倍的提升。

获取buildroot源码

我们可以从buildroot官网(https://buildroot.org/download.html)获取buildroot源码包,Buildroot每3个月发布一次,在2月、5月、8月和11月。版本号的格式为YYYY,例如2013.02、2014.08。建议下载最新的版本,因为新的版本包含更多的第三方工具软件。

基本操作步骤

  1. 配置选项
    运行make menuconfig,选择要编译的目标架构和包,当配置完成之后,会在顶层目录生成.config,此文件将由顶层目录的Makefile文件读取使用。
  2. 运行
    简单的命令开始编译,make
  3. 编译过程
  • download source files (as required);
  • configure, build and install the cross-compilation toolchain, or simply import an external toolchain;
  • configure, build and install selected target packages;
  • build a kernel image, if selected;
  • build a bootloader image, if selected;
  • create a root filesystem in selected formats.
  1. output目录
  • images/:kernel image, bootloader and root filesystem images。
  • build/:构建所有组件的位置(包括host上Buildroot所需的工具和为目标编译的包)。该目录包含每个组件的子目录。
  • host/:包含host的tools,target toolchain的根目录。前者包含是buildroot所需交叉编译工具链,后者包含了许多开发文件、未压缩的二进制文件和库,由于没有strip,所以非常大。这些开发文件用于为target编译库和应用程序依赖的其他库文件。
  • staging/:指向host目录下toolchain sysroot的符号链接。它的存在是为了向后兼容。
  • target:几乎包含target的完整根文件系统。除了/dev中的设备文件之外,所有需要的东西都存在。

编译及rebuild

并发编译

默认情况下,并行级别是cpu数+1,但可以使用BR2_JLEVEL配置选项进行调整。

在2020.02之前,Buildroot是以串行方式构建包的:每个包一个接一个地构建,没有包之间的并行构建。截至2020.02年,Buildroot已经对顶级并行构建提供了实验性支持,通过并行构建没有依赖关系的包,可以显著节省构建时间。然而,这个功能被标记为实验性的,并且已知在某些情况下不起作用。

rebuild

背景

builroot的正常操作是下载一个tarball,提取它,配置,编译并安装该tarball中找到的软件组件。源代码在output/build/<package>-<version>中提取,这是一个临时的目录:每当使用make clean时,该目录将被完全删除,并在下一次make调用时重新创建。即使是,当使用Git或Subversion存储库作为包源代码的输入时,builroot也会从中创建一个tarball,然后的行为就像通常使用tarball一样。

当builroot主要用作集成工具来构建和集成嵌入式Linux系统的所有组件时,这种行为非常适合。但是,如果在系统的某些组件的开发过程中使用buildrot,那么这种行为就不是很方便了:相反,人们希望对一个包的源代码做一个小的更改,并且能够用buildrot快速重建系统。

直接在output/build/-中进行更改不是一个合适的解决方案,因为这个目录在make clean时会被删除

override机制

因此,builroot为这个用例提供了一个特定的机制:<pkg>_OVERRIDE_SRCDIR机制。Buildroot读取一个覆盖文件,该文件允许用户告诉Buildroot某些包的源代码位置。

覆盖文件的默认位置是$(CONFIG_DIR)/local.mk,由BR2_PACKAGE_OVERRIDE_FILE配置选项定义。$(CONFIG_DIR)是builroot .config文件的位置,所以是本地的。默认情况下,Mk与.config文件并排存在,如果需要不同于这些默认值的位置,则可以通过BR2_PACKAGE_OVERRIDE_FILE配置选项指定自定义的文件。例如这个自定义文件的内容:

LINUX_OVERRIDE_SRCDIR = /home/bob/linux/
BUSYBOX_OVERRIDE_SRCDIR = /home/bob/busybox/

当builroot发现对于给定的包,已经定义了_OVERRIDE_SRCDIR时,它将不再尝试下载、解压缩并修补该包。相反,它将直接使用指定目录中可用的源代码,并且make clean不会触及该目录。这允许将builroot指向您自己的目录,这些目录可以通过
Git、Subversion或任何其他版本控制系统进行管理。为此,builroot将使用rsync将组件的源代码从指定的<pkg>_OVERRIDE_SRCDIR复制到output/build/<package>-custom/。此机制最好与make <pkg>-rebuildmake <pkg>-reconfigure目标结合使用。make -rebuild all序列将从<pkg>_OVERRIDE_SRCDIR rsync源代码到输出/build/<package>-(多亏了rsync,只有修改过的文件被复制),并重新启动这个包的构建过程。在上面的linux包的例子中,开发人员可以在/home/bob/linux中修改源代码,然后运行

make linux-rebuild all

并在几秒钟内在output/images中获得更新的Linux内核映像。类似地,可以在/home/bob/busybox中修改BusyBox源代码,然后:

make busybox-rebuild all

大型项目的源代码树通常包含数百或数千个不需要构建的文件,但会减慢使用rsync复制源代码的过程。还可以通过定<pkg>_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS跳过对源树中的某些文件的同步。例如,当使用webkitgtk包时,以下命令将
从本地WebKit源代码树中排除测试和树内构建:

WEBKITGTK_OVERRIDE_SRCDIR = /home/bob/WebKit
WEBKITGTK_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS = \
--exclude JSTests --exclude ManualTests --exclude PerformanceTests \
--exclude WebDriverTests --exclude WebKitBuild --exclude WebKitLibraries \
--exclude WebKit.xcworkspace --exclude Websites --exclude Examples

默认情况下,builroot会跳过VCS工件(例如。git和。svn目录)的同步。有些包更喜欢在构建期间使用这些VCS
目录,例如用于自动确定版本信息的精确提交引用。要以较慢的速度为代价撤销此内置过滤,请重新添加这些目录:

LINUX_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS = --include .git

buildroot配置步骤

工具链 toolchain

交叉编译工具链支持两种形式,使用optionToolchain Type选择。

internal toolchain backend

called Buildroot toolchain in the configuration interface. buildroot编译一套工具链

  • 工具链支持多个C libraries,uClibc-ng, glibc and musl.
  • 有几个重要配置选项:Change the version of the Linux kernel headers used to build the toolchain、Change the version of the GCC compiler, binutils and the C library、Select a number of toolchain options (uClibc only):
  • 优点是:buildroot内置;快速(只编译使用的工具)
  • 缺点是:make clean之后需要重新编译,因此需要缩短编译时间,建议使用外部工具链

external toolchain backend

called External toolchain in the configuration interface.buildroot,使用已经编译好的外部工具链,可以是从其他网站下载,或者指定已下载的本地路径

  • 让buildroot下载、解压、安装工具链,目前支持CodeSourcery and Linaro toolchains
  • 使用已经下载好的工具链,告诉buildroot文件路径
  • 优点是:使用知名、测试充分的工具链;避免了交叉编译工具链的构建时间
  • 缺点是:如果工具链有bug不能修改

kernel

kernel配置

  • make menuconfig时,选中kernel,这样kernel还会参与编译
  • 有几个重要选项:一是选择kernel version;二是选择kernel configuration;三是选择devicetree
  1. in-tree:使用kernel源码中的配置文件,需要进一步指定文件名
  2. default:不需要指定,会使用当前架构的默认配置文件
  3. custom:指定自己的配置文件路径
  • make linux-menuconfig对kernel进行配置

文件系统 file system

使用cpio init ram模式

固件bootloader

make menuconfig时,选中uboot,设置对应的defconfig文件,不然make uboot-menuconfig的命令会失败,config文件设置方式同linux

其他

其他的就参考官方文档,再补充吧

Reference