执行一个recipe。
调用#bitbake basename来执行一个recipe。其中包括:解压缩源代码包、log文件以及编译过程中的中间文件等。
在每个recipe中定义temporary工作目录,具体定义如下:
BASE_WORKDIR ?= “${TMPDIR}/work"
WORKDIR = “${BASE_WORKDIR}/${MULTIARCH_TARGET_SYS}/${PN}/${EXTENPE}${PV}-${PR}"
TMPDIR: top-level build output directory
MULTIMACH_TARGET_SYS: target system identifier
EXTENDPE: the epoch
PV: recipe version
PR: recipe reversion
Fetching source code。
使用变量值SRC_URI来确定源代码的具体路径以及源代码的下载方式。
bitbake调用do_fetch()函数从recipe的SRC_URI处下载源代码。
建议在SRC_URI里面用${PV}来指定源代码的版本号。
若SRC_URI中指定的是源代码地址是SCM的,则需要指定SRCREV/PR/PV等值。
若SRC_URI中指定的是源代码包,则需要给出该源代码包的md5和sha256sum值,即:
SRC_URI = "${DEBIAN_MIRROR}/main/a/apmd/apmd_3.2.2.orig.tar.gz;name=tarball \
${DEBIAN_MIRROR}/main/a/apmd/apmd_${PV}.diff.gz;name=patch
SRC_URI[tarball.md5sum] = "b1e6309e8331e0f4e6efd311c2d97fa8"SRC_URI[tarball.sha256sum] = "7f7d9f60b7766b852881d40b8ff91d8e39fccb0d1d913102a5c75a2dbb52332d"
SRC_URI[patch.md5sum] = "57e1b689264ea80f78353519eece0c92"
SRC_URI[patch.sha256sum] = "7905ff96be93d725544d0040e425c42f9c05580db3c272f11cff75b9aa89d430"
若SRC_URI中包含本地的文件,则使用file://指定。由file://指定的文件的查找路径位于FILESPATH变量中。
Unpacking souce code。
bitbake调用do_unpack()函数解压缩源代码到${S}目录。若SRC_URI中指定的源代码包是标准的${PN}-${PV}结构则不需要指定${S},否则需要在recipe中指定${S}值。
patch文件位于SRC_URI中指定。
Licensing。
recipe中需要有LICENSE变量和LIC_FILES_CHKSUM变量。
LICENSE变量指定具体license的标准,如:GPLv2等。
LIC_FILES_CHKSUM变量指定具体的license文件名以及该文件名对应的md5校验和的值,如:
LIC_FILES_CHKSUM = "file://COPYING;md5=xxx"
Configuring the recipe。
对于在编译过程中依赖的文件,在DEPENDS变量中指出。
yocto中常用的configure如下:
Autotools:在源代码中包含configure.ac文件则说明该源代码使用autotools进行配置。此时需要在recipe中只需要包含inherit autotools一行而不需要添加do_configure()任务。当然可以在EXTRA_OECONF变量中添加额外的configure选项。
CMake:在源代码中包含CMakeLists.txt文件则说明该源代码使用CMake进行配置。此时需要在recipe中只需要包含inherit cmake一行而不需要添加do_configure()任务。当然可以在EXTRA_OECONF变量中添加额外的configure选项。
Other:在源代码中既没有configure.ac也没有CMakeLists.txt则需要在recipe中添加do_configure()任务。通常在do_configure()任务中需要执行./configure命令对源代码进行配置。
通常在configure完成后需要查看log.do_configure文件来确认配置过程的正确性。
Compile。
在编译的时候bitbake调用do_compile()任务进行编译。
常见的编译错误如下:
parallel build failures:并行编译错误。
improper host path usage:错误的主机路径。通常在交叉编译上出现。
failure to find required libraries/headers:未能找到需要的库/头文件。有可能是DEPENDS变量中没有添加依赖的软件包。
Installing。
在安装的时候bitbake调用do_install()任务进行安装。
安装的过程实质上就是将待安装的文件从${S}或${B}或${WORKDIR}处复制到${D}处。
yocto中常用的install类型如下:
Autotools或CMake:这两种类型的install来说,yocto知道如何安装,所以不需要在recipe中编写do_install()任务。当然可以使用do_install_append()函数来安装yocto未安装的内容。
Other(make install):这种类型的install来说需要在recipe中编写do_install()任务。在该任务中应该调用oe_runmake install命令并且需要传递目标目录等变量,如:DESTDIR=${D} PREFIX=${D}等。
Manual:这种类型的install来说需要在recipe中编写do_install()任务。之后在do_install()任务中首先调用install -d命令在${D}目录下创建指定目录,之后使用install命令手动的复制文件到${D}目录中。
Enabling System Service。
通常在安装完毕后,若需要在系统启动时在后台启动一个进程,则需要在do_install_append()函数中指定。
yocto支持两种系统启动方式,具体内容如下:
SysVinit:需要在recipe中使用inherit update-rc.d。该类帮助完成sysvinit的设置。在recipe中需要设置 , , and 这三个变量值。
systemd:需要在recipe中使用inherit systemd。
Packaging。
在这个阶段bitbake调用do_package()函数进行处理。do_package()任务执行如下几个阶段:
Splitting Files:将编译且安装好的文件分类放置,如:带debug符号的版本、文档以及其他逻辑组成部分等。
Running QA Checks:添加了insane类来执行必要的QA检查。此处做的QA检查能够过滤掉在运行过程中通常的问题。
Hand-Checking:手动检查${WORKDIR}/packages-split目录中的内容是否正确。
Splitting an Application into Multiple Packages:将split的程序添加到不同的packages中。
Installing a Post-Installation Script:执行post-installation脚本。
Marking Package Architecture:若设置MACHINE变量,则说明yocto针对指定架构进行的,因此需要设置PACKAGE_ARCH = “${MACHINE_ARCH}”。若没有设置MACHINE变量,则说明yocto针对所有架构进行的,以昵称需要设置inherit allarch在recipe中。
Properly Versioning Pre-Release Recipes。
通常在recipe中进行如下设置:
REALPV = “0.8.16-rc1"
PV = “0.8.15+${REALPV}"
Post-Installation Scripts。
Post-Installation脚本通常在package安装到target后或者package添加到image后立即被执行。需要在recipe中添加如下内容:
pkg_postinst_PACKAGENAME() {
…...
}
若该函数成功执行则package被标识为installed,否则该package被标识为unpacked并且在image引导后执行。下面的函数给出delay执行的实例,即:
pkg_postinst_PACKAGENAME() {
if [ x"$D" = "x" ]; then
# Actions to carry out on the device go here
else
exit 1
fi
}
Splitting an Application into Multiple Packages。
在recipe中使用PACKAGES和FILES变量将文件分别放置到不同的package中。其中packages名称由PACKAGE变量指定,每个package中的文件内容由FILES变量指定,例如:
PACKAGES =+ “package1 package2"
FILES_package1 = “${bindir}/xxx"
FILES_package2 = “${bindir}/yyy"
Packaging externally produced binaries。
使用bin_package类完成二进制文件的yocto操作。
对于无法使用bin_package类来说,需要在recipe中设置do_configure[noexec]=“1"以及do_compile[noexec]=“1”同时需要设置fetch和install的内容。