我如何从我的自定义层修改另一个Yocto层的.conf文件中的变量?



使用Yocto,我基于另一层(我们称其为层a)中的图像进行自定义图像烘焙。为了拉入我需要的包,我必须更改层a中的.conf文件变量。配置文件位于meta-layer-A/conf/distro.conf目录下我要修改的变量是

PREFERRED_PROVIDER_virtual/docker,

,设置为"docker-ce"我需要把它改成"docker-moby";这样我就可以构建docker-moby配方了。

我更喜欢只在我的自定义图层中进行更改,而不是在任何其他图层中进行更改,包括图层A。怎么才能做到呢?

当我手动更改

PREFERRED_PROVIDER_virtual/docker = "docker-ce"

PREFERRED_PROVIDER_virtual/docker = "docker-moby"

在原层我可以构建docker-moby

我已经尝试通过在构建文件夹中的local.conf中设置它来覆盖变量。(如这里所述如何在Yocto中覆盖.conf文件)

PREFERRED_PROVIDER_virtual/docker = "docker-moby"

不覆盖它。

当我尝试'bitbake docker-moby',甚至'bitbake -e docker-moby'时,我只是得到

Loading cache: 100% |#######################################################################################################################################| Time: 0:00:00Loaded 3848 entries from dependency cache.
ERROR: Nothing PROVIDES 'docker-moby'
docker-moby was skipped: PREFERRED_PROVIDER_virtual/docker set to docker-ce, not docker-moby
docker-moby was skipped: PREFERRED_PROVIDER_virtual/docker set to docker-ce, not docker-moby

即使我在disto .conf文件中注释掉设置变量也是如此。

我从'bitbake-layers show-recipes | grep docker-moby'得到这个

docker-moby:
meta-layer-A unknown (skipped: PREFERRED_PROVIDER_virtual/docker set to docker-ce, not docker-moby)
meta-virtualization  unknown (skipped: PREFERRED_PROVIDER_virtual/docker set to docker-ce, not docker-moby)

编辑:我设法得到conf文件的评估顺序。看起来local.conf不是最后一个要评估的配置文件:

# $PREFERRED_PROVIDER_virtual/docker [4 operations]
#   set? /home/jugge/projects/tc_yocto_temp/build/conf/../../layers/meta-virtualization/conf/layer.conf:37
#     "docker-ce"
#   _remove /home/jugge/projects/tc_yocto_temp/build/conf/local.conf:47
#     "docker-ce"
#   postdot /home/jugge/projects/tc_yocto_temp/build/conf/local.conf:48
#     "docker-moby"
#   set /home/jugge/projects/tc_yocto_temp/build/conf/../../layers/meta-layer-A/conf/distro/include/original.inc:27
#     "docker-ce"
# pre-expansion value:
#   "docker-ce"

edit2:我注入了一个.conf文件,该文件在original.inc.之后被注入和评估。我可以看到它最终被设置为值"docker-moby",但我仍然得到错误,没有提供docker-moby。

# $PREFERRED_PROVIDER_virtual/docker [3 operations]
#   set? /home/jugge/projects/tc_yocto_temp/build/conf/../../layers/meta-virtualization/conf/layer.conf:37
#     "docker-ce"
#   set /home/jugge/projects/tc_yocto_temp/build/conf/../../layers/meta-layer-A/conf/distro/include/original.inc:28
#     "docker-moby"
#   set /home/jugge/projects/tc_yocto_temp/build/conf/../../layers/meta-custom/conf/custom.conf:4
#     "docker-moby"
# pre-expansion value:
#   "docker-moby"
PREFERRED_PROVIDER_virtual/docker="docker-moby"

我最终使用的解决方案是创建我自己的发行版,并在meta-custom/conf/distro中创建一个相应的配置文件,其中包括PREFERRED_PROVIDER_virtual/docker="docker-moby"行。这样就不会读取原始的元层a配置文件,并且在我的发行版配置文件设置它之前没有设置PREFERRED_PROVIDER_virtual/docker(除了元虚拟化的软设置)。