分享

OpenBmc开发5:bitbake介绍与使用

 看见就非常 2022-03-15

1、bitbake简介

         BitBake 是一种软件组建自动化工具程式。功能类似于make,是针对于嵌入式Linux交叉编译器环境所设计研发。它源自于Gentoo Linux的软件包管理系统,是用 Python 写的一个程序。它是 OpenEmbedded 构建系统时使用的生产工具,比如Yocto 、WindRiver Linux 等嵌入式系统都是在使用它进行编译。它是一个多任务引擎,可以并行执行 shell 和 Python 任务,每个任务单元根据预定义的元数据来管理源码、配置、编译、打包,并最终将每个任务生成的文件集合成为系统镜像。例如要从源码构建一个 Linux 系统,需要搭建一个生产环境,然后依次生成 Grub、Kernel、各种库文件、各种可执行文件,然后集合到一个文件系统里。如果你玩过 LFS ,就会了解这个过程的复杂性。BitBake 存在的意义就是提供了一个高效的工具,并将这个过程标准化、流程化。BitBake 与 GNU Make 的关系就像 GNU Make 之于 GCC ,运作方式也类似 GNU Make ,但又有很多不同:

  • BitBake 根据预先定义的元数据执行任务,这些元数据定义了执行任务所需的变量,执行任务的过程,以及任务之间的依赖关系,它们存储在 recipe(.bb)、append(.bbappend)、configuration(.conf)、include(.inc) 和 class(.bbclass) 文件中。

  • BitBake 包含一个抓取器,用于从不同的位置获取源码,例如本地文件、源码控制器(git)、网站等。

  • 每一个任务单元的结构通过 recipe 文件描述,描述的信息有依赖关系、源码位置、版本信息、校验和、说明等等。

  • BitBake 包含了一个 C/S 的抽象概念,可以通过命令行或者 XML-RPC 使用,拥有多种用户接口。

     像其它的编译工具一样(比如 make,ant,jam),bitbake在编译时控制如何去构建系统并解决构建的依赖关系,但是又区别于功能单一的工程管理工具(比如make),bitbake不依赖死板的makefile文件,而是收集和管理大量没有依赖关系的描述文件(刚才那个中称为包的配方(recipe)),然后自动按照正确的顺序进行构建。同时可以配置交叉编译,比如oe代表OpenEmbedded,而openembedded就是用来进行一些交叉编译,安装和打包的metadata(元数据)的。

2、bitbake配置文件简介  

  • Recipe ——Recipe 文件是最基本的元数据文件,每个任务单元对应一个 Recipe 文件,后缀是 .bb ,这种文件为 BitBake 提供的信息包括软件包的基本信息(作者、版本、License等)、依赖关系、源码的位置和获取方法、补丁、配置和编译方法、如何打包和安装。

  • Configuration ——Configuration 文件的后缀是 .conf ,它会在很多地方出现,定义了多种变量,包括硬件架构选项、编译器选项、通用配置选项、用户配置选项。主 Configuration 文件是 bitbake.conf ,以 Yocto 为例,位于 ./poky/meta/conf/bitbake.conf ,其他都在源码树的 conf 目录下。

  • Classes ——Class 文件的后缀是 .bbclass ,它的内容是元数据文件之间的共享信息。BitBake 源码树都源自一个叫做 base.bbclass 的文件,在 Yocto 中位于 ./poky/meta/classes/base.bbclass ,它会被所有的 recipe 和 class 文件自动包含。它包含了标准任务的基本定义,例如获取、解压、配置、编译、安装、打包,有些定义只是框架,内容是空的。

  • Layers ——Layer 被用来分类不同的任务单元。某些任务单元有共同的特性,可以放在一个 Layer 下,方便模块化组织元数据,也方便日后修改。例如要定制一套支持特定硬件的系统,可以把与低层相关的单元放在一个 layer 中,这叫做 Board Support Package(BSP) Layer 。

  • Append ——Append 文件的后缀是 .bbappend ,用于扩展或者覆盖 recipe 文件的信息。BitBake 希望每一个 append 文件都有一个相对应的 recipe 文件,两个文件使用同样的文件名,只是后缀不同,例如 formfactor_0.0.bb 和 formfactor_0.0.bbappend 。命名 append 文件时,可以用百分号(%)来通配 recipe 文件名。例如,一个名为 busybox_1.21.%.bbappend 的 apend 文件可以对应任何名为 busybox_1.21.x.bb 的 recipe 文件进行扩展和覆盖,文件名中的 x 可以为任何字符串,比如 busybox_1.21.1.bb、busybox_1.21.2.bb ... 通常用百分号来通配版本号

