buildroot官方教材
buildroot官方的教程training
buildroot源码和组织树:
- Makefile <顶层Makefile文件>
- config.in <顶层的Config.in,包含了许多其它的Config.in文件>
- arch/
- toolchain/
- 用来产生和使用工具链的包
- toolchain/ <以来于toolchain-buildroot或toolchain-external的虚拟包>
- toolchain-buildroot/ <构建内部工具链的虚拟包>
- toolchain-external/ <处理外部工具链的包>
- system/
- skeleton/ <rootfs 骨架>
- Config.in <系统级特性的选项,如初始化系统,/dev 处理,等>
- linux/
- linux.mk <Linux内核包>
- package/
- 所有的用户空间的包(2500+)
- busybox/,gcc/,qt5/,等
- pkg-generic.mk,<内核包的基础>
- pkg-cmake.mk,pkg-autotools.mk,pkg-perl.mk,等 <专用包的基础>
- fs/
- 产生不同格式的文件系统映像的逻辑代码
- common.mk <通用逻辑代码>
- cpio/,ext2/,squashfs/,tar/,ubifs/,等
- boot/
- bootloader包
- at91bootstrap3/, barebox/, grub2/,syslinux/,uboot/,等
- configs/
- 不同硬件平台下的默认的配置文件
- 与内核的defconfigs相似
- atmel_xplained_defconfig,beaglebone_defconfig,raspberrypi_defconfig,等
- board/
- 特定板卡的文件(内核配置文件,内核补丁,映像烧写Flash的脚本,等)
- 通常与configs/中的defconfig一起使用
- support/
- 其它工具 <kconfig代码,libtool补丁,下载的helpers,等>
- utils/
- 便利于Buildroot开发者的各种工具
- brmake,都为make封装的形式,且带logging功能
- get-developers <知道补丁应该发给谁>
- test-pkg <验证包是否正确地构建了>
- scanpipy,scancpan <生成Python/Perl包的.mk文件>
- …
- docs/
- Buildroot文档
- 可由
make manual
命令产生。 - 也可通过https://buildroot.org/downloads/manual/manual.html获取
下面介绍一下构建的组织目录树(Build tree)
- output/ <总的生成文件夹,可以通过O=< dir >来自定义。BASE_DIR>
- build/ <所有的源码压缩包都在这里解压;每一个包在这里构建;除了源码包和目标文件,Buildroot还创建了stamp文件。BUILD_DIR>
- buildroot-config/
- busybox-1.22.1/
- host-pkgconf-0.8.9/
- kmod-1.18/
- build-time.log
- host/ <包括为主机(交叉编译器等)和工具链的根文件系统构建的工具。根文件系统在host/< tuple >/sysroot/usr中,< tuple >为架构,开发商、操作系统、C库和ABI的标识(例如:arm-unknown-linux-gnueabihf)。HOST_DIR,根文件系统文件夹:STAGING_DIR>
- lib
- bin
- sbin
- < tuple >/sysroot/bin
- < tuple >/sysroot/lib
- < tuple >/sysroot/usr/lib
- < tuple >/sysroot/usr/bin
- staging/ <与根文件系统,比如host/< tuple >/sysroot的链接符号>
- target/ <目标根文件系统;Linux层次;还缺少权限,设备文件等,不能直接用于目标硬件;用来生成最终的根文件系统映像:images/。TARGET_DIR>
- bin/
- etc/
- -lib/
- usr/bin/
- usr/lib/
- usr/share/
- usr/sbin/
- THIS_IS_NOT_YOUR_ROOT_FILESYSTEM
- …
- images/ <包括最终的映像文件:内核映像,bootloader映像,根文件系统映像。BINARIES_DIR>
- zImage
- armada-307-mirabox.dtb
- rootfs.tar
- rootfs.ubi
- graphs/ < Buildroot操作的可视化:包之间的依赖关系,构建不同包的时间。由如下命令生成:
make graph-depends
make graph-build
make graph-size
。GRAPHS_DIR>
- build/ <所有的源码压缩包都在这里解压;每一个包在这里构建;除了源码包和目标文件,Buildroot还创建了stamp文件。BUILD_DIR>
- legal-info/ <包的许可证(license),源码等;由
make legal-info
命令生成。LEGAL_INFO_DIR>- manifest.csv
- host-manifest.csv
- licenses.txt
- licenses/
- sources/
- …
Buildroot的工具链
什么是交叉编译工具链?
3. 用来构建和调试目标硬件源码的一系列的工具。
Buildroot为工具链提供了两种选择,称为工具链后台:
- 内部工具链,Buildroot完全从源码构建整个工具链。
- 外部工具链,Buildroot可以使用已经构建好的工具链。
通过Toolchain -> Toolchain type来选择。
内部的工具链
提供了灵活的配置,如:
-
内核头文件的版本;
-
C库,支持uClibc,(e)glibc和musl。
- 其中glibc是标准的C库,>= 10MB。
- uClibc-ng和musl,为较小的C库,uClibc-ng支持无MMU的架构,适用于非常小的系统(< 10MB)。
-
大量的工具链的可选项:C++,LTO,OpenMP,libmudflap,graphite等。
构建工具链大约需要15-20分钟的时间。
内部工具链生成的文件:
- host/bin/< tuple >-< tool >中,交叉编译工具,包括:编译器,链接器,汇编器等,其中编译器隐藏在一个封装的程序中。
- host/< tuple >/
- sysroot/usr/include/ ,内核头文件和C库头文件。
- sysroot/lib/和 sysroot/usr/lib/,C库和gcc运行环境。
- include/c++/,C++库头文件。
- lib/,gcc/binutils所需要的主机上的库。
- target/
- lib/和usr/lib/,C和C++库。
- 编译器被配置为:硬件平台专用的;在根文件目录中查找库和头文件;不需要传递那些怪异的gcc的选项参数(flag)。
外部的工具链
Buildroot允许使用预构建好的工具链:
- 使用Buildroot已知的现有工具链配置文件(profile)
- 下载和安装自定义的外部工具链
- 直接使用预安装的自定义的外部工具链
Buildroot已知的大量的公开发行的工具链可供选择,包括ARM(ARM和AArch64),Mentor Graphics(ARM,AArch64,MIPS,NIOS-II,x86-64),Imagination Technologies(MIPS),Synopsys(ARC)。
选择以上的已知工具链时,Buildroot能够下载和自动使用这些工具链。
也可以轻松地添加新的工具链配置文件(profile)。
如果你使用的是自定义的工具链,则在Toolchain中选择Custom toolchain。
也可以通过Toolchain origin中的Pre-installed toolchain选项选择预安装好的工具链。
以上所有的情况,你都需要告诉Buildroot这些工具链的配置情况,包括:C库,内核头文件版本,等。
外部工具链的生成文件:
- host/opt/ext-toolchain,原始的工具链压缩包解压的位置
- host/bin/< tuple >-< tool >,交叉编译工具的符号链接。不过编译器指向了一个封装程序。
- host/< tuple >/
- sysroot/usr/include/ ,内核头文件和C库头文件。
- sysroot/lib/和 sysroot/usr/lib/,C库和gcc运行环境。
- include/c++/,C++库头文件。
- target/
- lib/和usr/lib/,C和C++库。