use*_*796 3 variables scope bitbake yocto
我使用 Yocto,我想知道变量范围在 BitBake 配方中如何工作:
我的食谱看起来像:
SRC_URI += "file://something"
python do_fetch_prepend() {
d.appendVar("SRC_URI", "https://www.bla.com/resource.tar")
bb.error("SRC_URI_1: %s " % d.getVar("SRC_URI"))
d.setVar("TEST_VAR", "test")
}
python do_unpack_append() {
bb.error("SRC_URI_2: %s " % d.getVar("SRC_URI"))
bb.error("TEST_VAR: %s " % d.getVar("TEST_VAR"))
}
Run Code Online (Sandbox Code Playgroud)
我跑bitbake -v -c unpack myrecipe
SRC_URI_1按预期打印:“file://something https://www.bla.com/resource.tar”
SRC_URI_2打印为:“file://something”
TEST_VAR打印为:无
看起来设置/更改数据存储 ( D) 中的变量仅在do_fetch. 这是预期的行为,因为我在文档中读到了D全局变量。
如果这是预期的行为,是否可以更改配方任务中的全局变量?
这个问题背后的原因是我需要另一个本机配方才能将额外的 URI 添加到SRC_URI. 我首先尝试了内联 Python 变量扩展,但 BitBake 解析器在将本机配方放入“本机目录”之前已经扩展了变量。因此,我尝试更改SRC_URI获取任务期间的操作,并“加载”我的本机配方,如下所示:
python () {
d.appendVarFlag('do_parse', 'depends', 'my-recipe-native:do_populate_sysroot')
}
Run Code Online (Sandbox Code Playgroud)
在 中do_fetch_prepend,我使用这个本机配方,它为我提供了正确的 URL,我想将其附加到SRC_URI. 这样,取货、拆包、清洁等工作就可以进行。看起来提取工作正常,但解压不起作用,因为SRC_URI没有更新。
小智 8
对于给定的任务,变量更改只是局部的。这意味着do_unpack不会“看到”任务所做的更改do_fetch。
这是必要的,以便允许某些任务在其他任务被 sstate 覆盖时重新运行,以确保事情是确定性的。
如果您确实想做您所描述的事情,那么您需要类似 a 的东西prefunc来完成需要修改的任务SRC_URI。
python myprefunc() {
d.appendVar("SRC_URI", "https://www.bla.com/resource.tar")
}
do_fetch[prefuncs] += "myprefunc"
do_unpack[prefuncs] += "myprefunc"
Run Code Online (Sandbox Code Playgroud)
但请注意,虽然这会执行您想要的一些操作,但源存档、许可证清单和状态校验和可能无法正常工作,因为您从 bitbake 中“隐藏”源数据,并且该数据仅在任务执行时出现,而不是在解析时出现。