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