Yocto Project开发(五):BitBake食谱语法

了解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),从其他文件加载食谱的一部分(includerequire)以及将变量导出到环境(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的实现。

你可能感兴趣的:(Yocto)