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

    xiaoxiao2023-11-30  203

    了解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的实现。

    最新回复(0)