yocto-第44篇-bb文件中函数实操演示(2)

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!


看了上面一篇的盆友会有困惑,难道我还有去学习下Python语言吗?其实不用,以后遇到上面问题,找一些bb文件,看下别人是怎么用的就可以了,没那么复杂,和c语言或shell语言很接近,无非就是一些细节上注意下。想当初我没有接触Python的时候就开始搞如何调用C库函数,而且是那种多指针参数的函数,很复杂,我也没花什么力气就搞定了~
总之不用怕,找找相近的例子改造改造就可以用了,好的例子比起长篇大论文字描述要好一万倍。

Bitbake风格的 Python 函数与Python函数的比较

以下是BitBake样式的Python函数和用“def”定义的常规Python函数之间的一些重要区别:

  • 只有BitBake风格的Python函数可以是任务(tasks),就是前面看到的addtask关键词开头的
  • 重写和重写样式运算符只能应用于BitBake风格的Python函数,例如: _append或_prepend后缀
  • 只有普通的Python函数可以接受参数和返回值。
  • 诸如[dirs]、[cleandirs]和[lockfiles]等变量标志可以用于bitbaker风格的Python函数,但不能用于常规的Python函数,例如do_foo[noexec] = “1”,具体如何用后面碰到再说
  • BitBake风格的Python函数生成一个单独的 T / r u n . f u n c t i o n − n a m e . p i d 为 运 行 函 数 而 执 行 的 脚 本 , 如 果 它 们 作 为 任 务 执 行 , 将 生 成 日 志 文 件 {T}/run.function-name.pid为运行函数而执行的脚本,如果它们作为任务执行,将生成日志文件 T / r u n . f u n c t i o n n a m e . p i d {T}/log.function-name.pid。pid是进程号。普通Python函数"inline"中执行,并且不会在${T}中生成任何文件
  • 普通的Python函数是用常用的Python语法调用的。BitBake风格的Python函数通常是任务,由BitBake直接调用,但也可以使用bb.build.exec_func()函数调用。举个例子:bb.build.exec_func(“my_bitbake_style_function”, d)

普通的Python函数比起bitbake风格的Python函数更加简单,出现的也比后者晚,

匿名Python函数

有时候有这样的需求:在解析过程中以编程方式设置变量或执行具有逻辑的其他操作,可以定义在解析结束时运行的特殊Python函数,称为匿名Python函数。例如,以下条件基于另一个变量的值设置变量:

python () { #注意这里没有函数名,匿名函数
	if d.getVar('SOMEVAR') == 'value':
		d.setVar('ANOTHERVAR', 'value2')
}
  • 1
  • 2
  • 3
  • 4

但是如果在函数后面加__anonymous关键词可以将普通函数变成匿名函数,比如:

python do_foo_anonymous() {
...
}
  • 1
  • 2
  • 3

匿名函数什么时候执行呢?在bb文件解析结束后执行,无论在bb文件开头还是结尾。多个匿名函数是执行的顺序按照定义的顺序执行,一般的赋值语句在他们前面执行,例如下面的的例子:

meta-mylayer/recipes-example/example/example_0.1.bb

python () {
    d.setVar('FOO', 'foo 2') 
}

FOO = "foo 1"

python () {
    d.appendVar('BAR', ' bar 2') 
}

BAR = "bar 1"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行结果:

build]$ bitbake -e example | grep -e "FOO=" -e "BAR="              
BAR="bar 1 bar 2"
FOO="foo 2"
  • 1
  • 2
  • 3

给我点个赞呗! 在这里插入图片描述