buildroot构建文件系统

1.简介

  开发嵌入式软件时,有很多时候,我们将uboot+kernel+应用程序,统一打包成烧写文件,这样方便实际生产,因此构建出烧写文件的文具就必不可少。   构建Linux上的文件系统有多种工具,例如:yocto,buildroot,各种工具有自己的有缺点,本wiki主要记录buildroot构建文件系统。
  之前提及的busybox,busybox一般只包含基础的命令,比如常见的ls cd等等,还有一些更复杂的工具,例如grep,find,telnet等。这个busybox称作linux工具 里的瑞士军刀。
  今天提及的buildroot包含busybox,同时可以包含uboot和kernel,可以说全部,可以得到最终烧写文件。
  yocto类似,也可以包含uboot,kernel和根文件系统,生成最后的烧写文件。

2.关于Linux内核编译生成产物

(1)bzImage是vmlinux经过gzip压缩后的文件,适用于大内核(bzImage是x86 linux常用的一种压缩镜像文件 )。
(2)zImage是vmlinux经过gzip压缩后的文件,适用于小内核( zImage是ARM linux常用的一种压缩镜像文件)。
(3)uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”。
说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。 备注: bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法,bzImage的压缩率更高。 3.buildroot文件目录结构说明   下载一个buildroot文件,解压后可以看到该文件目录结构,如下是目录结构:

--arch:存放cpu架构相关的配置脚本,如arm/mips/x86,这些和cpu相关的配置,在制作工具链时,编译uboot和kernel时很关键
    --board
    --boot
    --config.in
    --configs:放置开发板的一些配置参数
        --dl:存放下载的源代码以及应用软件的压缩包
            --docs:存放相关的参考文档
            --fs:存放各种文件系统的源代码(包括jffs2,ext2等)
            --linux:存放着linux kernel的自动构建脚本(其中包括Config.in, *.mk等
                --output:编译出来的输出文件
                --build:存放解压后的各种软件包编译完成后的现场
                --host:存放制作好的编译工具链,如gccarm-linux-gcc等
                --images:存放着编译好的ubootzImagerootfs等镜像文件,可以烧录
                --target:用来制作rootfs文件系统,里面存放着linux系统基本的目录结构
                以及编译好的应用库和bin可执行文件,(buildroot根据用户
                配置把.ko .so .bin文件安装到对应的目录下去,根据用户的
                配置安装到指定位置)。
                --package:下面放着应用软件的配置文件,每个应用软件的配置文件有config.in  soft_name.mk
                这种就是makefile脚本自动构建,可以去下载应用软件包。

在开发中,我们使用buildroot,构建文件流程

  • 1).通过make xxx_defconfig来选择一个defconfig,这个文件在config目录下。
  • 2).通过make menuconfig进行配置。
  • 3).buildroot下面,配置完成后,执行make
    一般make命令执行如下几步
    1.下载源码文件(这个下载过程很漫长,如果有已经下载好的dl文件,直接解压放到buildroot根目录下)
    2.配置、编译和安装交叉编译链
    3.配置、编译和安装所选的目标包
    4.编译内核镜像
    5.编译bootloader镜像
    6.创建rootfs镜像
    编译完成后,产物放在output目录下
    
    # 3.新增配置package包
1.新增加pack文件夹
在buildroot/package文件夹下面,创建一个对应需要的pack文件夹,并将文件放入
或者根据实际需要进行下载
2.检查文件夹目录
打开buildroot/package/Config.in文件,这里用来配置package指定工具的
Config.in方式
    参考文件:
    menu "opencode" #make menuconfig 可以看到该配置项
        source "package/opencode/Config.in"
    endmenu
3.增加程序编译选项
打开项目实际用到的*_defconfig 配置文件或者在buildroot/package/*.mk内配置
    增加参考:
    BR2_PACKAGE_XXX=y
4.验证
增加完成后,进行编译,在buildroot/output/target/usr/lib下面寻找so文件

4.实例创建一个package

新增加的module名为:dong
  本次测试中需要重点注意的问题:

1、如何启动这个软件包的编译

  在defconfig里面开启允许编译这个module(修改.config,修改defconfig,使用make xx_defconfig)

BR2_PACKAGE_DONG=y

  这个module必须要开启,才能编译这个模块。

2.设置好这个新添加的模块

(1).package下面创建dong文件夹 在package/Config.in下面

package/Config.in下面
        menu "Dong ruibin test package"
            source "package/dong/Config.in"
        endmenu

注意:在package/dong 下面增加Config.in 和 mk文件(只有打开了BR2_PACKAGE_DONG=y,才能编译到mk) 在修改mk之前,需要先了解清楚具体的变量含义:

_VERSION结尾的变量是源码的版本号
_SITE_METHOD结尾的变量是源码下载方法
_SITE结尾变量是源码下载地址
_BUILD_CMDS结尾的变量会在buildroot框架编译的时候执行,用于给源码的Makefile传递编译选项和链接选项,调用源码的Makefile
_INSTALL_TARGET_CMDS结尾的变量是在编译完之后,自动安装执行,一般是让buildroot把编译出来的的bin或lib拷贝到指定目录

$(eval$(generic-package)) 最核心的就是这个东西了,一定不能够漏了,不然源码不会被编译,这个函数就是把整个.mk构建脚本,通过Buildroot框架的方式
展开到Buildroot/目录下的Makfile中,生成的构建目标(构建目标可以在Makefile里面写)

注意:_BUILD_CMDS结尾的变量会在buildroot框架编译的时候执行,这个是要注意好的 参考mk文件:

################################################################
#
# dong module
#
#xxx_BUILD_CMDS----这个是编译代码的入口
################################################################
DONG_VERSION = 1.0                    #指定一个version
DONG_SITE_METHOD = local              #使用本地代码库
DONG_SITE = $(TOPDIR)/dl/dong         #代码路径文件夹
DONG_LICENSE = GPL-2.0
DONG_LICENSE_FILES = LICENSE

define DONG_BUILD_CMDS                #builroot编译框架执行时,执行里面的命令行
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
endef
###CC="$(TARGET_CC)" LD="$(TARGET_LD)"----这个编译工具链,导入builroot的
###这样才能交叉编译(一般是buildroot构建生成的)

define DONG_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/libdong.so $(TARGET_DIR)/lib
endef
#####上面可以直接install,可以cp,也可以直接make install
$(eval $(generic-package))   #这个是必须要的,否则不能成功

  上述参考为,编译本地路径的代码,实际开发可以将配置修改为git仓库,添加git仓库要注意拉取代码的路径权限