yocto-第46篇-如何添加自己的函数作为recipe的任务

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

开篇我先提一嘴,即便一看就明白的知识,不自己实践下,都不是你的知识,只是过客。

怎么将自己的函数升级为任务

addtask只能在recipe或者classes中使用,可以将 yocto-第43篇-bb文件中函数实操演示(1) 文章中说的shell和bitbake风格的函数上升为任务。

什么是任务

举几个例子:下载获取代码的do_fetch函数,编译代码的do_compile函数。我们前篇文章中定义的do_faa函数,通过addtask语句就可以将其升级为函数。

如何指定任务的执行顺序

还可以根据after或before等关键词来规定执行顺序。

see: meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb
python do_printdate() {
    DATE = "${@time.strftime('%Y%m%d', time.gmtime())}";
    bb.plain(d.getVar("DATE"));
}

addtask printdate after do_fetch before do_build
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这个addtask语句规定了do_printdata函数在build函数前,在fetch函数之后运行。
do_fetch和do_build属于每个recipe的默认任务,通常都会执行。
因为每个recipe的默认任务都是会执行的,那么有了这个执行依赖关系,do_printdate函数就一定会执行。

你就不用担心自己的函数在哪里被调用了。

你可以看到我们定义的函数都有 do_ 在前面,addtask又没有,通常在recipe解析阶段会隐式的添加 do_ 在printdate,使每个函数前都有 do_

下图是执行顺序:

do_fetch
do_printdata
do_build
do_*
do_*

方框内nostamp等关键词

前面有过实践的朋友应该发现了一个问题,就是函数内的打印信息,只能在第一次执行bitbake的时候有显示,而再次执行是没有的。为什么呢?
这是因为bitbake的一个机制,在用bitbake执行某个recipe的任务时,通常都会将该任务执行的状态保存起来,如果执行成功的任务,是不会再次执行了,除非任务或者源码等有改动。这就是为什么我们前面执行bitbake之前会执行:

build]$ bitbake myfunctions -c cleansstate
#或者
build]$ bitbake myfunctions -c cleanall
  • 1
  • 2
  • 3

的原因。就是希望情况这些记录。
通常这个清理的过程还挺长的,有些函数或认为,我们希望每次都执行,那么有没有更好的方法来解决这个问题呢?答案是有。
多看一些bb文件,会发现类似这样的语句:

#see: meta/classes/kernel.bbclass 
do_savedefconfig[nostamp] = "1"
#see: meta/classes/kernel-yocto.bbclass
do_kernel_metadata[depends] = "kern-tools-native:do_populate_sysroot"
  • 1
  • 2
  • 3
  • 4

也就是对应的函数或者任务后面会加上一个方括号,里面有cleandirs、depends、dirs、deptask、lockfiles或者noexec。这些我们先不细细讲解。只用讲我们今天用到的nostamp。

nostamp的作用是:当设置为“1”时,告诉BitBake不要为任务生成时间戳文件,这意味着任务应该始终执行。

那这里我们实践看看效果:
首先修改meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb文件

python do_printdate() {
    DATE = "${@time.strftime('%Y%m%d', time.gmtime())}";
    bb.plain(d.getVar("DATE"));
}

do_printdate[nostamp] = "1"   #加了这一行,注释不要加哦

addtask printdate after do_fetch before do_build
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后不执行clean任务的情况下执行看看,成功的话我们会看到日期,其他打印,不出意外的话,我们永远不会再见了。

build]$ bitbake myfunctions
...
NOTE: Executing Tasks
20210224
NOTE: Tasks Summary: Attempted 593 tasks of which 591 didn't need to be rerun and all succeeded.
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
其他的一些关键词还有:
[noexec] 当设置为"1"时不执行某函数,比如:

do_compile[noexec] = "1"
  • 1

[number_threads]设置某个任务执行时线程数量限制,比如:

 do_fetch[number_threads] = "2"
 do_compile[number_threads] = "8" 
  • 1
  • 2

还有一些:
[recrdeptask]
[recideptask]
[rdeptask]

deltask语句

deltask语句与addtask语句的功能相反,就是将某个任务从task列表中移除,不执行。这个有啥用的呢?

这里先打个比方,比如你的一个项目不想开源,只希望提供库文件或者执行程序,就不需要do_compile了,这个时候你可以定义一个空的函数,如下:

do_compile() {
}
  • 1
  • 2

或者上面的语句:

do_compile[noexec] = "1"
  • 1

当然也可以使用如下语句:

deltask do_compile
  • 1

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