如何在Yocto自定义层中覆写其他层的PREFERRED_PROVIDER_virtual/docker变量?
核心原因
Yocto里PREFERRED_PROVIDER的生效逻辑和配方的PROVIDES、DEFAULT_PREFERENCE以及层优先级(BBFILE_PRIORITY)直接相关。即便你成功覆写了变量,若docker-moby配方因层优先级低于Layer A,或者被DEFAULT_PREFERENCE = "-1"标记为默认不启用,依然会被系统跳过。
具体解决步骤
1. 提升自定义层的优先级
在自定义层的conf/layer.conf文件中,设置比Layer A更高的优先级数值:
BBFILE_PRIORITY_customlayer = "10" # 确保该数值大于Layer A的BBFILE_PRIORITY,比如Layer A是5则设10
2. 基于自定义层的distro配置覆写变量
放弃用local.conf覆写,转而在自定义层的conf/distro目录下新建自定义distro配置文件(比如my-custom-distro.conf),内容如下:
require conf/distro/layer-A-distro.conf # 先继承Layer A的distro基础配置 PREFERRED_PROVIDER_virtual/docker = "docker-moby"
之后在构建时通过DISTRO=my-custom-distro指定该配置,或者在bblayers.conf中关联。
3. 修正docker-moby配方的默认优先级
如果docker-moby的配方文件里存在DEFAULT_PREFERENCE = "-1",会导致它默认不被选中。可以在自定义层中创建.bbappend文件修改:
在自定义层的recipes-containers/docker-moby/路径下,新建docker-moby_%.bbappend文件,内容为:
DEFAULT_PREFERENCE = "1"
4. 验证配置状态
执行以下命令确认变量和配方状态是否正确:
bitbake -e | grep -E 'PREFERRED_PROVIDER_virtual/docker|DEFAULT_PREFERENCE.*docker-moby'
若输出显示PREFERRED_PROVIDER_virtual/docker="docker-moby",且docker-moby的DEFAULT_PREFERENCE为正数,再执行bitbake docker-moby。
5. 清理构建缓存
旧缓存可能导致配置不生效,执行清理命令:
bitbake -c cleansstate docker-moby bitbake docker-moby
内容的提问来源于stack exchange,提问作者jugge.persson

