【问题标题】:How does the variable scope in BitBake worksBitBake 中的变量范围如何工作
【发布时间】:2020-04-04 16:46:15
【问题描述】:

我使用 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 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 解析器在将原生配方放入“原生目录”之前已经扩展了变量。因此,我尝试在 fetch 任务期间更改 SRC_URI,并按如下方式“加载”我的本机配方:

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

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

【问题讨论】:

    标签: variables scope bitbake


    【解决方案1】:

    对于给定的任务,变量更改只是局部的。这意味着 do_unpack 不会“看到” 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"
    

    但是请注意,虽然这可以满足您的某些需求,但源存档、许可证清单和 sstate 校验和可能无法正常工作,因为您从 bitbake 中“隐藏”了源数据,并且该数据仅在任务执行时出现,不解析时间。

    【讨论】:

    • 这是有道理的,并且确实将函数调用添加到每个任务是我想要阻止的事情。在解析开始之前没有办法安装本机配方吗?或者更好的是,有没有办法不修补 Yocto 来添加 fetcher?或者我可以附加一个现有的提取器吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多