Search code examples
embedded-linuxyoctobitbake

Excluding yocto meta-layer depending on a variable value


I am playing around with yocto for a personal project. I have a layer called meta-nightcore which has several files writen in different languages: bash, Python, C, C++ and several recipes.

Is it possible to exclude the meta-nightcore when calling bitbake <image_name> when a user defined variable NIGHTCORE_ENABLED? This variable is set via shell command before calling source oe-init-build-env.

If you have different ideas, can you also share?

Thanks anh Best Regards, Duy Tran


Solution

  • Yes, you can pass your environment variable into the build environment and then use it to conditionally add the extra layer(s).

    You'll need to modify your bblayers.conf to store a default value for NIGHTCORE_ENABLED and to add the extra layer(s) to BBLAYERS if it is set to 1:

    NIGHTCORE_ENABLED ?= "0"  # overridden by env if specified in BB_ENV_EXTRAWHITE
    NIGHTCORE_LAYERS ?= "/path/to/poky/meta-nightcore"
    
    BBLAYERS ?= " \
      /path/to/poky/meta \
      /path/to/poky/meta-poky \
      /path/to/poky/meta-yocto-bsp \
      ${@bb.utils.contains('NIGHTCORE_ENABLED', '1', '${NIGHTCORE_LAYERS}', '', d)} \
    "
    

    Then, you need to tell Bitbake to allow your environment variable to be captured into the Bitbake datastore by adding it to BB_ENV_EXTRAWHITE:

    export NIGHTCORE_ENABLED=1
    export BB_ENV_EXTRAWHITE="${BB_ENV_EXTRAWHITE} NIGHTCORE_ENABLED"
    

    You can then run bitbake <image_name>.

    Because bblayers.conf is usually generated when source oe-init-build-env is run for the first time, you may wish to use TEMPLATECONF to create a bblayers.conf.sample file that already includes this extra logic.

    There's some related answers here too:

    Is it possible to pass in command line variables to a bitbake build?