在“带有Yocto项目的嵌入式Linux系统”一书中,第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
之后,您不断发现需要移动的越来越多的交叉连接文件,然后发现一些相对路径错误...还有更好的方法吗?
答案 0 :(得分:3)
以下是一系列步骤,可让您根据本书的说明bitbake nano
。
除非另有说明,否则这些示例和说明均基于online copy of the book's code-samples。在线资源虽然便于粘贴粘贴,但它与印刷版本并不完全一致,并且至少包含一个额外的错误。
本指南假定您正在使用安装在/tmp/poky
中的Yocto 2.5版(“ sumo”),并且构建环境将进入/tmp/bbhello
。如果您还没有Poky工具+库,最简单的方法是使用以下方法克隆它:
$ git clone -b sumo git://git.yoctoproject.org/poky.git /tmp/poky
然后您可以使用以下方法初始化工作区:
$ source /tmp/poky/oe-init-build-env /tmp/bbhello/
如果启动新的终端窗口,则需要重复前面的命令,该命令将重新设置您的Shell环境,但是它不应替换第一次在工作空间内创建的任何文件。 / p>
oe-init-build-env
脚本应该已经为您创建了以下文件:
保留这些内容,它们会取代一些书中的说明,这意味着您不要创建或拥有文件:
类似地,不要用本书的示例覆盖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:
遇到错误时,我们将逐步编辑这些文件。
错误:
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
上添加一行:
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
的方式进行操作,并对其稍加修改以指向同一Web目录中的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
答案 1 :(得分:0)
我最近从事了这个动手打招呼世界项目。就我而言,我认为书中的源代码包含一些错误。下面是建议的修复程序列表:
继承本机类
实际上,当您使用从poky获得的bitbake进行构建时,它仅针对目标进行构建,除非您在配方中提到要针对主机(本机)进行构建。您可以通过在食谱末尾添加以下行来完成后者:
inherit native
添加许可证信息
值得一提的是,在任何配方中设置变量 LICENSE 都很重要,否则bitbake会引发错误。在我们的案例中,我们尝试构建nano编辑器的2.2.6版本,其当前许可证为GPLv3,因此应如下所述:
LICENSE = "GPLv3"
使用操作系统调用 如书中所述,您不能直接从python函数取消引用元数据。这意味着必须通过 d 词典访问元数据。在下面,对于python函数do_unpack有一个建议,您可以使用它的概念来编写下一个任务(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编辑器程序包后,如果使用的是Ubuntu(arch x86_64),则可以在以下目录中找到您的nano可执行文件:
./tmp/work/x86_64-linux/nano/2.2.6-r0/src/nano
如果您有任何意见或疑问,请不要犹豫!