我怎样才能让 "HelloWorld - BitBake Style" 在更新版本的 Yocto 上工作?

How can I get "HelloWorld - BitBake Style" working on a newer version of Yocto?

在书 "Embedded Linux Systems with the Yocto Project" 中,第 4 章包含一个名为 "HelloWorld - BitBake style" 的示例。我在尝试让旧示例针对 "Sumo" 版本 2.5 工作时遇到了一堆问题。

如果您像我一样,按照本书的说明遇到的第一个错误是您复制了 bitbake.conf 并得到:

ERROR: ParseError at /tmp/bbhello/conf/bitbake.conf:749: Could not include required file conf/abi_version.conf

而且在复制完abi_version.conf之后,你不断发现越来越多的交叉连接文件需要移动,然后出现一些相对路径错误......有没有更好的方法?

这里有一系列步骤,可以让您根据本书的说明bitbake nano

除非另有说明,这些示例和说明均基于online copy of the book's code-samples。虽然方便复制粘贴,但网上的资源与打印的并不完全一致,至少还有一个额外的错误。

初始工作区设置

本指南假定您正在使用 Yocto 2.5 版 ("sumo"),安装到 /tmp/poky,并且构建环境将进入 /tmp/bbhello。如果你还没有 Poky tools+libraries,最简单的方法是克隆它:

$ git clone -b sumo git://git.yoctoproject.org/poky.git /tmp/poky

然后你可以初始化工作区:

$ source /tmp/poky/oe-init-build-env /tmp/bbhello/

如果您启动一个新的终端 window,您将需要重复之前的命令,这将让您的 shell 环境再次设置,但它不应替换任何文件第一次在工作区内创建。

设置默认值

oe-init-build-env 脚本应该刚刚为您创建了这些文件:

  • bbhello/conf/local.conf
  • bbhello/conf/templateconf.cfg
  • bbhello/conf/bblayers.conf

保留这些,它们会取代一些书籍说明,这意味着您应该创建或拥有文件:

  • bbhello/classes/base.bbclass
  • bbhello/conf/bitbake.conf

同样,不要用书中的样本覆盖bbhello/conf/bblayers.conf。相反,编辑它以添加指向您自己的 meta-hello 文件夹的单行,例如:

BBLAYERS ?= " \
  ${TOPDIR}/meta-hello \
  /tmp/poky/meta \
  /tmp/poky/meta-poky \
  /tmp/poky/meta-yocto-bsp \
  "    

正在创建层和配方

继续创建以下文件from the book-samples:

  • meta-hello/conf/layer.conf
  • meta-hello/recipes-editor/nano/nano.bb

我们会在遇到错误时逐步编辑这些文件。

找不到食谱错误

错误:

ERROR: BBFILE_PATTERN_hello not defined

这是由于图书网站的 bbhello/meta-hello/conf/layer.conf 内部不一致造成的。它使用集合名称 "hello" 但在接下来的两行中使用 _test 后缀。只需将它们更改为 _hello 即可匹配:

# Set layer search pattern and priority
BBFILE_COLLECTIONS += "hello"
BBFILE_PATTERN_hello := "^${LAYERDIR}/"
BBFILE_PRIORITY_hello = "5"

有趣的是,该错误并没有出现在本书的印刷本中。

没有许可证错误

错误:

ERROR: /tmp/bbhello/meta-hello/recipes-editor/nano/nano.bb: This recipe does not have the LICENSE field set (nano)
ERROR: Failed to parse recipe: /tmp/bbhello/meta-hello/recipes-editor/nano/nano.bb

可以通过添加具有 bitbake 可识别的值之一的许可证设置来修复。在这种情况下,在 nano.bb of:

上添加一行
LICENSE="GPLv3"

配方解析错误

ERROR: ExpansionError during parsing /tmp/bbhello/meta-hello/recipes-editor/nano/nano.bb
[...]
bb.data_smart.ExpansionError: Failure expanding variable PV_MAJOR, expression was ${@bb.data.getVar('PV',d,1).split('.')[0]} which triggered exception AttributeError: module 'bb.data' has no attribute 'getVar'

这是通过更新配方中使用的特殊 python 命令来解决的,因为 @bb.data 已被弃用,现在已被删除。相反,将其替换为 @d,例如:

PV_MAJOR = "${@d.getVar('PV',d,1).split('.')[0]}"
PV_MINOR = "${@d.getVar('PV',d,1).split('.')[1]}"

许可证校验和失败

ERROR: nano-2.2.6-r0 do_populate_lic: QA Issue: nano: Recipe file fetches files and does not have license file information (LIC_FILES_CHKSUM) [license-checksum]

这可以通过向配方添加一个指令来解决,告诉它要抓取哪个包含许可信息的文件,以及我们期望它有什么校验和。

我们可以按照食谱生成 SRC_URI 的方式,稍微修改一下,使其指向同一网络目录中的 COPYING 文件。将此行添加到 nano.bb:

LIC_FILES_CHKSUM = "${SITE}/v${PV_MAJOR}.${PV_MINOR}/COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949"

本例中的 MD5 校验和来自手动下载和检查 the matching file

完成!

现在 bitbake nano 应该可以工作了,当它完成时你应该看到它已构建 nano:

/tmp/bbhello $ find ./tmp/deploy/ -name "*nano*.rpm*"
./tmp/deploy/rpm/i586/nano-dbg-2.2.6-r0.i586.rpm
./tmp/deploy/rpm/i586/nano-dev-2.2.6-r0.i586.rpm

我最近参与了那个动手实践的 hello world 项目。就我而言,我认为书中的源代码包含一些错误。下面是建议的修复列表:

继承原生class

事实上,当您使用从 poky 获得的 bitbake 构建时,它只针对目标构建,除非您在您的配方中提到您正在为主机(本机)构建。您可以通过在食谱末尾添加这一行来完成后者:

inherit native

添加许可信息

值得一提的是变量LICENSE在任何配方中设置都很重要,否则bitbake会出现错误。在我们的例子中,我们尝试构建 nano 编辑器的 2.2.6 版本,它的当前许可证是 GPLv3,因此应该如下提及:

LICENSE = "GPLv3"

使用 os.system 调用 正如书中所述,您不能直接从 python 函数取消引用元数据。这意味着必须通过 d 字典访问元数据。下面,有一个建议do_unpack python函数,你可以用它的概念来编码下一个任务(do_configure,do_compile):

python do_unpack() {
    workdir = d.getVar("WORKDIR", True)
    dl_dir  = d.getVar("DL_DIR", True)
    p       = d.getVar("P", True)
    tarball_name = os.path.join(dl_dir, p+".tar.gz")

    bb.plain("Unpacking tarball")
    os.system("tar -x -C " + workdir + " -f " + tarball_name)
    bb.plain("tarball unpacked successfully")
}

启动 nano 编辑器

成功构建 nano 编辑器 包后,您可以在以下目录中找到 nano 可执行文件,以防您使用 Ubuntu(arch x86_64 ):

./tmp/work/x86_64-linux/nano/2.2.6-r0/src/nano

如果您有任何意见或问题,请不要犹豫!