手动创建一个recipe

执行一个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_PACKAGESINITSCRIPT_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的内容。

转载于:https://my.oschina.net/linuxhunter/blog/736207

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值