【问题标题】:Is the bitbake immediate assignment behavior expected?是否预期 bitbake 立即分配行为?
【发布时间】:2020-05-14 04:40:26
【问题描述】:

让我们考虑.bb 文件中的以下示例:

X = "1"
A := "X is '${X}' and Y is '${Y}'"
B = "X is '${X}' and Y is '${Y}'"
X = "2"
Y = "3"

根据在线提供的bitbake 文档和许多其他示例,我希望变量AB 在解析结束时保持以下值:

A="X is '1' and Y is ''"
B="X is '2' and Y is '3'"

但是,运行 bitbake -e <recipe name> | grep ^A 和运行 B 会发现变量的实际值如下:

A="X is '1' and Y is '3'"
B="X is '2' and Y is '3'"

换句话说,我期望立即赋值运算符将强制一个尚未定义的变量(例如在解析A 立即赋值时的B)留空。但是,bitbake 似乎选择了变量的最后定义值。这种行为(选择变量的最后定义值)也与弱赋值和默认赋值一致。

我也为GNU Make 尝试了立即赋值的相同概念,似乎make 的行为符合我的预期:

X = 1
A := X is '$(X)' and Y is '$(Y)'
B = X is '$(X)' and Y is '$(Y)'
X = 2
Y = 3

A:
        echo "$(A)"
B:
        echo "$(B)"

当立即赋值包含未定义的变量时,bitbake 的行为方式是否有原因?还是只是一个错误?

我倾向于相信我错过了什么。

$ bitbake --version
BitBake Build Tool Core version 1.42.0

$ make -v
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

【问题讨论】:

  • 我刚刚意识到,有没有可能A在立即赋值后的值是X is '1' and Y is '${Y}',这样因为Y不能被替换,整个${Y}字符串被保留到位?这样,在解析结束时重新评估 A 是有意义的,现在,由于 Y 的最后一个值可用,它终于被替换了!

标签: makefile syntax undefined yocto bitbake


【解决方案1】:

我在 cmets [1] 中发布了我在尝试解释行为时开发的理论。

确实,经过一些测试,似乎(与文档相反)bitbake 并没有替代未定义的变量,但它保留了整个 ${Y} 字符串(根据我们的示例)。这样,在解析的最后,Y 的最后一个值最终被代入。

为了证明这一点,我只需要在直接分配给A 行中将${Y} 替换为${Z},并保持Z 未定义。解析结束,A的值为"For A, X is '1' and Y is '\${Z}'"

谜团解开了。有点反直觉。我想这取决于视角。

[1]Is the bitbake immediate assignment behavior expected?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2016-07-02
    • 2020-12-06
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多