yocto recipe构建流程介绍
1.recipe构建过程简介
在使用devtool build命令构建recipe时,典型的构建过程如下:
- 获取源代码
- 解压缩源代码
- 配置源代码
- 编译源代码
- 安装构建输出
- 打包已安装的输出
对于工作空间中的recipes,在源码树中已经禁用了获取和解压缩过程,因为这两个过程是完备且可持续使用的,一般而言不需要进行修改。 这些构建步骤中的每一个都被定义为一个函数(任务),通常带有一个“ do_”前缀(例如do_fetch,do_unpack等)。 这些函数通常是shell脚本,但是可以用Python编写。
如果查看配方的内容,你不难会发现该配方不包含有关构建软件的完整说明。取而代之的是,通用功能封装在使用inherit指定的继承类中。这个方式可以使配方仅用于描述特定软件所需的构建内容。且存在一个所有配方隐式继承的base类,并提供大多数配方通常都需要的功能。
以下部分介绍使用配方时的一些可用的信息。
2.查找日志和工作文件
在第一次运行devtool build命令之后,先前使用devtool add命令创建的配方或使用devtool modify命令修改的源码的配方均包含在源码树中创建的符号链接:
-
oe-logs:该链接指向在其中创建每个构建步骤的日志文件和运行脚本的目录。
-
oe-workdir:该链接指向配方的临时工作区。oe-workdir下的以下目录位置十分有用:
- image/:包含在do_install阶段安装的所有文件。在recipe中,该目录由表达式${D}引用。
- sysroot-destdir/:包含do_install中安装的已放入共享sysroot中的文件的子集。有关更多信息,请参见Sharing Files Between Recipes部分。
- packages-split /:包含配方生成的每个软件包的子目录。 有关更多信息,请参见packaging部分。
可以使用这些链接来获取有关每个构建步骤中所完成的事情的更多信息。
3.设置配置参数
如果使用GNU autoconf构建软件,那么会将固定的参数集传递给它,以启用交叉编译以及在recipe中通过EXTRA_OECONF或PACKAGECONFIG_CONFARGS设置的其他功能。如果你想传递其他选项,需要将它们添加到EXTRA_OECONF或PACKAGECONFIG_CONFARGS。其他受支持的构建工具具有类似的变量(例如,对于CMake,使用EXTRA_OECMAKE,对于Scons,则使用EXTRA_OESCONS,等等)。如果需要在make命令行上传递任何内容,则可以使用EXTRA_OEMAKE或PACKAGECONFIG_CONFARGS变量来执行此操作。
此外,可以使用devtool configure-help命令来帮助设置上述内容中列出的参数。该命令确定要传递的明确选项,并将它们与通过EXTRA_OECONF或PACKAGECONFIG_CONFARGS指定的任何自定义参数一起显示出来。如果是可应用的,该命令还会显示配置脚本的“DASHDASHhelp”选项的输出作为参考。
4.recipes间共享文件
recipes通常需要使用Build Host上其他recipe提供的文件。例如,链接到公共库的应用程序需要访问库本身及其关联的头。在可扩展SDK中完成此访问的方式是通过sysroot。每一个需要构建SDK的“machine”都存在一个sysroot。实际上,这意味着目标机器存在一个sysroot,而构建主机存在一个sysroot。
在recipe中永远不要将文件直接写入sysroot。而是应在${D}目录中的do_install任务期间将文件安装到标准位置。这些文件的子集将自动进入sysroot。出现此限制的原因是,进入sysroot的几乎所有文件都在清单中分类,以确保以后在修改或删除配方时可以将其删除。因此sysroot能够保留旧文件。
5.打包
打包在可扩展SDK中并不总是特别相关。 但是,如果需要检查构建输出如何进入目标设备的最终镜像,则了解打包过程是非常重要的,因为映像的内容是根据打包的过程完成的而不是配方。
在do_package任务期间,将在do_install任务期间安装的文件拆分为一个主软件包(命名几乎总是与recipe相同),并拆分为其他几个软件包。之所以存在这种分离,是因为并非所有安装的文件在每个映像中都有用。 例如,可能不需要在映像中安装任何的文档。因此,对于每个配方,文档文件都被拆分到-doc包。包含可选模块或插件的打包软件的recipe也可能会进行其他打包拆分。
构建recipe后,可以通过在oe-workdir/ packages-split目录中查看文件的去向,该目录包含每个软件包的子目录。除某些高级情况外,PACKAGES和FILES变量控制拆分。PACKAGES变量列出了所有要生成的软件包,而FILES变量通过使用重写指定软件包来指定要包含在每个软件包中的文件。例如,FILES_ P N ∗ ∗ 指 定 要 进 入 主 程 序 包 的 文 件 ( 即 , 主 程 序 包 与 配 方 具 有 相 同 的 名 称 , 而 {PN}**指定要进入主程序包的文件(即,主程序包与配方具有相同的名称,而 PN∗∗指定要进入主程序包的文件(即,主程序包与配方具有相同的名称,而 {PN}等于配方名称)。PACKAGES值的顺序很重要。对于每个安装文件,其FILES值与该文件匹配的第一个软件包是该文件所进入的软件包。PACKAGES和FILES**变量均存在默认值。因此,你会发现甚至不需要在配方中设置这些变量,除非配方正在构建的软件将文件安装到非标准位置。