Poky
是Yocto
项目的参考发行版,它包含 OpenEmbedded
构建系统(BitBake
和 OpenEmbedded-Core
)以及一组元数据,可帮助我们开始构建自己的发行版。
OpenEmbedded
工作流
OpenEmbedded
构建系统 采用了“工作流程”来完成镜像和SDK
的生成。下图概述了该工作流程:
以下是“工作流程”的简短步骤:
- 源获取:构建系统从指定位置获取并下载源代码。构建系统支持标准方法,如
tarball
或源代码存储库系统,如Git
。 - 源解压和打补丁:下载源代码后,构建系统会将源提取到应用修补程序的本地工作区。
- 配置,编译和安装:构建系统提供了各种模式来构建标准软件包,例如基于
Make
,GNU Autotools
和CMake
的包。运行配置和编译软件的常用步骤后,构建系统讲软件安装到临时暂存区域。 - 输出分析和打包:在输出分析中,由前一个步骤生成和安装的软件按照功能分成:运行时文件,调试文件,开发文件,文档和语言环境。在分析之后,我们选择的二进制包格式(
DEB
,RPM
或IPK
)用于汇总和打包软件。 QA
和健全性检查:在整个构建过程中运行不同的QA
和健全性检查。- 镜像创建:创建二进制文件后,构建系统会生成二进制包提要,用于创建最终的根文件镜像。镜像可以以多种格式被创建,包括用于解压在格式化的文件系统中的
tar.bz2
,它们可以被直接比特复制到合适的存储设备。 - 软件开发工具包生成:作为格外的步骤:构建系统生成用于并行应用程序开发的自定义可扩展
SDK
(eSDK
)。
通常,构建的“工作流程”包含几个功能区域:
- 用户配置: 可用于控制构建过程的元数据。
- 元数据层: 提供软件,机器和发行版元数据的各种层。
- 源文件: 上游版本,本地项目和
SCM
。 - 构建引擎:
BitBake
控制下的进程 。该块扩展了BitBake
如何获取源代码,应用补丁程序,完成编译,分析包生成的输出,创建和测试包,生成镜像以及生成交叉开发工具。 - 包源: 包含输出包(
RPM
,DEB
或IPK
)的目录,随后用于构建系统生成的镜像或软件开发工具包(SDK
)。 - 镜像: 工作流程生成的镜像。
- 应用程序开发
SDK
: 与镜像一起生成或使用BitBake
单独生成的交叉开发工具。
下面介绍其中几个重点的功能区域。
用户配置
用户配置有助于定义构建。通过用户配置,你可以告诉BitBake
你要为其构建镜像的目标体系结构,存储下载源的位置以及其他构建属性。
下图显示了常规工作流程图的“用户配置”框的扩展表示 :
下面程序清单显示了在构建已经运行后的前2级目录,我们重点关注配置目录conf
:
$ tree -L 2 build
build
├── cache
├── conf
│ ├── bblayers.conf
│ ├── local.conf
│ ├── sanity_info
│ └── templateconf.cfg
├── nohup.out
└── tmp
├── abi_version
├── buildstats
├── cache
├── deploy
├── hosttools
├── log
├── pkgdata
├── saved_tmpdir
├── sstate-control
├── stamps
├── sysroots
├── sysroots-components
├── sysroots-uninative
├── work
└── work-shared
新创建的环境仅仅包含conf子目录和2个文件:bblayers.conf
和local.conf
。前面的文章已经遇到过local.conf
,这个文件包含用户构建环境的所有配置设置。文件bblayers.conf
包含用户构建环境的层设置,比如下面这个典型的bblayers.conf
文件:
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/absolute/path/to/poky/meta \
/absolute/path/to/poky/meta-poky \
/absolute/path/to/poky/meta-yocto-bsp \
/absolute/path/to/poky/meta-altera \
"
这个文件中最重要的变量是BBLAYERS
,他是空格分隔的,到所有该构建环境包含的层的路径列表。
元数据层
元数据层是分组和组织菜谱,类,配置文件和其他元数据到逻辑实体中的容器。通常,存在三种类型的层输入:
- 元数据(
.bb
+补丁): 包含用户提供的配方文件,补丁和附加文件的软件层。一个很好的例子可能是meta-qt5
,该层适用于桌面和嵌入式的流行的Qt
跨平台应用程序开发框架。 - 机器
BSP
配置: 板支持包(BSP
)层(即下图中的“BSP
层”),提供特定于机器的配置。此类信息特定于特定目标体系结构。来自Poky
的BSP
层的一个很好的例子是meta-yocto-bsp
层。 - 发行配置: 发行层(即下图中的“
Distro Layer
”),为正在为特定分发构建的镜像或SDK
提供顶级或一般策略。例如,默认发行层是meta-poky
层。
通常,所有层都具有类似的结构。如果要分发图层,它们都包含许可文件COPYING.MIT
,README
作为良好实践的说明文件,特别是如果要分发图层,配置目录和配方目录的时候会非常有效。当然,这里面最重要的文是layer.conf
,下面是一个典型的例子:
# We have a conf and classes directory, add to BBPATH
BBPATH =. "${LAYERDIR}:"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "yocto"
BBFILE_PATTERN_yocto = "^${LAYERDIR}/"
BBFILE_PRIORITY_yocto = "5"
LAYERSERIES_COMPAT_yocto = "thud"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
LAYERVERSION_yocto = "3"
LAYERDEPENDS_yocto = "core"
REQUIRED_POKY_BBLAYERS_CONF_VERSION = "2"
第一个赋值向BBPATH
变量增加层目录。之后是层的菜谱被增加到BBFILES
变量。BBFILE_COLLECTIONS
是层名字列表,BBFILE_PATTERN
和BBFILE_PRIORITY
都以这个层名字为条件来匹配路径或者确定优先级的。
构建引擎
OpenEmbedded
构建系统使用 BitBake
生成镜像和软件开发工具包(SDK)。该构建引擎主要完成的工作包括:获取源代码,应用补丁程序,完成编译,分析包生成的输出,创建和测试包,生成镜像以及生成交叉开发工具。这部分的内容会在下一篇文章中全面展开讲解。
未完待续。。。