BitBake 中的变量范围是如何工作的

How does the variable scope in BitBake works

我使用 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"))
}

我运行 bitbake -v -c 解压我的食谱

SRC_URI_1 按预期打印:"file://something https://www.bla.com/resource.tar" SRC_URI_2 打印为:"file://something" TEST_VAR 打印为:None

我看起来 setting/changing 数据存储 (d) 中的一个变量只在 do_fetch 的范围内完成。这是预期的行为吗,因为我在文档中读到 'd' 是全局变量。

如果这是预期的行为,是否可以更改配方任务中的全局变量?

问题背后的原因是我需要另一个本机食谱才能将额外的 URI 添加到 SRC_URI。我首先尝试了内联 Python 变量扩展,但是 BitBake 解析器在将本机配方放入 'native directory' 之前已经扩展了变量。所以我尝试在获取任务期间更改 SRC_URI 并且我 'load' 我的本地食谱如下:

python () {
  d.appendVarFlag('do_parse', 'depends', 'my-recipe-native:do_populate_sysroot')
}

在 do_fetch_prepend 中,我使用了本机食谱,它为我提供了正确的 URL,我想将其附加到 SRC_URI。因此,提取、拆包、清洁等工作正常进行。看起来我正在获取作品,但解包不是因为 SRC_URI 未更新。

对于给定的任务,变量更改只是局部的。这意味着 do_unpack 不会 'see' do_fetch 任务所做的更改。

这是必要的,以便在 sstate 涵盖其他任务时允许某些任务重新运行,以确保事情是确定性的。

如果你真的想做你描述的事情,你需要一些像 prefunc 这样的东西来处理你需要修改的任务 SRC_URI。

python myprefunc() {
    d.appendVar("SRC_URI", "https://www.bla.com/resource.tar")
}
do_fetch[prefuncs] += "myprefunc"
do_unpack[prefuncs] += "myprefunc"

但是请注意,虽然这会完成您想要的一些操作,但源存档、许可证清单和状态校验和可能无法正常工作,因为您是 "hiding" 来自 bitbake 的源数据,并且此数据仅存在于任务执行时间,不是解析时间。