Layer是Yocto最重要的一个概念,可以说就是Yocto的基石。
1.概述
最终 BMC 固件镜像由多个 Layer 像搭积木一样拼合而成,每个 Layer 负责提供一部分功能。 以 meta‑ibm meta‑romulus 的bblayers.conf.sample举例:
LCONF_VERSION = "8"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
##OEROOT##/meta \
##OEROOT##/meta-openembedded/meta-oe \
##OEROOT##/meta-openembedded/meta-networking \
##OEROOT##/meta-openembedded/meta-perl \
##OEROOT##/meta-openembedded/meta-python \
##OEROOT##/meta-phosphor \
##OEROOT##/meta-aspeed \
##OEROOT##/meta-openpower \
##OEROOT##/meta-ibm/meta-romulus \
"
加载顺序从上到下,越靠下的 Layer 优先级越高:
1)基础地基层:meta、meta‑openembedded/*,OE 核心、基础工具链、通用软件包;
##OEROOT##/meta \
##OEROOT##/meta-openembedded/meta-oe \
##OEROOT##/meta-openembedded/meta-networking \
##OEROOT##/meta-openembedded/meta-perl \
##OEROOT##/meta-openembedded/meta-python \
2)BMC 通用业务层:meta‑phosphor,BMC 业务逻辑、DBus 服务,不绑定具体 BMC 硬件;
##OEROOT##/meta-phosphor \
3)SoC 硬件层:meta‑aspeed,包含 BMC 芯片驱动、内核、设备树、Machine 单板配置;
##OEROOT##/meta-aspeed \
4)厂商平台定制层:meta‑ibm/meta‑romulus,整机平台业务、产品定制。
##OEROOT##/meta-ibm/meta-romulus \
厂商内部通常会再拆分两层:common 公共层 + platform 平台层,common 在前,具体 platform 层放在 BBLAYERS 末尾获取最高优先级。
关键规则:BBLAYERS的先后顺序直接决定 Layer 优先级,后加载层可以覆盖前加载层的内容;也可以通过BBFILE_PRIORITY变量设置层优先级,该变量优先级高于 BBLAYERS 顺序。
每一个合法 Layer 必须包含 conf/layer.conf,用于注册本层,声明本层 recipes 路径。
其中:
BBFILES += "${LAYERDIR}/meta-common/recipes-*/*/*.bb \
${LAYERDIR}/meta-common/recipes-*/*/*.bbappend"
指定了这个layer用于查找recipe的路径
2.bb 完全重载(替换整个 Recipe)
如果多个 Layer 下存在相同相对路径 + 相同文件名 的.bb配方文件,高优先级 Layer 的 bb 会完全替代低优先级 Layer 的 bb。
例如原有:
meta-phosphor/recipes-phosphor/leds/phosphor-led-manager_git.bb
想要完全替换这个 recipe,可以在自己高优先级 Layer 新建完全同名路径文件名:
meta-ibm/meta-romulus/recipes-phosphor/leds/phosphor-led-manager_git.bb
3.bbappend 增量追加(推荐优先使用)
不想完整替换整个 bb,只想做少量修改、增加补丁、追加配置,优先使用.bbappend文件
meta-aaal/meta-common/recipes-phosphor/leds/phosphor-led-manager_%.bbappend
这样每一个layer都可以对这个recipe进行追加,丰富或定制化自己的功能。
%通配符匹配任意版本号,OpenBMC 工程普遍使用- bbappend 不会替换原始 bb;
- 所有 Layer 的 bbappend,会按照 Layer 加载顺序依次追加到原始 recipe;
- 高优先级层 append 可以覆盖前面 append 设置的变量;
- 可以使用
VAR:append/VAR:remove语法新增、删除变量内容,例如新增补丁,移除上层补丁。
4.BBMASK 屏蔽 recipes
BBMASK 用来屏蔽指定路径下的所有 bb、bbappend,bitbake 不会解析这些配方。 一般写在本层的conf/layer.conf中:
BBMASK:append = "|meta-aspeed-sdk/recipes-phosphor/leds"
|作为多个屏蔽路径分隔符;- 写在 layer.conf 的 BBMASK,只对本层以及本层之后加载的 Layer 生效;写在 bblayers.conf 为全局屏蔽。
- 可以屏蔽原始 bb,也可以屏蔽其他层的 bbappend,解决上层 append 带来不需要的修改。
5.查看layer
5.1如果想查看所有layer的优先级可以通过:
$ bitbake-layers show-layers
5.2查看最终使用的是哪个bb文件
$ bitbake -e phosphor-led-manager | grep "^FILE="
FILE="/meta-phosphor/recipes-phosphor/leds/phosphor-led-manager_git.bb"
5.3查看某个recipe实际所有生效bbappend
$ bitbake-layers show-appends phosphor-led-manager
phosphor-led-manager_git.bb:
meta-aaa/meta-common/recipes-phosphor/leds/phosphor-led-manager_%.bbappend
meta-aaa/meta-bbb/recipes-phosphor/leds/phosphor-led-manager_%.bbappend