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 ,但又有很多不同:
像其它的编译工具一样(比如 make,ant,jam),bitbake在编译时控制如何去构建系统并解决构建的依赖关系,但是又区别于功能单一的工程管理工具(比如make),bitbake不依赖死板的makefile文件,而是收集和管理大量没有依赖关系的描述文件(刚才那个中称为包的配方(recipe)),然后自动按照正确的顺序进行构建。同时可以配置交叉编译,比如oe代表OpenEmbedded,而openembedded就是用来进行一些交叉编译,安装和打包的metadata(元数据)的。
bitbake命令使用可以通过bitbake -h 查看命令参数。一般在实际编译使用的是bitbake obmc-phosphor-image,或者time bitebake obmc-phosphor-image命令,添加time可以显示编译运行时间。
bitbake obmc-phosphor-image
time bitebake obmc-phosphor-image #显示编译消耗时间。
OpenEmbedded 项目中有很多的脚本(shell 和 python 脚本)和数据来自动构建系统。脚本实现构建过程,包括下载(fetch)、解包(unpack)、打补丁(patch)、配置(configure)、编译(compile)、安装(install)、打包(package)、staging、做安装包(package_write_ipk)、构建文件系统、打包镜像文件等等。
一般OE 编译顺序:
在openbmc工程中bitbake实际是指向poky目录下的bitbake,meta是指向poky目录下的meta。在poky中元数据是在meta下。
在执行 . oe-init-build-env 命令(默认是qemuarm机型参数)后会进入build目录下,此时会有一个conf文件夹。执行bitbake 命令后会生成cache、sstate-cache、tmp文件夹。(workspace是通过devtool生成文件夹)
bitbake命令生成的镜像在build/tmp/deploy/imags目录下。
1、使用 oe-init-build-env配置编译环境,如果不设置builddir,则默认是qemuarm。
source /oe-init-build-env
2、使用 openbmc-env配置变异环境,一般进入openbmc文件夹后执行。
export TEMPLAMENTCONF=meta-*/meta-*/conf . openbmc-env
编译u-boot:
bitbake uboot
编译系统镜像:
bitbake core-image-minimal
bitbake core-image-base
bitbake fsl-image-gui
bitbake fsl-image-qt5
bitbake 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-boot
bitbake -c cleanall xx-image #清除所有编译中间
bitbake -c cleansstate xx-image #清除编译
生成编译 中的配置文件和类文件:
bitbake -e > mybuild.log