1.1 介绍
Buildroot 是一种工具,它使用交叉编译简化并自动化为嵌入式系统构建完整的 Linux 系统的过程。
为了实现这一点,Buildroot 能够为我们的目标生成交叉编译工具链、根文件系统、Linux 内核映像和引导加载程序。Buildroot可以单独用于这些选项的任何组合(例如,我们可以使用现有的交叉编译工具链,并用 Buildroot 只构建我们的根文件系统)。
Buildroot 主要对使用嵌入式系统的人有用。嵌入式系统通常使用的处理器不是每个人在其 PC 中都使用过的常规x86处理器。它们可以是 PowerPC 处理器、MIPS 处理器、ARM 处理器等等。
Buildroot 支持许多处理器和他们的变种,它还提供了一些现成的板的默认配置。除此之外,许多第三方项目都是基于或在 Buildroot 上开发 BSP 或 SDK 。
- BSP:板载支持包
- SDK:软件开发工具包
1.2 环境要求
1.2.1 必须的工具包
buildroot 在构建的过程中需要宿主机上存在一些工具,有了这些工具,buildroot 的构建工具才能建立:
1 sudo apt-get install make binutils build-essential gcc g++ bzip2 gzip perl cpio unzip rsync wget
1.2.2 可选的工具包
- 推荐的依赖关系:
- Buildroot中的一些特性或工具,如法律信息或图形生成工具,具有额外的依赖性。虽然它们不是一个简单的构建必须的,但仍然强烈推荐:
- python:版本至少 2.7 或以上
- Buildroot中的一些特性或工具,如法律信息或图形生成工具,具有额外的依赖性。虽然它们不是一个简单的构建必须的,但仍然强烈推荐:
- 配置接口依赖关系:
- 对于这些库,您需要同时安装运行时和开发数据,这些数据在许多发行版中是单独打包的。开发包通常具有 -dev 或 -devel 后缀。
- ncurse5 或 libncurse5 的接口用于 menuconfig
- qt5 的接口用于 xconfig:sudo apt-get install qt5-default
- glib2,gtk2 和 glade2 的接口用于 gocnig
- 对于这些库,您需要同时安装运行时和开发数据,这些数据在许多发行版中是单独打包的。开发包通常具有 -dev 或 -devel 后缀。
- 源码包获取工具:
- 在官方树中,大多数包源都是使用 wget 从 ftp、http 或 https 位置检索的。少数软件包只能通过版本控制系统获得。此外,Buildroot 还可以通过其他工具下载源代码,比如 rsync 或 scp 。如果您启用包使用任何这些方法,您将需要安装相应的工具在主机系统:
- 这些工具有 bazaar、cvs、git、mercurial、rsync、scp、subversion
- 在官方树中,大多数包源都是使用 wget 从 ftp、http 或 https 位置检索的。少数软件包只能通过版本控制系统获得。此外,Buildroot 还可以通过其他工具下载源代码,比如 rsync 或 scp 。如果您启用包使用任何这些方法,您将需要安装相应的工具在主机系统:
- 与 Java 相关的包,如果 Java 需要在目标系统上构建:
- javac 编译器和 jar 工具
- 文档生成工具:
- asciidoc、w3m、python(包含 argparse 模块的版本)、dblatex(pdf 手册使用)
- 图形生成工具:
- graphviz
- python-matplotlib
- graphviz
1.3 获取 buildroot
buildroot 下载:
官网下载:https://buildroot.org/
buildroot 官网文档下载:https://buildroot.org/docs.html
下载完成后,进行解压即可。
1.4 buildroot 的使用
使用 Buildroot 的第一步是创建配置。Buildroot 有一个很好的配置工具,类似于 Linux 内核或 BusyBox 中的配置工具。
在根目录下使用命令 make menuconfig/nconfig/xconfig/gconfig 可以使用不同 host 工具进入不同的配置界面。
具体的可以在根目录下使用 make help 查看各个配置命令的不同。
默认情况下,Buildroot不支持顶层的并行构建,因此没有必要运行 make -jN。然而,对于顶级并行构建有实验性的支持。
- make 命令通常执行以下步骤:
- 按配置要求下载源码文件
- 配置,编译和安装交叉编译工具链,或者简单的导入一个外部工具链
- 配置,编译和安装选择的目标包
- 如果选择了内核,则编译一个内核镜像
- 如果选择了一个 bootloader,则编译一个 bootloader 镜像
- 如果选择了根文件系统的格式,则创建一个根文件系统
buildroot 的输出存放在 output/ 目录下,此目录的构建如下:
目录 | 说明 |
images/ | 所有映像(内核映像、引导加载程序映像和根文件系统映像)都存储在这里。这些是需要放在目标系统上的文件。 |
build/ | 在其中构建所有组件(包括宿主上的 Buildroot 所需的工具和为目标编译的包)。此目录为每个组件包含一个子目录。 |
host/ |
包含为主机构建的工具和目标工具链的sysroot。 前者安装了为主机编译的工具,这些工具是正确执行Buildroot所需要的,包括交叉编译工具链。 后者是类似于根文件系统层次结构的层次结构。它包含提供和安装其他包使用的库的所有用户空间包的头文件和库文件。但是,这个目录并不打算成为目标的根文件系统:它包含许多开发文件、未剥离的二进制文件和库,使得它对于嵌入式系统来说太大了。这些开发文件用于为依赖于其他库的目标编译库和应用程序。 |
staging/ | 是指向 host/ 内部目标工具链 sysroot 的符号链接,存在它是为了向后兼容。 |
target/ | 它包含了目标的几乎完整的根文件系统:除了/dev/ 中的设备文件(Buildroot不能创建它们,因为 Buildroot 不是作为 root 用户运行,也不想作为 root 用户运行)之外,所需的所有文件都在其中。而且,它没有正确的权限(例如 busybox 二进制文件的 setuid)。因此,不应该在目标上使用 /dev 目录。相反,您应该使用在images/目录中构建的映像之一。如果需要在NFS上引导根文件系统的一个提取的映像,那么使用在 images/ 中生成的 tarball 映像并将其提取为 root。与 staging/ 相比,target/ 只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)不存在,二进制文件被剥离。 |
1.5 make 命令
在根目录下运行 make help 可以查看到所有的命令:
分类 | 命令 | 说明 |
Cleaning | clean | 当任何架构或工具链配置选项被更改时,需要显式清理。删除所有构建产品(包括目录 buiild、host、stagint 和 target trees、images 和 toolchain) |
distclean | 为新目标重置Buildroot:删除所有构建产品和配置 | |
Build | all | 相当于 make world,world 是 buildroot 的第一个目标 |
toolchain | 构建交叉编译工具链 | |
sdk | 构建可移植的 SDK | |
Configuration | menuconfig | 交互式 curses-based 配置器 |
nconfig | 交互式 ncurses-based 配置器 | |
xconfig | 交互式 Qt-based 配置器 | |
gconfig | 交互式 GTK-based 配置器 | |
oldconfig | 解析 .config 中未解析的符号 | |
syncconfig | 和 oldconfig 一样,但是悄声地,增加了 deps 的更新 | |
olddefconfig | 与 syncconfig 相同,但将新符号设置为默认值 | |
randconfig | 新配置随机回答所有选项 | |
defconfig | 带有所有选项默认答案的新配置;如果在命令行上设置,则使用 BR2_DEFCONFIG 作为输入 | |
savedefconfig | 将当前配置保存为 BR2_DEFCONFIG(最小配置) | |
update-defconfig | 与 savedefconfig 一样 | |
allyesconfig | 新配置中所有选项都被接受 | |
allnoconfig | 新配置中所有选项都被拒绝 | |
alldefconfig | 新配置中所有选项都被设置为默认 | |
randpackageconfig | 新配置随机回答包选项 | |
allyespackageconfig | 新的配置,pkg 选项是接受的 | |
allnopackageconfig | 新配置中包选项的答案是 no | |
Package-specific | <pkg> | 建立和安装 <pkg> 以及它所有的依赖关系 |
<pkg>-source | 只下载 <pkg> 源文件 | |
<pkg>-extract | 解压 <pkg> 源码 | |
<pkg>-patch | 应用补丁到 <pkg> | |
<pkg>-depends | 构建 <pkg> 的依赖 | |
<pkg>-configure | 构建 <pkg> 直到配置步骤 | |
<pkg>-build | 构建 <pkg> 直到编译步骤 | |
<pkg>-show-info | 生成关于 <pkg> 的信息,作为 JSON 简介 | |
<pkg>-show-depends | 显示 <pkg> 的依赖 | |
<pkg>-show-rdepends | 显示以 <pkg> 为依赖的包 | |
<pkg>-show-recursive-depends | 递归显示 <pkg> 的依赖 | |
<pkg>-show-recursive-rdepends | 递归显示以 <pkg> 为依赖的包 | |
<pkg>-graph-depends | 生成 <pkg> 的依赖关系图 | |
<pkg>-graph-rdepends | 生成 <pkg> 的被依赖关系图 | |
<pkg>-dirclean | 删除 <pkg> 的构建目录 | |
<pkg>-reconfigure | 从配置步骤重新启动构建 | |
<pkg>-rebuild | 从编译步骤重新启动生成 | |
Documentation | manual | 以所有格式构建手册 |
manual-html | 以 HTML 格式构建手册 | |
manual-split-html | 以 分割的 HTML 格式构建手册 | |
manual-pdf | 以 pdf 格式构建手册 | |
manual-text | 以 test 格式构建手册 | |
manual-epub | 以 epub 格式构建手册 | |
graph-build | 生成构建时间的图表 | |
graph-depends | 生成依赖树的图 | |
graph-size | 生成文件系统大小的统计数据 | |
list-defconfigs | 列出所有预配置的最小系统,支持的所有板子的 xxx_defconfig | |
Miscellaneous | source | 下载离线构建所需的所有资源 |
external-deps | 列出使用的外部包 | |
legal-info | 生成关于许可证遵从性的信息 | |
show-info | 生成关于包的信息,作为JSON简介 | |
printvars |
转储用VARS=…选择的内部变量,可以转储已知的要生成的变量及其值,如 $ make -s printvars VARS='VARIABLE1 VARIABLE2' 它是可能的调整输出使用一些变量: • VARS 将把列表限制为名称与指定 make 模式匹配的变量——这必须设置,否则不会打印任何内容 • QUOTED_VARS,如果设置为 YES,将单引号引用该值 • RAW_VARS,如果设置为 YES,将打印未展开的值 例如: $ make -s printvars VARS=BUSYBOX_%DEPENDENCIES |
|
make V=0|1 |
make V=1 target:显示所有执行的命令 make V=0 target:不显示命令 |
|
make O=dir | 在“dir”中存放所有输出文件,包括.config |
不是所有的命令都会在 make help 中显示出来,有些配置命令需要在某些软件包在 .config 中配置之后才能生效:
- busybox-menuconfig 只在启用 busybox 时工作;
- linux-menuconfig 和 linux-savedefconfig 只在启用 linux 时工作;
-
uClibc-menuconfig 仅在内部工具链后端选择 uClibc C库时可用;
-
barebox-menuconfig 和 barebox-savedefconfig 只在 barebox 引导加载程序启用时工作。、
-
uboot-menuconfig ·和 +
-
boot-savedefconfig 只在 U-Boot 引导加载程序启用时工作。