yocto菜谱的语法
1、bitbake菜谱的语法
7.3.23 章节
https://www.yoctoproject.org/docs/3.0.2/mega-manual/mega-manual.html
43.1章节 basic syntax
https://www.yoctoproject.org/docs/3.0.2/mega-manual/mega-manual.html#bitbake-user-manual-metadata
几个重要的语法
2、变量分配和操作
在菜谱中使用变量的例子
S = "${WORKDIR}/postfix-${PV}" CFLAGS += "-DNO_ASM" SRC_URI_append = " file://fixup.patch"
3、function
function提供了一系列要执行的动作。通常,您可以使用函数来覆盖任务功能的默认实现或补充默认功能,标准函数使用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}/ }
4、Keywords关键字
bitbake只使用有限的几个关键字:
inherit:继承关键字,例如继承某个菜谱类功能
include:包含另外的文件的关键字
require:强制包含另外文件的关键字,如果另外文件不存在bitbake会抛出错误
export:导出环境变量
下面是使用关键字的一个例子
export POSTCONF = "${STAGING_BINDIR}/postconf" inherit autoconf require otherfile.inc
5、注释符(#):
用#开头的都是注释
6、续行符(\):
一行可以拆成多行,在行尾加 \
VAR = "A really long \ line"
8、使用变量内容(${VARNAME
}):
通过${VARNAME
} 语法来访问变量VARNAME的内容
SRC_URI = "${SOURCEFORGE_MIRROR}/libpng/zlib-${PV}.tar.gz"
9、引用变量的值
VAR1 = "${OTHERVAR}" VAR2 = "The version is ${PV}"
10、默认赋值 ?=
?= 是一个条件赋值,只有变量没有赋值时 ?= 后的值才生效,否则保持原来的值
例1:var1 之前为空
VAR1 ?= “new value”
执行后 var1 值为 new value
例2:var1 之前 foo
VAR1 = “foo” VAR1 ?= “new value”
执行后 var1值为foo
11、弱默认赋值(??=)
当使用弱或者惰性默认赋值操作符??=时, 赋值直到解析过程才结束发生, 以至于针对变量的最后而不是第一个??=赋值会被使用:
A ??= "value1" B ??= "value2" B ??= "value3" C ?= "value4" C ??= "value5" D = "value6" D ??= "value7"
在这个例子中, 如果A以前没有被设置过, 那么A包含value1。 如果B以前没有被设置过, 那么B包含value3, 因为赋值直到解析过程结束才
发生。 C包含value4, D包含value6, 因为?=和=操作符覆盖??=操作符。
12、追加操作符(+=)
使用加号后跟等号(+=)
将值追加到现有变量中,此运算符在变量的现有内容和新内容之间添加一个空格
例如:将文件追加到 SRC_URI变量中
SRC_URI = “a.tar b.tar”
SRC_URI += "file://fix-makefile.patch"
执行后结果
SRC_URI = "a.tar b.tar file://fix-makefile.patch"
13、前增加操作符(=+)
使用等号后跟加号(=+)
将值添加到变量之前,此运算符在也会在添加的变量后添加一个空格
SRC_URI = “a.tar b.tar”
VAR =+ "Starts"
执行后结果
SRC_URI = "starts a.tar b.tar "
14、直接变量扩展(:=)
变量扩展直到变量实际被使用到时才发生。 简单地赋值包含变量扩展的表达式不会扩展引用的变量。 然而, 赋值操作符:=引起了赋值上的直接扩展
变量VAR4包含“The quick brown fox falls on the lazy dog.”因为在VAR2赋值中包含的VAR1直到VAR2的内容在使用:=操作符赋值VAR4而被引用时才被扩展。
然而, 截至那时, VAR1的值已经被设置成了falls on
15、不带空格的追加(.=) 和前新增(=.)
VAR1 = “12” VAR1 .= “34” VAR2 = “89” VAR2 =. “67” VAR3 = “5” VAR3 .= “$(VAR1)” VAR3 =. “$(VAR2)”
这个例子的结果是, 变量VAR1包含1234, 变量VAR2包含6789,变量VAR3包含123456789。
16、追加操作符(_append)
使用_append操作符将一个值追加到已经存在的变量上
13.1、该操作符不会追加空格
手动在开头添加一个空格,确保不会覆盖SRC_URI变量
SRC_URI_append = “ file://fix-makefile.patch”
13.2、在所有 +=,
=+
运算符都已执行完毕,并且所有 =
分配都发生之后,才会执行该附加操作
_append
运算符可以和覆盖操作一起使用,这只会覆盖指定的目标或变量
例子:在所有的 += =+ = 操作执行完毕后,替换sh4原来定义的补丁文件
SRC_URI_append_sh4 = “ file://fix-makefile.patch”
17、前增加操作符(_prepend)
使用_prepend操作符将一个值前增加到已经存在的变量上
14.1、该操作符不会追加空格
手动在增加的变量末尾添加一个空格,确保不会覆盖CFLAGS变量
CFLAGS_prepend = "-I${S}/myincludes "
14.2、在所有 +=,
=+
运算符都已执行完毕,并且所有 =
分配都发生之后,才会执行该附加操作
_prepend
运算符可以和覆盖操作一起使用,这只会覆盖指定的目标或变量
例子:在所有的 += =+ = 操作执行完毕后,替换sh4原来定义包含的头文件目录
CFLAGS_prepend_sh4 = "-I${S}/myincludes "
18、缩进方式
要求使用空格,不能使用TAB键