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_
。
下图是执行顺序:
方框内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
给我点个赞呗!