yocto-第23篇-BitBake全过程(1)

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

源文件来源

在构建系统是所生成和创建Images或任何软件包,都必须要有源文件(可以是源代码或者是编译好的执行文件或者库)。源文件可以是从“Upstream Project Release”(一般是某个软件版本的压缩包,比如dbus-1.13.2.tar.gz)、“本地项目”(源文件一般就在本地电脑上面)和“SCMs”(软件配置管理,比如git项目)。参考下图:
在这里插入图片描述

SRC_URI变量

BitBake使用SRC_URI变量来指向源文件,而不考虑它们的位置。每个recipe必须有一个指向源的SRC_URI变量。
注意:本地源文件在SRC_URI变量中的表示形式是"file://"开头,加上路径

DL_DIR变量

在build/conf/local.conf文件中可以使用DL_DIR变量来指定源文件可以下载到相应的目录中,通常默认的下载路径在:

poky]$ ls build/downloads/
  • 1

如果是多用户使用,可以避免重复下载,可以将dowloads目录指定到一个共有目录下,比如:

DL_DIR ?= "/opt/downloads"
  • 1

同时修改下该目录想权限:

$ chmod 777 /opt/downloads
  • 1

通常一个下载完成的软件包会对应有个软件包名加“.done”的文件标志该软件包已下载完成,例如:

poky]$ ls -l build/downloads/zlib*
-rw-rw-r-- 1 peeta peeta 467960 1月  16  2017 build/downloads/zlib-1.2.11.tar.xz
-rw-rw-r-- 1 peeta peeta    463 10月  3 16:47 build/downloads/zlib-1.2.11.tar.xz.done
  • 1
  • 2
  • 3

SRCREV变量

如果是通过git方式下载的代码,还会使用SRCREV变量来选择指定的版本构建。

生成的Images和SDK路径

构建生成的Images或者SDK都位于poky/build/tmp/deploy/目录下面,参考下图:
在这里插入图片描述

PACKAGE_CLASSES变量

此变量在build/conf/local.conf中可以找到,指定OpenEmbedded构建系统在打包数据时使用何种包管理器。可以传入多个类型参数,用空格隔开,如下所示:

PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk package_tar"
  • 1

不过在我的配置文件中是这样的:

PACKAGE_CLASSES ?= "package_rpm"
  • 1

没有特殊需求暂时不动。

DEPLOY_DIR变量

定义生成的Images和SDK输出路径,比如默认的就是poky/build/tmp/deploy/

[build]$ ls tmp/deploy/  
images  licenses  rpm
  • 1
  • 2

DEPLOY_DIR_*系列变量

在PACKAGE_CLASSES变量定义中用到的rpm, ipk, deb, tarl类型的包放置的路径,由
DEPLOY_DIR_RPM, DEPLOY_DIR_IPK, DEPLOY_DIR_DEB, or DEPLOY_DIR_TAR变量定义。

[build]$ ls tmp/deploy/  
images  licenses  rpm
  • 1
  • 2

PACKAGE_ARCH变量

定义子目录名,比如我们当前的项目架构就是qemux86_64, 生成的Images文件就放在tmp/deploy/images/${PACKAGE_ARCH}/目录下面,即tmp/deploy/images/qemux86-64/目录

[build]$ ls tmp/deploy/images/
qemux86-64
  • 1
  • 2

又如:

build]$ bitbake -e learnyocto | grep ^PACKAGE_ARCH
PACKAGE_ARCH="core2-64"
PACKAGE_ARCHS="all any noarch x86_64 core2-64 qemux86_64"
  • 1
  • 2
  • 3

BitBake使用do_package_write_*任务来生成包并将它们放到DEPLOY_DIR_*定义的目录中保存(例如:do_package_write_rpm用于RPM包,保存的路径就在DEPLOY_DIR_RPM, 绝对路径就在poky/build/tmp/deploy/rpm/目录下)。还有其他打包的任务“do_package_write_deb”、“do_package_write_ipk”和“do_package_write_tar”部分。例如,考虑一个使用IPK打包管理器的场景,并且其体系架构是qemux86_64,相应的包就放在build/tmp/deploy/ipk/qemux86_64中。

