Skip to main content

Buildroot编译和配置

一、Buildroot源码获取

  1. SDK提供 Neardi的SDK默认包含buildroot源码。
  2. 从Buildroot官网下载Buildroot 每年都会更新,每年的2 月、5 月、8 月、11 月会发布一次 buildroot。官网下载网址:https://buildroot.org/download.html

二、Buildroot第三方包下载机制

SDK集成了Buildroot第三方包下载机制,在原生dl基础上增加archives目录,预置第三方包。如果无法连接Google,将切换到使用国内kgithub镜像,并优先从mk脚本指定源下载,如果失败将尝试mk脚本和defconfig配置的镜像源,最后才是官方备份源。 在官方树中,大多数源码都是使用wget来获取;只有小部分通过他们的git,mercurial,或者svn存储库。

三、系统配置

(1)环境变量的设定

在SDK⽬录中:

source buildroot/envsetup.sh <config_name>

config_name可以source buildroot/envsetup.sh列出来,选择具体平台编译。

(2)交叉编译工具链

Buildroot提供了不同的交叉编译⼯具链构建解决⽅案:

$ make menuconfig
-> Toolchain
│ -> Toolchain type ( [=y])
SDK默认使⽤内部⼯具链

(3)内部工具链端

内部⼯具链后端是内置的后端,在构建之前,Buildroot⾃⼰构建了⼀个交叉编译的⼯具链。⽤于⽬标嵌⼊式系统的⽤⼾空间应⽤程序和库,这个后端是Buildroot的历史后端,并且仅限于uClibc C库的使⽤(i.e,glibc和eglibc C库不受此后端⽀持,请参阅外部⼯具链后端和跨界⼯具链后端解决⽅案使⽤glibc或eglibc)。

(4)外部工具链端

外部⼯具链后端允许使⽤现有的预构建交叉编译⼯具链。Buildroot能识别⼏种常⻅的交叉编译⼯具链(从ARM的Linaro,ARM的Sourcery CodeBench,x86,x86-64,PowerPC,MIPS和SuperH,来⾃ADI的Blackfin⼯具链, Xilinx⽤于Microblaze的⼯具链,等等。)并且能够⾃动下载它们,或者它可以指向⼀个⾃定义的⼯具链,可以在本地下载或安装。

(5)下载包位置

由Buildroot下载的各种tarball都存储在BR2_DL_DIR中,默认情况下是dl⽬录。预置dl包如可提⾼编译效率和解决⼀些第三⽅包下载失败的问题。SDK可可通过设置 BUILDROOT_DL_DIR 环境来指定⽬录。

$ export BUILDROOT_DL_DIR <shared download location>
在~/.bashrc中添加上⾯⼀⾏设置环境变量

下载位置也可以设置在.config⽂件中,使⽤BR2_DL_DIR选项。这个值会被BUILDROOT_DL_DIR环境变量覆盖。

(6)/dev管理

