是否期望 bitbake 立即赋值行为?

Is the bitbake immediate assignment behavior expected?

让我们在 .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 ^AB 相同,表明变量的实际值如下:

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

换句话说,我期望立即赋值运算符会强制一个尚未定义的变量(例如 B 在解析 A 立即赋值时)空着。但是,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.

我在评论 [1] 中发布了我在尝试解释该行为时发展起来的理论。

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

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

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

[1]