3、bitbake命令

          bitbake命令使用可以通过bitbake -h 查看命令参数。一般在实际编译使用的是bitbake obmc-phosphor-image,或者time bitebake obmc-phosphor-image命令,添加time可以显示编译运行时间。

bitbake obmc-phosphor-imagetime bitebake obmc-phosphor-image   #显示编译消耗时间。

4、bitbake编译流程

    OpenEmbedded 项目中有很多的脚本(shell 和 python 脚本)和数据来自动构建系统。脚本实现构建过程,包括下载(fetch)、解包(unpack)、打补丁(patch)、配置(configure)、编译(compile)、安装(install)、打包(package)、staging、做安装包(package_write_ipk)、构建文件系统、打包镜像文件等等。

    一般OE 编译顺序:

  • do_setscene

  • do_fetch

  • do_unpack

  • do_path

  • do_configure

  • do_qa_configure

  • do_compile

  • do_stage

  • do_install

  • do_package

  • do_populate_staging

  • do_package_write_deb/do_package_write_rpm

  • do_package_write

  • do_distribute_sources

  • do_qa_staging

  • do_build

  • do_rebuild

   在openbmc工程中bitbake实际是指向poky目录下的bitbake,meta是指向poky目录下的meta。在poky中元数据是在meta下。

5、编译目录介绍

      在执行 . oe-init-build-env 命令(默认是qemuarm机型参数)后会进入build目录下,此时会有一个conf文件夹。执行bitbake 命令后会生成cache、sstate-cache、tmp文件夹。(workspace是通过devtool生成文件夹)

  • conf——配置文件夹,包含了bblayers.config、local.conf、sanity_info、templateconf.cfg文件

  • cache——记录编译进度缓存

  • sstate-cache——存放编译缓存文件

  • tmp——存放编译中的缓存、解压的源码文件、生成软件安装包、编译日志、生成镜像等。

  • workspace——devtool工具生成的文件夹,用于存放源码和bbappend文件。(用于修改代码开发)

    bitbake命令生成的镜像在build/tmp/deploy/imags目录下。       

6 、环境配置

    1、使用 oe-init-build-env配置编译环境,如果不设置builddir,则默认是qemuarm。

source <path>/oe-init-build-env <builddir>

     2、使用 openbmc-env配置变异环境,一般进入openbmc文件夹后执行。

export TEMPLAMENTCONF=meta-*/meta-*/conf . openbmc-env

7、常用命令   

     编译u-boot:

bitbake uboot

    编译系统镜像:

bitbake core-image-minimalbitbake core-image-basebitbake fsl-image-guibitbake fsl-image-qt5bitbake fsl-image-multimedia

   只下载不编译:

bitbake -c fetchall    core-image-minimal

   跳过错误,继续编译:

bitbake -k core-image-minimal

   查看编译执行task: 

bitbake xx-image -c listtasks

   查找 包:

bitbake -s | grep packagename

  查找包下载地址:

bitbake -e xxx-image | grep ^SRC_URI=

   查看软件依赖关系:

bitbake -g  packagename

    清除编译结果:

bitbake -c clean -v u-bootbitbake -c cleanall     xx-image            #清除所有编译中间bitbake -c cleansstate   xx-image            #清除编译

生成编译 中的配置文件和类文件:

bitbake -e > mybuild.log

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多