手动创建一个recipe

https://my.oschina.net/linuxhunter/blog/736207
执行一个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中需要设置 INITSCRIPT_PACKAGES, INITSCRIPT_NAME, and INITSCRIPT_PARAMS这三个变量值。

 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的内容。

猜你喜欢

转载自blog.csdn.net/hbcbgcx/article/details/84885934