了解BitBake
食谱文件语法对于编写食谱非常重要。以下列表概述了构成BitBake
食谱文件的基本项目。有关更完整的BitBake
语法描述,请参阅BitBake
用户手册的“ 语法和操作符 ”一章。
变量赋值允许将值赋给变量。赋值可以是静态文本,也可以包含其他变量的内容。除了赋值,还支持追加和前增操作符。
以下示例显示了在食谱中使用变量的一些方法:
S = "${WORKDIR}/postfix-${PV}"
CFLAGS += "-DNO_ASM"
SRC_URI_append = " file://fixup.patch"
函数提供一系列要执行的操作。通常使用函数来覆盖任务函数的默认实现或补充默认函数(即追加或前增到现有函数)。标准函数使用sh shell
语法,但也可以访问OpenEmbedded
变量和内部方法。
以下是sed
食谱中的示例函数 :
do_install () {
autotools_do_install
install -d ${D}${base_bindir}
mv ${D}${bindir}/sed ${D}${base_bindir}/sed
rmdir ${D}${bindir}/
}
只要新函数不替换或补充默认功能,也可以实现在现有任务之间调用的新函数。你可以用Python
而不是shell
实现函数。但是在大多数食谱中都没有看到这两种选择。
BitBake
食谱仅使用几个关键字。你可以使用关键字包含常用函数(inherit
),从其他文件加载食谱的一部分(include
和 require
)以及将变量导出到环境(export
)。
以下示例显示了其中一些关键字的用法:
export POSTCONF = "${STAGING_BINDIR}/postconf"
inherit autoconf
require otherfile.inc
#
)以散列字符(#
)开头的任何行都被视为注释行而被忽略:
# This is a comment
\
)使用反斜杠(\
)字符将语句拆分为多行。将斜杠字符放在要在下一行继续的行的末尾:
VAR = "A really long \
line"
注意
斜杠字符后面不能包含任何字符,包括空格或制表符。
${VARNAME}
)使用${VARNAME}
语法访问变量的内容:
SRC_URI = "${SOURCEFORGE_MIRROR}/libpng/zlib-${PV}.tar.gz"
注意
重要的是要理解以这种形式表示的变量的值不会立即扩展替换。这些表达式的扩展会在稍后按需发生
(例如,通常在引用变量的函数执行时)。此行为可确保变量值最适合最终使用它们的上下文。在极
少数情况下,你确实需要立即扩展变量表达式,您可以使用:=运算符而不是=在进行赋值时,但通常
不需要这样做。
"value"
)在所有变量使用双引号(例如"value"
)赋值。以下是一个例子:
VAR1 = "${OTHERVAR}"
VAR2 = "The version is ${PV}"
?=
)条件赋值用于为变量赋值,但仅限于当前未设置变量的情况。使用问号后跟等号(?=
)来进行条件赋值的“软”赋值。通常,“软”赋值在local.conf
文件中用于从外部环境获取的变量。
这是一个示例:如果VAR1
如果当前为空, 则设置为“New value
”。但是,如果VAR1
已经设置,它将保持不变:
VAR1 ?= "New value"
在下一个示例中,VAR1
保留值“Original value
”:
VAR1 = "Original value"
VAR1 ?= "New value"
+=
)使用加号后跟等号(+=
)将值附加到现有变量。
注意
此运算符在变量的现有内容和新内容之间添加空格。
这是一个例子:
SRC_URI += "file://fix-makefile.patch"
=+
)使用等号后跟加号(=+
)将值前增到现有变量。
注意
此运算符在新内容和变量的现有内容之间添加空格。
这是一个例子:
VAR =+ "Starts"
_append
)使用_append
运算符将值附加到现有变量。此运算符不会添加任何额外空格。此外,此运算符在所有的+=
和=+
运算符起效后起效,并且在所有=
号赋值发生之后才起效。
以下示例是显式地在开头添加空格,以确保附加值未与现有值合并:
SRC_URI_append = " file://fix-makefile.patch"
您还可以将_append
操作符与覆盖一起使用,这将导致仅对指定的目标或机器执行操作:
SRC_URI_append_sh4 = " file://fix-makefile.patch"
_prepend
)使用_prepend运算符将值前增到现有变量。此运算符不会添加任何额外空格。此外,此运算符在所有的+=
和=+
运算符起效后起效,并且在所有=
号赋值发生之后才起效。
以下示例是显式地在末尾添加空格,以确保前置值未与现有值合并:
CFLAGS_prepend = "-I${S}/myincludes "
您还可以将_prepend
操作符与覆盖一起使用,这将导致仅对指定的目标或机器执行操作:
CFLAGS_prepend_sh4 = "-I${S}/myincludes "
您可以使用覆盖来有条件地设置值,通常基于食谱的构建方式。例如,要将任何目标机器的KBRANCH
变量值设置 为“standard/base
”,qemuarm
机器除外,它应设置为“standard/arm-versatile-926ejs
”,可以执行以下操作:
KBRANCH = "standard/base"
KBRANCH_qemuarm = "standard/arm-versatile-926ejs"
使用空格进行缩进而不是制表符。对于shell
函数,两者目前都有效。但是,Yocto
项目的策略是在shell
函数中使用制表符。我们需要意识到某些层的所有缩进都使用空格。
Python
用于复杂操作对于更高级的处理,可以在变量赋值期间使用Python
代码(例如,对变量进行搜索和替换)。
使用${@python_code}
语法表示使用Python
代码为变量赋值:
SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/zip${@d.getVar('PV',1).replace('.', '')}.tgz
Shell
函数语法:在描述要执行的操作列表时,编写shell
函数就像编写shell
脚本一样。应确保脚本使用通用脚本,并且不需要任何bash
或其他特定shell
的功能。同样的考虑也适用于你可能希望使用的各种系统实用程序(例如sed, grep,awk
等)。如果有疑问,就应该检查多个实现 - 包括来自BusyBox
的实现。