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:存放制作好的编译工具链,如gcc,arm-linux-gcc等
--images:存放着编译好的uboot,zImage,rootfs等镜像文件,可以烧录
--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# 3.新增配置package包
一般make命令执行如下几步: 1.下载源码文件(这个下载过程很漫长,如果有已经下载好的dl文件,直接解压放到buildroot根目录下) 2.配置、编译和安装交叉编译链 3.配置、编译和安装所选的目标包 4.编译内核镜像 5.编译bootloader镜像 6.创建rootfs镜像 编译完成后,产物放在output目录下
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仓库要注意拉取代码的路径和权限。
您还没有登录,请您登录后发表评论。