1、背景介绍

        在进行嵌入式终端开发过程中,如果使用的是linux系统的话,移植适配完成linux kernel后,我们还需要制作linux的启动文件系统,而文件系统通常要包含很多第三方软件,比如udhcpc,tftp,apache,sqlite,PHP,iptable,DNS等,为了避免繁杂的移植工作Buildroot应运而生。Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,你可以和编译Linux内核一样,通过Buildroot的配置指令:make menuconfig,配置我们需要的功能,不需要的功能去掉,再执行make指令编译,Buildroot就会自动从指定的服务器上下载源码包,自动编译,自动搭建成我们所需要的嵌入式根文件系统,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件,包含boot、kernel、rootfs以及rootfs中的各种库和应用程序,让我们的工作效率成百倍的提升。

2、获取buildroot

        我们可以从buildroot官网(Buildroot - Making Embedded Linux Easy)获取buildroot源码包,我使用的是buildroot-2021.08.01.tar.gz(https://buildroot.org/downloads/buildroot-2021.08.1.tar.gz)版本。Buildroot的目录初始状态下都是一些脚本和配置文件,其中configs文件存放开发板的配置文件,详细介绍如下:

├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs: 放置开发板的一些配置参数. 
├── COPYING
├── DEVELOPERS
├── dl: 存放下载的源代码及应用软件的压缩包. 
├── docs: 存放相关的参考文档. 
├── fs: 放各种文件系统的源代码. 
├── linux: 存放着Linux kernel的自动构建脚本. 
├── Makefile
├── Makefile.legacy
├── output: 是编译出来的输出文件夹. 
│   ├── build: 存放解压后的各种软件包编译完成后的现场.
│   ├── host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
│   ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│   ├── staging
│   └── target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据 │               用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk。
├── README
├── support
├── system
└── toolchain

3、配置编译

        Buildroot 默认支持了热门的开发板,比如说树莓派,相关的配置文件都位于configs文件目录下:使用如下命令来选择配置文件:make xxxx_defconfig。(xxxx_defconfig:是configs文件目录下的文件)我使用的是qemu模拟器的配置文件:qemu_aarch64_virt_defconfig,选择好配置文件后,使用make menuconfig 命令进行配置:

buildroot国内镜像 build root_linux

         make menuconfig配置界面可以对编译工具链、Bootloader、linux kernel、文件系统等进行配置。如果要单独配置单个模块可以使用make xxxx-menuconfig进行配置,比如需要配置linux kernel则使用:make linux-menuconfig;

buildroot国内镜像 build root_配置文件_02

 4、编译

        配置好后,使用make指令完成编译工作。编译过程中会产生编译错误,处理如下:

报错日志:../glib/gspawn.c:1497:7: error: too few arguments to function ‘close_range’

解决方案: ./output/build/host-libglib2-2.68.2/glib/gspawn.c

5、后记

        使用Buildroot编译成功后,下一篇文章我将向大家介绍Qemu模拟ARM64芯片使用GDB调试linux kernel