3语法和运算符
目录
3.1.10 Appending 和 Prepending(覆盖样式语法)
3.5.4 BitBake 风格的 Python 函数与 Python 函数
BitBake 文件有自己的语法。语法与其他几种语言有相似之处,但也有一些独特的功能。本节介绍可用的语法和运算符并提供示例。
3.1基本语法
本节提供了一些基本的语法示例。
3.1.1基本变量设置
以下示例设置VARIABLE
为“值”。这个赋值会在语句被解析时立即发生。这是一项“艰巨”的任务。
VARIABLE = "value"
正如预期的那样,如果您在作业中包含前导或尾随空格,则这些空格将被保留:
VARIABLE = " value"
VARIABLE = "value "
设置VARIABLE
为“”将其设置为空字符串,而将变量设置为“”将其设置为空格(即这些不是相同的值)。
VARIABLE = ""
VARIABLE = " "
设置变量的值时,您可以使用单引号代替双引号。这样做允许您使用包含双引号字符的值:
VARIABLE = 'I have a " in my value'
注意
与 Bourne shell 不同,单引号在所有其他方面的作用与双引号相同。它们不抑制变量扩展。
3.1.2修改现有变量
有时您需要修改现有变量。以下是您可能会发现要修改现有变量的一些情况:
-
自定义使用该变量的配方。
-
更改
*.bbclass
文件中使用的变量的默认值。 -
更改
*.bbappend
文件中的变量以覆盖原始配方中的变量。 -
更改配置文件中的变量,以便该值覆盖现有配置。
更改变量值有时取决于最初分配值的方式以及更改的预期意图。特别是,当您将一个值附加到具有默认值的变量时,结果值可能不是您所期望的。在这种情况下,您提供的值可能会替换该值而不是附加到默认值。
如果在更改了变量的值后发生了无法解释的事情,您可以使用 BitBake 来检查可疑变量的实际值。您可以对配置和配方级别更改进行这些检查:
-
对于配置更改,请使用以下内容:
$ bitbake -e
配置文件后此命令显示变量值(即
local.conf
,bblayers.conf
,bitbake.conf
等等)已经被解析。注意
在命令的输出中,导出到环境的变量前面带有字符串“export”。
-
要查找特定配方中给定变量的更改,请使用以下命令:
$ bitbake recipename -e | grep VARIABLENAME=\"
此命令检查变量是否确实使其成为特定配方。
3.1.3连线
在函数之外,BitBake 在解析语句之前将任何以反斜杠字符(“”)结尾的行与下一行连接起来。“”字符最常见的用途是将变量赋值拆分到多行,如下例所示:
FOO = "bar \
baz \
qaz"
加入行时,“”字符和它后面的换行符都被删除。因此,没有换行符以FOO
.
考虑这个额外的例子,其中两个分配都将“barbaz”分配给FOO
:
FOO = "barbaz"
FOO = "bar\
baz"
注意
BitBake 不会在变量值中解释像“n”这样的转义序列。要使这些生效,必须将该值传递给解释转义序列的某些实用程序,例如 printf
或。echo -n
3.1.4变量扩展
变量可以使用类似于 Bourne shell 中的变量扩展的语法来引用其他变量的内容。以下分配导致 A 包含“aval”,B 评估为“preavalpost”。
A = "aval"
B = "pre${A}post"
注意
与 Bourne shell 不同,大括号是强制性的:Only${FOO}
和 not $FOO
被识别为FOO
.
“=”运算符不会立即扩展右侧的变量引用。相反,扩展会推迟到实际使用分配给的变量为止。结果取决于引用变量的当前值。以下示例应阐明此行为:
A = "${B} baz"
B = "${C} bar"
C = "foo"
*At this point, ${A} equals "foo bar baz"*
C = "qux"
*At this point, ${A} equals "qux bar baz"*
B = "norf"
*At this point, ${A} equals "norf baz"\*
将此行为与立即变量扩展 (:=)运算符进行对比 。
如果对不存在的变量使用变量扩展语法,则字符串保持原样。例如,给定以下赋值,BAR
只要FOO
不存在,就扩展为文字字符串“${FOO}” 。
BAR = "${FOO}"
3.1.5设置默认值(?=)
您可以使用“?=”运算符为变量实现“更软”的赋值。这种类型的赋值允许您在解析语句时定义未定义的变量,但如果变量有值,则不考虑该值。下面是一个例子:
A ?= "aval"
如果A
在解析此语句时设置了 ,则变量保留其值。但是,如果A
未设置,则将变量设置为“aval”。
注意
这个任务是即时的。因此,如果存在对单个变量的多个“?=”赋值,则最终会使用第一个。
3.1.6设置弱默认值(??=)
通过使用“??=”运算符,可以使用比上一节中“弱”的赋值。此赋值的行为与“?=”相同,只是在解析过程结束时而不是立即进行赋值。因此,当存在多个“??=”赋值时,使用最后一个。此外,任何“=”或“?=”赋值都会覆盖用“??=”设置的值。下面是一个例子:
A ??= "somevalue"
A ??= "someothervalue"
如果A
在解析上述语句之前设置,则变量保留其值。如果A
未设置,则将变量设置为“someothervalue”。
同样,这个赋值是一个“惰性”或“弱”赋值,因为它直到解析过程结束才会发生。
3.1.7立即变量展开(:=)
“:=”运算符导致变量的内容立即展开,而不是在实际使用变量时展开:
T = "123"
A := "test ${T}"
T = "456"
B := "${T} ${C}"
C = "cval"
C := "${C}append"
在此示例中,A
包含“test 123”,即使T的最终值为“456”。变量B最终将包含“456 cvalappend”。这是因为对未定义变量的引用在(立即)扩展期间按原样保留。这与 GNU Make 形成对比,在 GNU Make 中未定义的变量扩展为无。该变量C
包含“cvalappend”,因为它会${C}
立即扩展为“cval”。
3.1.8用空格附加 (+=) 和前置 (=+)
附加和前置值很常见,可以使用“+=”和“=+”运算符来完成。这些运算符在当前值和前置或附加值之间插入一个空格。
这些运算符在解析过程中立即生效。以下是一些示例:
B = "bval"
B += "additionaldata"
C = "cval"
C =+ "test"
变量B包含“bval additionaldata”并C
包含“test cval”。
3.1.9不带空格的附加 (.=) 和前置 (=.)
如果您想在没有插入空格的情况下附加或前置值,请使用“.=”和“=”。运营商。
这些运算符在解析过程中立即生效。以下是一些示例:
B = "bval"
B .= "additionaldata"
C = "cval"
C =. "test"
变量B包含“bvaladditionaldata”并C
包含“testcval”。
3.1.10 Appending 和 Prepending(覆盖样式语法)
您还可以使用覆盖样式语法附加和预先添加变量的值。使用此语法时,不会插入空格。
这些运算符与“:=”、“.=”、“=.”、“+=”和“=+”运算符的不同之处在于它们的效果是在可变扩展时应用而不是立即应用。以下是一些示例:
B = "bval"
B:append = " additional data"
C = "cval"
C:prepend = "additional data "
D = "dval"
D:append = "additional data"
变量B 变成“bval附加数据”,C
变成“附加数据cval”。该变量D
成为“dvaladditional 数据”。
注意
使用覆盖语法时,您必须控制所有间距。
还可以在 shell 函数和 BitBake 风格的 Python 函数中附加和前置。有关示例,请参阅“ Shell 函数”和“ BitBake-Style Python 函数”部分。
3.1.11移除(覆盖样式语法)
您可以使用删除覆盖样式语法从列表中删除值。指定要删除的值会导致从变量中删除所有出现的该值。
当您使用此语法时,BitBake 需要一个或多个字符串。保留周围空间和间距。下面是一个例子:
FOO = "123 456 789 123456 123 456 123 456"
FOO:remove = "123"
FOO:remove = "456"
FOO2 = " abc def ghi abcdef abc def abc def def"
FOO2:remove = "\
def \
abc \
ghi \
"
变量FOO
变为“789 123456”并FOO2
变为“abcdef”。
像“:append”和“:prepend”一样,“:remove”在变量扩展时被应用。
3.1.12覆盖式操作优势
与“+=”和“=+”运算符相比,覆盖样式操作“:append”、“:prepend”和“:remove”的优势在于覆盖样式运算符提供了有保证的操作。例如,考虑一个foo.bbclass
需要将值“val”添加到变量的类FOO
,以及一个使用foo.bbclass
如下的配方:
inherit foo
FOO = "initial"
如果foo.bbclass
使用“+=”运算符,如下所示,则最终值FOO
将是“initial”,这不是我们想要的:
FOO += "val"
另一方面,如果foo.bbclass
使用“:append”运算符,那么最终值FOO
将是“initial val”,正如预期的那样:
FOO:append = " val"
注意
永远不必将“+=”与“:append”一起使用。以下分配序列将“barbaz”附加到 FOO:
FOO:append = "bar"
FOO:append = "baz"
将前面示例中的第二个赋值更改为使用“+=”的唯一效果是在附加值中的“baz”之前添加一个空格(由于“+=”运算符的工作方式)。
覆盖样式操作的另一个优点是您可以将它们与其他覆盖组合,如“条件语法(覆盖) ”部分所述。
3.1.13变量标志语法
变量标志是 BitBake 对变量属性或属性的实现。这是一种将额外信息标记到变量上的方法。您可以在“变量标志”部分中找到有关一般变量标志的更多信息。
您可以为变量标志定义、附加和预置值。前面提到的所有标准语法操作都适用于变量标志,除了覆盖样式语法(即“:prepend”、“:append”和“:remove”)。
以下是一些显示如何设置变量标志的示例:
FOO[a] = "abc"
FOO[b] = "123"
FOO[a] += "456"
该变量FOO
有两个标志: [a]
和[b]
。标志立即分别设置为“abc”和“123”。该[a]
标志为“ABC 456”。
不需要预先定义变量标志。您可以简单地开始使用它们。一个非常常见的应用是将一些简短的文档附加到 BitBake 变量,如下所示:
CACHE[doc] = "The directory holding the cache of the metadata."