Yocto系列讲解[理论篇]45 - bb文件中函数实操演示(3)继承自己的class

本文介绍了在Yocto项目中如何创建自定义的bbclass文件并实现函数继承。通过实例展示了如何在bbclass中定义do_faa函数,然后在myfunctions的bb文件中重定义该函数并调用父类函数。同时,文章还讲解了如何消除Python函数缩进的黄色警告。

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

在这里插入图片描述

返回总目录Yocto开发讲解系列 - 总目录
我应该一开始创建一个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”了

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

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

<think>嗯,用户想了解Yocto中的.bb文件通过inherit可以继承的类以及它们的作用。首先,我需要回忆Yocto项目的基本结构,知道.bb文件是BitBake的配方文件,用来定义如何构建软件包。inherit指令用于继承类,这些类通常位于classes目录下,提供通用的功能或任务。 接下来,我应该列举一些常见的类,比如autotools、cmake,这些类用于处理不同的构建系统。然后是base类,可能提供基础任务如fetch和unpack。还有pkgconfig、distro这些类,分别处理依赖和发行版特定配置。 还要考虑用户可能需要具体例子,比如kernel类用于内核构建,或image类用于镜像生成。同时,注意每个类的作用,比如license处理许可证,insane用于质量检查。可能需要参考引用中的内容,比如共享状态缓存相关的类,如sstate,但用户提供的引用中没有直接提到这些类,可能需要依靠已有知识。 需要确保信息准确,比如确认base是否是默认继承的,或者autotools类是否自动处理autoconf流程。此外,用户可能想知道如何自定义类或查找可用类,这部分需要说明classes目录的位置和如何扩展。 最后,生成相关问题时要围绕继承机制、自定义类、与任务执行的关系,以及常见问题如类冲突如何解决。确保回答结构清晰,分点说明每个类的作用,并附上示例,帮助用户理解。</think>Yocto项目中`.bb`文件通过`inherit`指令继承的类(Class)是BitBake构建系统的核心扩展机制。以下是主要支持的类及其作用详解: --- ### 一、核心功能类 1. **`base`** - 提供基础任务链(如`do_fetch`、`do_unpack`、`do_patch`等)[^3] - 所有配方默认隐式继承,无需显式声明 2. **`autotools`** - 自动化处理`./configure && make`流程 - 自动生成`do_configure`和`do_compile`任务 - 示例: ```bitbake inherit autotools ``` 3. **`cmake`** - 为CMake项目生成构建指令 - 自动处理`cmake`和`ninja`构建流程 --- ### 二、系统集成类 4. **`pkgconfig`** - 自动处理`.pc`文件依赖关系 - 确保`pkg-config`工具正确识别库路径 5. **`distro`** - 加载发行版特定配置(如`DISTRO_FEATURES`) - 示例:OpenEmbedded的`distro.conf` 6. **`image`** - 镜像构建专用类 - 支持`IMAGE_FSTYPES`定义输出格式(如ext4、squashfs) --- ### 三、高级特性类 7. **`kernel`** - Linux内核构建专用 - 处理内核配置、模块化构建等特殊需求 - 示例: ```bitbake inherit kernel KERNEL_IMAGETYPE = "uImage" ``` 8. **`sstate`** - 共享状态缓存支持[^1] - 现任务输出复用加速构建 9. **`license`** - 许可证管理框架 - 生成`LICENSE`清单和合规性检查 --- ### 四、质量检查类 10. **`insane`** - 构建时质量检查 - 检测文件权限、依赖缺失等问题 11. **`qemu`**** - QEMU仿真支持类[^2] - 启用镜像运行时测试 --- ### 五、自定义类 开发者可在`classes/`目录下创建`.bbclass`文件扩展功能。例如: ```bitbake # custom.bbclass addtask custom_task after do_compile do_custom_task() { echo "Performing custom operations" } ``` 在配方中通过`inherit custom`调用。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fulinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值