Yocto开发指导¶
如何定制添加layer¶
即使你只有一两个配方文件,还是建议你创建自己的层,而不是把配方添加到OE-Core或者Yocto项目层,随着你的配方越来越多,这种好处更能体现出来,且容易迁移到你的其它项目中去。你可以修改配置文件,使你的层添加到项目中。还可以用yocto-layer脚本来创建层。
通常一个layer的结构包含3个文件夹:conf、classes、recipes-xxx。开发人员可以自行创建 recipes-* 文件夹,存放其他软件包的 bb 文件。recipes-xxx 目录仅用于区分不同类型的软件包/特性,实际可以作为一个 recipes 目录存放的。classes 目录和poky原生的目录类似,主要存放自研的``bbclass``。 conf 目录是必须存在的,用于配置此layer的信息。
classes: 类文件(.bbclass)中提供了一些可以和其他配方(和类文件在同一层中)共享的功能,多个配方可以从同一个类文件继承一些配置和功能。
conf: 这个区域包含了针对这个层和发行相关的配置信息(比如说conf/layer.conf)。local.conf和bblayers.conf的定制模板也可以放在此目录,构建时通过TEMPLATECONF变量指定。
recipes-xx: 包含了一些会影响全局的配方文件和配方追加文件。其中一些配方和追加文件被用来增加初始化脚本,特定发行版的配置和自定义的配方等文件。recipes-xx目录的例子就是recipes-core和recipes-kernel。不同recipes-*目录下的内容和结构也会有所不同。通常来说,这些目录下含了配方文件(*.bb)和配方追加文件 (*.bbappend),还有一些针对发行版的配置文件和其他文件。
添加新层可以通过以下步骤完成:
创建新层目录
meta-xxx创建新层配置文件
conf/layer.conf。告诉 Bitbake 关于新层
bblayers.conf根据层类型,添加内容。如果层添加了对机器的支持,则在层内的
conf/machine/文件中添加机器配置。如果层添加了发行版策略,则在层内的conf/distro/文件中添加发行版配置。如果层引入了新的配方,则将需要的配方放在该层内的recipes-*子目录中。
以下是一个层的主要目录结构:
./
├── build/ 编译目录
│ ├── bitbake.lock
│ └── conf/
│ ├── local.conf
│ └── bblayers.conf
├── meta-openeuler/ 新层
│ ├── classes/ 如果需要提供公共类,则添加
│ ├── recipe-core/
│ ├── glibc/
│ ├── files/
│ ├── glibc_2.31.bb
│ └── glibc.inc
│ └── conf/
│ ├── machine/ **按需添加** ,新硬件平台则需要
│ ├── qemu_arm.conf
│ └── qemu_aarch64.conf
│ ├── distro/ **按需添加** ,新的发行版
│ └── openeuler.conf
│ ├── local.conf.sample
│ ├── layer.conf
│ └── bblayers.conf.sample
└── meta/ 原始yocto社区poky下
├── classes/
│ └── base.bbclass
└── conf/
├── bitbake.conf
└── layer.conf
通过``TEMPLATECONF``变量指向新层的``conf``目录,yocto会自动将``.sample``赋值到``build``目录 当前也可以通过yocto提供的工具添加新的基础layer:
bitbake-layers create-layer ../layers/meta-hello创建层bitbake-layers add-layer meta-hello将层添加到``conf/bblayers.conf``
添加image¶
1)通过自定义bb文件添加image¶
添加bb文件如下:
IMAGE_INSTALL = "packagegroup-core-x11-base package1 package2"
inherit core-image
也可参考yocto提供的已有的image做定制修改
其中``IMAGE_INSTALL``中配置的名称必须使用 OpenEmbedded 表示法而不是 Debian 表示法作为名称(例如 glibc-dev 而不是 libc6-dev)
Yocto提供了一些默认的images的配方,可参考 https://docs.yoctoproject.org/ref-manual/images.html
2)通过自定义包组添加image¶
对于复杂的自定义image,自定义image的最佳方法是创建用于构建一个或多个image的自定义包组配方。包组配方的一个很好的例子是meta/recipes-core/packagegroups/packagegroup-base.bb。通过``PACKAGES`` 变量列出要生成的包组包。inherit packagegroup语句设置适当的默认值,并为PACKAGES语句中指定的每个包自动添加-dev、-dbg和-ptest补充包。inherit packagegroup语句应该位于配方顶部附近,当然在PACKAGES语句之前。对于PACKAGES中指定的每个包,可以使用RDEPENDS和RRECOMMENDS来提供父任务包应包含的包列表。您可以在packagegroup-base.bb配方中进一步查看这些示例。以下一个简短的虚构示例:
DESCRIPTION = "My Custom Package Groups"
inherit packagegroup
PACKAGES = "\
${PN}-apps \
${PN}-tools \
"
RDEPENDS:${PN}-apps = "\
dropbear \
portmap \
psplash"
RDEPENDS:${PN}-tools = "\
oprofile \
oprofileui-server \
lttng-tools"
RRECOMMENDS:${PN}-tools = "\
kernel-module-oprofile"
在前面的示例中,创建了两个包组包,并列出了它们的依赖项和推荐的包依赖项:packagegroup-custom-apps 和 packagegroup-custom-tools。要使用这些包组包构建映像,您需要将 packagegroup-custom-apps、 packagegroup-custom-tools 添加到 IMAGE_INSTALL。
添加一个新的配方bb¶
使用recipetool自动添加bb文件¶
使用devtool自动添加bb文件¶
从零添加bb¶
添加bbclass¶
添加新架构¶
支持多config¶
使用外部工具链¶
recipes版本选择¶
SRC_URI中文件和目录查找¶
配方打包时如何分包¶
配方中添加日志打印¶
对指定架构或任务等进行定制配置(选项、补丁等)¶
编译选项配置¶
依赖关系配置(包、任务)¶
配方中的虚拟provides¶
@bb.utils有哪些实用方法?¶
在配方中, @bb.utils.contains 等方法常被使用到,我们在此罗列了当前 oebuild bitbake 版本(2.0) 中的 utils 方法集,供快速查阅。
Function Signature |
描述 |
Usage Example |
补充说明 |
|---|---|---|---|
|
检查变量是否包含所有checkvalues |
|
|
|
检查变量是否包含任意checkvalues |
|
|
|
返回变量中与checkvalues相同的词 |
|
|
|
将字符串转换为布尔值 |
|
|
|
在冒号分隔的路径内查找item |
|
推荐用于查找系统可执行文件 |
|
创建目录,类似mkdir -p,不报错 |
|
|
|
复制文件,保留属性 |
|
|
|
移动文件,保留属性 |
|
支持跨文件系统移动 |
|
删除文件或目录(类似rm -f/-rf) |
|
递归删除时需谨慎 |
|
返回文件的MD5校验和十六进制字符串 |
|
推荐用于文件校验 |
|
返回文件的SHA256校验和十六进制字符串 |
|
|
|
返回CPU数量 |
|
|
|
清理多余的环境变量 |
|
推荐在BitBake启动时调用 |
|
用数据仓库中导出的变量设置os.environ |
|
|
|
保证系统区域设置为UTF-8 |
|
初始化环境前建议调用 |
|
返回需要保留的环境变量列表 |
|
|
|
在上下文中评估Python表达式 |
|
|
|
执行代码,错误时打印出错的代码行 |
|
推荐用于BitBake动态代码执行 |
|
在给定上下文中执行Python代码 |
|
快速执行简单代码 |
|
用比较运算符比较两个版本字符串 |
|
支持多种运算符 |
|
比较两个版本字符串 |
|
|
|
将版本字符串拆分为元组以进行比较 |
|
版本比较相关 |
|
将版本字符串拆分为(PE, PV, PR) |
|
适合处理复杂版本字符串 |
|
解析RDEPENDS风格依赖字符串,返回依赖列表 |
|
只返回依赖名称,不含版本 |
|
解析依赖关系并返回依赖:版本的有序字典 |
|
推荐用于依赖分析 |
|
解析依赖关系,返回依赖:版本的字典 |
|
|
|
将依赖字典拼接成字符串 |
|
|
|
获取锁文件,返回锁对象 |
|
推荐用于多进程/多线程场景 |
|
解锁通过lockfile()获得的锁文件 |
|
|
|
文件锁的上下文管理器 |
|
适合批量文件锁定 |
|
设置文件描述符为非阻塞模式 |
|
|
|
设置进程名,方便调试 |
|
|
|
设置并恢复umask的上下文管理器 |
|
|
|
返回表达式中引用的变量名 |
|
|
|
递归删除目录内容 |
|
操作危险,务必确认路径 |
|
如果变量结尾有后缀则移除 |
|
|
|
确保src不是与其他文件共享的硬链接 |
|
|
|
os.rename的封装,处理跨设备问题 |
|
|
|
生成与时间无关的唯一临时文件名 |
|
推荐用于高并发临时文件操作 |
|
检查版本字符串是否符合语义化版本规范 |
|
|
|
更新os.environ指定变量的上下文管理器 |
|
推荐用于临时环境变量设置 |
|
检查UID是否为本地用户 |
|
|
|
编译Python代码,错误时打印出错的代码行 |
|
推荐用于BitBake自定义代码 |
|
按名称执行普通Python函数 |
|
|
|
返回当前用于exec/eval的Python上下文 |
|
|
|
设置全局Python上下文 |
|
|
|
返回用于exec/eval操作的干净Python上下文 |
|
推荐在安全执行Python代码时使用 |
|
比较两个版本部分 |
|
通常内部使用 |
|
比较两个拆分后的版本元组 |
|
|
|
处理Python分析日志并写入统计信息 |
|
|
|
返回带bug修复的multiprocessing.Pool对象 |
|
兼容旧版Python |
|
返回文件的SHA1校验和十六进制字符串 |
|
|
|
返回文件的SHA384校验和十六进制字符串 |
|
|
|
返回文件的SHA512校验和十六进制字符串 |
|
|
|
返回需要导出到环境的变量列表 |
|
|
|
移除不在good_vars中的环境变量 |
|
用于BitBake环境清理 |
|
返回允许保留的环境变量列表 |
|
|
|
移除所有环境变量 |
|
|
|
设置父进程死亡时发送的信号 |
|
|
|
用syscall设置Linux IO优先级 |
|
通常用于性能调优 |
|
禁用当前进程的网络(如支持) |
|
隔离构建环境 |
|
从数据仓库导出代理变量到环境 |
|
|
|
从目录加载插件模块 |
|
推荐用于BitBake插件开发 |
|
用回调编辑元数据行 |
|
|
|
用回调编辑元数据文件 |
|
|
|
编辑bblayers.conf以添加/移除层 |
|
推荐用于添加/移除Yocto层 |
|
返回层集合及其正则表达式 |
|
|
|
返回包含指定文件的层 |
|