【问题标题】:BitBake -- Variable expansion problem & the most efficient way of reading BitBake source filesBitBake -- 变量扩展问题 & 读取 BitBake 源文件的最有效方法
【发布时间】:2021-12-10 06:19:35
【问题描述】:

在官方的 bitbake 文档中,有一个立即扩展的示例 (here),它实际上指出:

在这个例子中:

T = "123"
A := "test ${T}"
T = "456"
B := "${T} ${C}"
C = "cval"
C := "${C}append"

最后我们得到这些值:

  • A 包含test 123
  • T 包含456
  • B 包含456 cvalappend
  • C 包含cvalappend

但同样的官方文档也指出(source,最后一段):

如果变量扩展语法用于不 存在,字符串保持原样。例如,给定以下 赋值,BAR 扩展为文字字符串 ${FOO},只要 FOO 不存在。

BAR = "${FOO}"

这就是为什么在我看来,第一个引用块中的所有值似乎都是合理的,除了 B 在我看来应该包含 456 ${C}

但官方文档确实给出了简要说明:

这是因为对未定义变量的引用按原样保留 在(立即)扩张期间。

A:我不明白这个解释。谁能帮我理解一下?

这一切只是一个更大问题的一部分......事实上,我什至不知道如何正确读取 BitBake 源文件,其中一些变量/覆盖立即分配,一些变量/覆盖在何时分配变量被使用,有些是在解析整个文件后分配的,即匿名函数。

这是一个很大的困惑......目前我怀疑是否可以正常逐行读取源文件?我是否应该首先搜索所有直接操作(:=+==+.==.)并仅读取这些行,然后重新读取省略匿名函数的 netire 源文件,以及然后重新读取整个源文件,然后只读取匿名函数。最后在我的脑海中合成所有内容?你知道我的大脑内存有限...所以...

B:读取 Bitbake 源文件最有效的方法是什么?

【问题讨论】:

    标签: bitbake


    【解决方案1】:

    立即展开后B的值为456 ${C},即C的值没有设置,所以只是保持未展开。

    在几行之后设置C,而不是456 ${C},它变成456 cvalappend,因为C现在有了一个值。如果您删除了C 的值,它将再次变为456 ${C},但如果您删除${T},它将保持不变,因为T 的值现在被硬编码为B

    “最后” 意味着在所有这些语句之后,您只是在考虑设置 B 之后的值,而不是 C

    解析bitbake源文件最有效的方法是让bitbake自己来做,这就是它的目的!

    【讨论】:

    • 程序如何将B 设置为456 cvalappend?源文件是否被多次重读?
    • 未设置,读取变量时扩展为该值。
    • 但它似乎必须被读取两次......因为第一次读取它的计算结果为456 ${C},因为那时C 尚未设置。这种机制究竟是如何运作的?
    • 不,它不必阅读两次。默认情况下,代码不会立即展开,它只是存储在数据存储中。立即扩展是可能的,但只有在特别请求并且几乎所有扩展都被推迟时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多