手动建立一个recipe

执行一个recipe。html

     调用#bitbake basename来执行一个recipe。其中包括:解压缩源代码包、log文件以及编译过程当中的中间文件等。架构

     在每一个recipe中定义temporary工做目录,具体定义以下:app

     BASE_WORKDIR ?= “${TMPDIR}/work"ide

     WORKDIR = “${BASE_WORKDIR}/${MULTIARCH_TARGET_SYS}/${PN}/${EXTENPE}${PV}-${PR}"函数

     TMPDIR:     top-level build output directorypost

     MULTIMACH_TARGET_SYS:     target system identifierfetch

     EXTENDPE:      the epochui

     PV:     recipe versiondebug

     PR:     recipe reversion3d

 

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

相关文章
相关标签/搜索