By: fulinux
E-mail: [email protected]
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!
我应该一开始创建一个functions的recipe来专门讲这一系列的内容就好了。我从本篇开始也不迟。
poky]$ cd meta-mylayer/
meta-mylayer]$ cp recipes-example/ recipes-myfunctions -rf #赋值一份,改个名字
meta-mylayer]$ cd recipes-myfunctions/
recipes-myfunctions]$ mv example/ myfunctions
recipes-myfunctions]$ mv myfunctions/example_0.1.bb myfunctions/myfunctions_0.1.bb
#最终创建
meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb
#并将文件中的PN = 'example'改成:
PN = 'myfunctions'
后面我就基于这个文件修改。
今天讲类函数的灵活继承
这节讲的是创建一个自己的class文件,class文件中定义一个do_faa函数,然后在myfunctions的bb文件中继承该class类,如何在myfunctions中重定义do_faa函数,又能调用class中定义的do_faa函数。怎么做呢?通过使用EXPORT_FUNCTIONS
语句。
首先我们参考meta/classes/
目录中class文件形式,在meta-mylayer/
目录中也定义一个自己的class文件,名字叫bar.bbclass
,参考如下:
poky]$ mkdir meta-mylayer/classes
poky]$ vim meta-mylayer/classes/bar.bbclass
好,下面在bar.bbclass文件中定义一个do_faa函数,bar.bbclass文件内容如下:
bar_do_faa() {
bbplain "I am do_faa function in bar.bbclass"
}
addtask faa after do_fetch before do_build
EXPORT_FUNCTIONS do_faa
等等,你不是说,定义do_faa函数吗?怎么变成了bar_do_faa函数?
诶,这就是class中定义函数的规则了,函数名定义的语句格式如下:
classname_functionname
EXPORT_FUNCTIONS functionname
我们的函数名是do_faa,那么组合起来就是:
bar_do_faa() {
...
}
EXPORT_FUNCTIONS do_faa
然后addtask语句呢?又要去掉classname_或者classname_do, 这里去掉的就是bar_do, 然后EXPORT_FUNCTIONS语句声明时也要去掉class文件名bar_。
前面的yocto-第42篇-bb文件中的几个关键词require DEPENDS inherit文章中我们讲到recipe文件中引用class文件中的内容需要用inherit,因此我们在myfunctions_0.1.bb文件中继承该类:
poky]$ vim meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb
PN = 'myfunctions'
inherit bar
...
我们继承了,然后呢,安装addtask语句的规则,是在do_fetch后在do_build前执行do_faa函数,那么理论上我们不做其他调用就能执行,编译:
poky]$ source oe-init-build-env
build]$ bitbake myfunctions
I am do_faa function in bar.bbclass
好,如果我们在recipe文件,即myfunctions_0.1.bb文件中定义了同名函数,那么会发生什么呢?上菜:
poky]$ vim meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb
...
do_faa() {
bbplain "I am do_faa function in myfunctions recipe"
}
重编译:
build]$ bitbake myfunctions -c cleansstate
build]$ bitbake myfunctions
...
WARNING: python should use 4 spaces indentation, but found tabs in myfunctions_0.1.bb, line 61
I am do_faa function in myfunctions recipe
...
说明我们覆盖了bar.bbclass中定义的do_faa函数,那么在重名的情况下,我们该如何调用class中的do_faa函数呢?
简单,在recipe文件中的do_faa函数中调用bar_do_faa函数,如下:
do_faa() {
bbplain "I am do_faa function in myfunctions recipe"
bar_do_faa #加了这一行
}
执行效果如下:
build]$ bitbake myfunctions -c cleansstate
build]$ bitbake myfunctions
...
WARNING: python should use 4 spaces indentation, but found tabs in myfunctions_0.1.bb, line 61
I am do_faa function in myfunctions recipe
I am do_faa function in bar.bbclass
...
FAACONDITION = "" #条件不存在
do_faa() {
if [ -e FAACONDITION ] ; then
bbplain "I am do_faa function in myfunctions recipe"
else
bar_do_faa
fi
}
加个餐哦!
很多盆友看到图片中黄色警告很烦,警告我们python函数的缩进应该是4个空格,但是实际是个tab键,怎么改呢?
build]$ vim ../meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb
输入
:set list
可以看到缩进的地方是“^I”,表示tab键,
这个时候我们可以将缩进改成4个空格,如下:
vim ~/.vimrc
#如果没有`~/.vimrc`,可以修改
vim /etc/vim/vimrc
#去掉:
set noexpandtab
#改成:
set expandtab
#加上:
set shiftwidth=4
set tabstop=4
set softtabstop=4
再编辑myfunctions_0.1.bb文件:
build]$ vim ../meta-mylayer/recipes-myfunctions/myfunctions/myfunctions_0.1.bb
#在命令行模式下输入gg=G 就可以自动调整了
#不过呢,有些语句后面没有“;”,会出现缩进异常,此时可以手动调整,或者在一些语句后面加上";"
#再set list就看不到“^I”了