yocto-第45篇-bb文件中函数实操演示(3)继承自己的class

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

看效果:
在这里插入图片描述
如上图所示,打印了do_faa中的语句:

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”了

我的部分截图:
在这里插入图片描述

喏,再次执行就没有这些讨厌的黄色语句了:
在这里插入图片描述
给我点个赞呗!在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sonbai/article/details/114000961