Search code examples
yocto

How can I modify a variable in a .conf file in another Yocto layer from my custom layer?


Using Yocto I am bitbaking a custom image based on an image in another layer (let's call it layer A). To pull in the packages I need, I must change a .conf file variable in the layer A. The conf file is located in meta-layer-A/conf/distro.conf The variable I want to change is

PREFERRED_PROVIDER_virtual/docker,

which is set to "docker-ce". I need to change it to "docker-moby" so that I can build recipe docker-moby.

I would prefer to make changes only in my custom layer, and not in any other layer incl. layer A. How can that be done?

When I manually change

PREFERRED_PROVIDER_virtual/docker = "docker-ce"

to

PREFERRED_PROVIDER_virtual/docker = "docker-moby"

in the original layer i can build docker-moby.

I have tried overriding the variable by setting it in my local.conf in my build folder. (as described here How to override a .conf file in Yocto)

PREFERRED_PROVIDER_virtual/docker = "docker-moby"

That does not override it.

When I try 'bitbake docker-moby', or even 'bitbake -e docker-moby', I just get

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

This is true even if I comment out setting the variable at all in the distro.conf file.

I get this from '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)

edit: I managed to get the evaluation order of conf files. Looks like local.conf is not the last conf file to be evaluated:

# $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: I infused a .conf file that gets infused and evaluated after original.inc. I can see that it is finally set to the value "docker-moby", but still I get the error that nothing is providing 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"

Solution

  • The solution I finally used was to create my own distribution, and a corresponding configuration file in meta-custom/conf/distro which included the line PREFERRED_PROVIDER_virtual/docker="docker-moby". That way the original meta-layer-A conf file was never read and no PREFERRED_PROVIDER_virtual/docker was set prior to my distro conf setting it (except the soft setting from meta-virtualization).