在Linux系统上,/dev目录下为设备文件,这些文件允许用户空间应用程序访问Linux内核管理的硬件设备。 在`System configuration"选项下的"/dev manahement",Buildroot提供四种方式来处理/dev目录:

  • Static using device table:这是 Linux 处理设备文件传统方法,设备文件会持久存储在根文件系统中(重启仍在),当系统添加或移除硬件设备不能自动创建和删除设备文件;因此 Buildroot 使用设备表来创建一组标准的设备文件,默认设备表存放在system/device_table_dev.txt, Buildroot 终生成根文件系统镜像时处理此设备表文件,因此设备表文件在output/target不可见;BR2_ROOTFS_STATIC_DEVICE_TABLE选项允许更改 Buildroot 默认设备表,或者添加其他设备表,以便 Buildroot 在构建过程中可以创建其他设备文件。
  • Dynamic using devtmpfs only:devtmpfs 是 Linux 内核中的一个虚拟文 件系统,在挂载到/dev��后,此虚拟文件系统将在系统添加或者移除硬件设备时自动使设备文件显示或消失,该文件系统在重新启动后并不持久:它是由内核动态填充的。使用 devtmpfs 时需要启用以下内核配置选项:CONFIG_DEVTMPFSCONFIG_DEVTMPFS_MOUNT
  • Dynamic using devtmpfs+mdev:该方法依赖于上面介绍的devtmpfs虚 拟文件系统(因此同样需要在内核配置中启用CONFIG_DEVTMPFSCONFIG_DEVTMPFS_MOUNT),但在上面添加了mdev 用户空间程序。mdev是BusyBox里面的程序部分,每次添加或移除设备时,内核都会调用mdev。由于使用/etc/mdev.conf配置文件,因此 mdev 可以进行相关配置,例如给设备文件设置特定的权限或所有权、在设备出现或消失时调用脚本或应用程序等等。基本上,它允许用户空间对设备添加和删除事件做出反应。例如,当设备出现在系统上时,mdev 可用于自动加载内核模块。
  • Dynamic using devtmpfs+eudev:此方法同样依赖于上面介绍的devtmp fs 虚拟文件系统,但在上面添加了eudev用户空间守护程序。eudev是后台运行的守护程序,当系统添加或者移除设备时,内核将会调用它。与 mdev 相比,它是重量级的解决方案,但是具有更高的灵活性。eudev是udev的独立版本,udev是大多数桌面Linux发行版中使用的原始用户空间守护程序,现已成为Systemd的一部分。

(7)初始化系统

init 程序是由内核启动的第一个用户空间程序(带有PID号1),它负责启动用户空间服务和程序(例如:Web服务器、图形应用程序、其他网络服务器等)。 Buildroot ��允许使用三种不同类型的初始化系统,可以在System configuration选项下的Init system进行选择:

  • BusyBox:启用BR2_INIT_BUSYBOX将确保 BusyBox 会生成并安装其 init 程序,BusyBox init 程序会在启动时去读取/etc/inittab文件,以了解需 要处理的内容。Buildroot 默认的 inittab 文件存储在 system/skeleton/etc/inittab,。除了挂载一些重要的文件系统之外,默认的inittab 的主要工作是启动/etc/init.d/rcS shell 脚本,并启动一个 getty 程序。
  • systemV:该解决方案使用传统的sysvinit程序,位于Buildroot目录packag e/sysvinit,这是大多数桌面 Linux 发行版使用的解决方案,直到它们被切换到更新的替代版本。
  • systemd:systemd是用于Linux的新一代init系统。它的功能远远超过传统 的init 程序:强大的并行处理能力、使用socket和D-Bus激活启动服务、按需启动守护程序、使用Linux控制组跟踪进程、支持对系统状态进行快照和还原等等。

四、编译模块和系统

选好编译平台,接下来就可以以普通用户身份编译每⼀个package,以常规用户身份去运行所以命令,能够保护系统免受在编译和安装过程中表现异常的软件包的侵害。 编译内容主要是config、build、install三部分组成,运⾏make构建和安装特定的包及其依赖项。 对于依赖于Buildroot基础设施的包,有许多特殊的make⽬标可以独⽴调⽤。 具体如下:进⼊buildroot⽬录:

make <package>-<target>
command/targetDescription
source获取源代码(下载tarball,克隆源存储库等)
depends构建和安装构建软件包所需的所有相依性
extract将源代码放在包构建⽬录中(提取tarball,复制源代码,等等)
patch应⽤补丁,如果有的话
configure运⾏configure命令,如果有的话
build运⾏编译命令
install-staging⽬标包:在暂存⽬录中,运⾏软件包的必要安装
install⽬标包:运⾏前⾯的两个安装命令,主机包:在宿主⽬录中运⾏包的安装
show-depends显⽰构建软件包所需的依赖性
clean运⾏软件包的清除命令,也可以从⽬标和暂存⽬录中卸载软件
dirclean删除整个包构建⽬录
rebuild�重新运⾏编译命令
reconfigure重新运⾏配置命令

如果需要对配置进⾏修改,可运⾏make menuconfig, ⽐如:

buildroot$ make menuconfig

在配置⼯具中,您可以找到相关的帮助来描述每个菜单条目的目的。一旦工具完成配置,它将生成⼀个包含配置描述的 .config 文件。该文件将被 Makefile ⽤于执⾏所需的任务。然后,编译Buildroot系统,执⾏ make 命令。

执行make通常会执行以下几步:

  • 下载源文件(根据需要);
  • 配置,构建和安装交叉编译工具链,或者仅导入外部工具链;
  • 配置,构建和安装选定的目标软件包;
  • 构建内核镜像(如果选择)
  • 构建引导加载程序镜像(如果选择);
  • 以选定的格式创建一个根文件系统。
保存到rootfs配置⽂件:
buildroot$ make update-defconfig

Buildroot常用命令

显示 make 执行的所有命令:

make V=1 <target>

显示待遇defconfig的板级列表:

make list-defconfigs

显示所有可用的目标:

make help

当更改体系架构或工具链任何配置选项时,需要进行显式清理。要删除所有构建时 生成的产物(包括build、host、staging and target trees、images和toolchain):

make clean

删除所有构建时的产物以及相关配置:

make distclean
请注意,如果启用了ccache,则运行make clean或distclean不会清空Buildroot所使用的编译器缓存。要删除 ~/.buildroot-ccache文件夹