是否期望 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
文档和许多其他示例,我希望变量 A
和 B
在解析结束时保持以下值:
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'"
换句话说,我期望立即赋值运算符会强制一个尚未定义的变量(例如 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]
让我们在 .bb
文件中考虑以下示例:
X = "1"
A := "X is '${X}' and Y is '${Y}'"
B = "X is '${X}' and Y is '${Y}'"
X = "2"
Y = "3"
根据在线提供的 bitbake
文档和许多其他示例,我希望变量 A
和 B
在解析结束时保持以下值:
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'"
换句话说,我期望立即赋值运算符会强制一个尚未定义的变量(例如 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]