我怎样才能让 "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
如果您有任何意见或问题,请不要犹豫!
在书 "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
如果您有任何意见或问题,请不要犹豫!