yocto 编译与bb的语法

yocto 编译与bb的语法

Image : BootLoader、kernel、rootfs

Machine : 平台相关控制、cpu类型、内存大小、外围驱动

Distro : 软件的特性,版本选择,文件系统参数,客制化软件

Bitbake :编译工具

Recipe : 对应一个bb文件,详细的描述了一个源码的编译过程(获取,补丁,配置,编译,安装,打包,检查等)

Meta : 把具有某种关联醒的recipe集合到一起,形成一个 “类”

编译技巧:

为单个配方文件执行任务相对简单。您指定有问题的文件,BitBake 会解析它并执行指定的任务。如果您不指定任务,BitBake 会执行默认任务,即“构建”。BitBake 这样做时遵循任务间依赖关系。

foo_1.0.bb以下命令在配方文件上运行构建任务,这是默认任务:

bitbake -b foo_1.0.bb

以下命令对foo.bb配方文件运行 clean 任务:
bitbake -b foo.bb -c clean

了解执行环境中使用的配置文件和类文件的一个好方法是运行以下 BitBake 命令:

bitbake -e > mybb.log

如果一个名为的配方a_1.2.bb存在,BitBake 将默认选择 1.2。.conf 但是,如果您在BitBake 解析的文件中定义以下变量,则可以更改该首选项:

PREFERRED_VERSION_a = “1.1”

一种常见的约定是使用配方文件名来定义元数据。例如,在bitbake.conf配方名称和版本中用于设置变量PN和 PV:

PN = “ @ b b . p a r s e . v a r s f r o m f i l e ( d . g e t V a r ( ′ F I L E ′ , F a l s e ) , d ) [ 0 ] o r ′ d e f a u l t p k g n a m e ′ " P V = " {@bb.parse.vars_from_file(d.getVar('FILE', False),d)[0] or 'defaultpkgname'}" PV = " @bb.parse.varsfromfile(d.getVar(FILE,False),d)[0]ordefaultpkgname"PV="{@bb.parse.vars_from_file(d.getVar(‘FILE’, False),d)[1] or ‘1.0’}”
在此示例中,名为“something_1.2.3.bb”的配方会将 PN设置为“something”,将PV设置为“1.2.3”。

bb文件的语法:

“=”运算符不会立即展开右侧的变量引用。相反,扩展被推迟到实际使用分配给的变量。结果取决于引用变量的当前值。以下示例应阐明此行为:

A = “ B b a z " B = " {B} baz" B = " Bbaz"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}”

您可以使用“?=”运算符来实现对变量的“更软”赋值。如果在解析语句时未定义变量,这种类型的赋值允许您定义变量,但如果变量有值,则不理会该值。这是一个例子:

A ?= “aval”
如果A在解析此语句时设置,则变量保留其值。但是,如果A未设置,则变量设置为“aval”。

笔记

这个任务是即时的。因此,如果存在对单个变量的多个“?=”赋值,则其中第一个最终会被使用。

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附加和前置(覆盖样式语法)
您还可以使用覆盖样式语法附加和前置变量的值。使用此语法时,不会插入空格。

这些运算符与“:=”、“.=”、“=.”、“+=”和“=+”运算符的不同之处在于它们的效果是在可变扩展时间应用而不是立即应用。这里有些例子:

B = “bval”
B:append = " additional data"
C = “cval”
C:prepend = "additional data "
D = “dval”
D:append = “additional data”
变量B 变为“bval 附加数据”并C变为“附加数据 cval”。变量D变为“dvaladditional data”。

笔记

使用覆盖语法时必须控制所有间距。

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将是“初始值”,如预期的那样:

FOO:append = " val"
笔记

从来没有必要将“+=”与“:append”一起使用。以下分配序列将“barbaz”附加到 FOO:

FOO:append = “bar”
FOO:append = “baz”
将前面示例中的第二个赋值更改为使用“+=”的唯一效果是在附加值中的“baz”之前添加一个空格(由于“+=”运算符的工作原理)。

覆盖样式操作的另一个优点是您可以将它们与其他覆盖结合起来,如“条件语法(覆盖) ”部分所述。

覆盖样式操作可以对继承的变量起作用,而 += 对继承的变量不起作用

链接:https://docs.yoctoproject.org/bitbake/bitbake-user-manual/bitbake-user-manual-intro.html#introduction

猜你喜欢

转载自blog.csdn.net/weixin_41903639/article/details/125043351
今日推荐