[build]$ ls tmp/deploy/images/qemux86-64/
bzImage
bzImage--5.4.50+git0+416566e1f0_94667198aa-r0-qemux86-64-20201003082353.bin
bzImage-qemux86-64.bin
core-image-sato-qemux86-64-20201102090624.qemuboot.conf
core-image-sato-qemux86-64-20201102090624.rootfs.ext4
core-image-sato-qemux86-64-20201102090624.rootfs.manifest
core-image-sato-qemux86-64-20201102090624.rootfs.tar.bz2
core-image-sato-qemux86-64-20201102090624.testdata.json
core-image-sato-qemux86-64.ext4
core-image-sato-qemux86-64.manifest
core-image-sato-qemux86-64.qemuboot.conf
core-image-sato-qemux86-64.tar.bz2
core-image-sato-qemux86-64.testdata.json
modules--5.4.50+git0+416566e1f0_94667198aa-r0-qemux86-64-20201003082353.tgz
modules-qemux86-64.tgz
[build]$ ls tmp/deploy/rpm/
core2_64  noarch  qemux86_64
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

BitBake全过程

bitbake获取源码

开始构建前都要获取源文件,然后解压,参考如下图:

在这里插入图片描述
重点关注下图片上面涉及到的一些变量,比如PN、PV、PR、WORKDIRS等。

注意图中,存在两个种层次结构:一个基于包架构(即PACKAGE_ARCH),另一个基于机器(即MACHINE)。
基础结构是相同的。区别是使用什么作为构建目标(例如通用架构、构建主机、SDK或特定机器)。

do_fetch任务

do_fetch任务就是下载或者读取源文件(或者源代码)。

do_unpack任务

do_unpack任务用于解压源文件,到build/tmp/work/相应的目录下

TMPDIR变量

OpenEmbedded构建系统执行所有工作的基目录。默认的目录是tmp目录。参考如下:

build]$ bitbake -e learnyocto | grep ^TMPDIR
TMPDIR="/home/peeta/poky/build/tmp"
  • 1
  • 2

TARGET_OS变量

目标设备的操作系统。一个典型的值是“linux”(例如。“qemux86-poky-linux”)。参考如下:

build]$ bitbake -e learnyocto | grep ^TARGET_OS
TARGET_OS="linux"
  • 1
  • 2

PN变量

用于构建包的recipe的名称。这个变量可以有多种含义。但是,当在输入文件的上下文中使用时,PN表示recipe的名称。比如learnyocto的recipe名就是learnyocto,参考:

build]$ bitbake -e learnyocto | grep ^PN
PN="learnyocto"
  • 1
  • 2

WORKDIR变量

用来构建recipe的位置。参考如下:

build]$ bitbake -e learnyocto | grep ^WORKDIR=
WORKDIR="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0"
  • 1
  • 2

PV变量

用于构建包的recipe版本。参考如下:

build]$ bitbake -e learnyocto | grep ^PV=
PV="1.0+gitAUTOINC+cac0e57e2f"
  • 1
  • 2

PR变量

用于构建包的recipe的修订版本。参考如下:

build]$ bitbake -e learnyocto | grep ^PR=
PR="r0"
  • 1
  • 2

S变量

每个recipe在build/目录中都有一个子目录,解压后的源代码就在那里,"S"变量指向该子目录中的recipe源代码或者源文件。例如learnyocto源码路径:

build]$ bitbake -e learnyocto | grep ^S=     
S="/home/peeta/poky/build/tmp/work/core2-64-poky-linux/learnyocto/1.0+gitAUTOINC+cac0e57e2f-r0/git"
#其中cac0e57e2f为git的commit-id前面一部分
  • 1
  • 2
  • 3

learnyocto的路径可见PACKAGE_ARCH(core2-64)控制了该项目放在poky/build/tmp/work/core2-64-poky-linux目录下面,而不是poky/build/tmp/work/qemux86_64-poky-linux/目录下面。见上图中,有个:

${PACKAGE_ARCH}-poky-${TARGET_OS}
  • 1

注意:不要在S指定的路径下修改代码,是无效的哈~

BPN变量

用于构建包的recipe名称。BPN变量是PN变量的变种,通常删除了前缀和后缀。参考如下:

build]$ bitbake -e learnyocto | grep ^BPN=
BPN="learnyocto"
  • 1
  • 2