public inbox for docs@lists.yoctoproject.org
 help / color / mirror / Atom feed
From: Quentin Schulz <quentin.schulz@cherry.de>
To: antonin.godard@bootlin.com, docs@lists.yoctoproject.org
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: Re: [docs] [PATCH 2/2] dev-manual: document how to provide confs from layer.conf
Date: Wed, 30 Oct 2024 11:18:55 +0100	[thread overview]
Message-ID: <4fa6fe53-13a1-41e3-9604-ffb9698b78ca@cherry.de> (raw)
In-Reply-To: <20241030-layer-confs-v1-2-0f7dcf460e27@bootlin.com>

Hi Antonin,

On 10/30/24 10:23 AM, Antonin Godard via lists.yoctoproject.org wrote:
> Add a section on providing global level configuration from the
> layer.conf file. Since this file is parsed at an earlier stage in the
> parsing process, it's not possible to combine bb.utils.contains and
> {DISTRO,MACHINE}_FEATURES to conditionally some configurations.
> 
> This patch documents:
> 
> - First that this file can be used for providing such configuration.
> - Then demonstrates how to conditionally provide them, using a technique
>    that is currently used in meta-virtualization
>    (https://git.yoctoproject.org/meta-virtualization/tree/conf/layer.conf#n50).
> 
> Fixes [YOCTO #12688].
> 
> Signed-off-by: Antonin Godard <antonin.godard@bootlin.com>
> ---
>   documentation/dev-manual/layers.rst | 78 ++++++++++++++++++++++++++++++++++++-
>   1 file changed, 77 insertions(+), 1 deletion(-)
> 
> diff --git a/documentation/dev-manual/layers.rst b/documentation/dev-manual/layers.rst
> index 91889bd0ae391c7b6e62068778ae5c180c840762..94d959fde67e911435d99ce8dd85b3d591573c82 100644
> --- a/documentation/dev-manual/layers.rst
> +++ b/documentation/dev-manual/layers.rst
> @@ -644,6 +644,83 @@ variable and append the layer's root name::
>      order of ``.conf`` or ``.bbclass`` files. Future versions of BitBake
>      might address this.
>   
> +Providing Global-level Configurations With Your Layer
> +-----------------------------------------------------
> +
> +When creating a layer, you may need to define configurations that should take
> +effect globally in your build environment when it is part of the
> +:term:`BBLAYERS` variable. The ``layer.conf`` file is a :term:`configuration

"when it is part of the BBLAYERS variable" is a complicated way of 
saying "when it is used"/"when it is part of the build setup". Maybe we 
can find something more explicit?

I would also suggest adding "in the new layer" after ``layer.conf`` to 
explicit the location of layer.conf (maybe we should even add it's in 
conf/?). We have many different possible locations for configuration 
files so I feel like we should tell people where exactly to expect 
files. (e.g. local.conf, distro conf file, machine conf file, 
(multiconfig?), bblayers.conf, are all expected in different locations).

> +file` that affects the build system globally, so it is a candidate for this
> +use-case.
> +
> +For example, if your layer provides an alternative to the linux kernel named

s/provides an alternative to the Linux kernel/provides a Linux kernel 
recipe/

s/linux/Linux/

> +``linux-custom``, you may want to define the :term:`PREFERRED_PROVIDER` for the
> +``linux-custom`` recipe::
> +
> +  PREFERRED_PROVIDER_virtual/kernel = "linux-custom"
> +
> +This can be defined in the ``layer.conf`` file. If your layer has a higher
> +:term:`BBFILE_PRIORITY` value, it will take precedence over previous definitions
> +of the same ``PREFERRED_PROVIDER_virtual/kernel`` assignments.
> +

I seem to recall this is the perfect example of what we do NOT want in a 
layer.conf though (might be bad recollection though :) ). I actually do 
not even know what'd be a valid reason to have variables directly 
defined in layer.conf (I see you're providing an example in the next 
section, but do we really need this section to provide an example of 
something the user shouldn't be doing?).

I would add a very big note/warning at the end of this section saying 
that this is almost always wrong as it is mostly expected that adding a 
layer should only minimally change the build output. And that for this 
very example, it should be in a machine or distro configuration file 
instead.

I am not sure that BBFILE_PRIORITY is applicable for this as what 
matters is the parsing order of all layer.conf files from entries in 
BBLAYERS. I believe it's just parsed in the order it appears in 
BBLAYERS? Last one has priority (because we use = and not ?=). If that 
is actually working, we should then expand 
https://docs.yoctoproject.org/ref-manual/variables.html#term-BBFILE_PRIORITY 
as well because it clearly only defines priority for recipes.

> +Conditionally Provide Global-level Configurations With Your Layer
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +In some cases, your layer may provide global configurations only if some
> +features it provides are enabled. Since the ``layer.conf`` file is parsed at an
> +earlier stage in the parsing process, the :term:`DISTRO_FEATURES` and
> +:term:`MACHINE_FEATURES` variables are not yet available to ``layer.conf``, and
> +declaring conditional assignments based on these variables is not possible. The
> +following technique shows a way to leverage this limitation by using the
> +:term:`USER_CLASSES` variable and a conditional ``include`` command.
> +
> +In the following steps, let's assume our layer is named ``meta-mylayer`` and
> +that this layer defines a custom :ref:`distro feature <ref-features-distro>`
> +named ``mylayer-kernel``. We will set the :term:`PREFERRED_PROVIDER` variable
> +for the kernel only if our feature ``mylayer-kernel`` is part of the
> +:term:`DISTRO_FEATURES`:
> +
> +#. Create an include file in the directory
> +   ``meta-mylayer/conf/distro/include/``, for example a file named
> +   ``mylayer-kernel-provider.inc`` that sets the kernel provider to
> +   ``linux-custom``::
> +
> +     PREFERRED_PROVIDER_virtual/kernel = "linux-custom"

Random thought but maybe we should have align this with three 
whitespaces starting from the first character in the list. Here it is 
only one and difficult to notice at first sight. Actually, it's two 
whitespaces, I think that proves my point :D

> +
> +#. Provide a path to this include file in your ``layer.conf``::
> +
> +     META_MYLAYER_KERNEL_PROVIDER_PATH = "${LAYERDIR}/conf/distro/include/mylayer-kernel-provider.inc"
> +
> +#. Create a new class in ``meta-mylayer/classes-global/``, for example a class
> +   ``meta-mylayer-cfg.bbclass``. It Conditionally includes the file

s/Conditionally/conditionally/

Maybe say "Make it conditionally include the file" instead, as the way 
it's phrased could mean that because it's named this way or/and in that 
special directory that it magically includes the file, instead of 
telling the user what to put in that file.

> +   ``mylayer-kernel-provider.inc`` defined above, using the variable
> +   ``META_MYLAYER_KERNEL_PROVIDER_PATH`` defined in ``layer.conf``::
> +
> +     include ${@bb.utils.contains('DISTRO_FEATURES', 'mylayer-kernel', '${META_MYLAYER_KERNEL_PROVIDER_PATH}', '', d)}
> +
> +   For details on the ``bb.utils.contains`` function, see its definition in
> +   :bitbake_git:`lib/bb/utils.py </tree/lib/bb/utils.py>`.
> +
> +   .. note::
> +
> +      The ``include`` command is designed to not fail if the function
> +      ``bb.utils.contains`` returns an empty string.

I believe `require` too and we very likely want to use require here to 
make sure the path doesn't have a typo :)

Also, I'm wondering if this isn't actually "breaking" the sstate cache 
as this META_MYLAYER_KERNEL_PROVIDER_PATH would be different on each 
machine so people wouldn't be able to reuse the sstate cache.

Building with the exact same setup - and a shared SSTATE_DIR - in two 
different directories on the same machine should answer that question :)

> +
> +#. Back to your ``layer.conf`` file, add the class ``meta-mylayer-cfg`` class to
> +   the :term:`USER_CLASSES` variable::
> +
> +     USER_CLASSES:append = " meta-mylayer-cfg"
> +
> +   This will add the class ``meta-mylayer-cfg`` to the list of classes to
> +   globally inherit. Since the ``include`` command is conditional in
> +   ``meta-mylayer-cfg.bbclass``, even though inherited the class will have no
> +   effect until the feature ``mylayer-kernel`` is enabled through
> +   :term:`DISTRO_FEATURES`.
> +
> +This technique can also be used for :ref:`Machine features
> +<ref-features-machine>` by following the same steps, the only difference being
> +to place the include file in ``meta-mylayer/conf/machine/include/`` instead.
> +

I don't think the path needs to be specific?

>   Managing Layers
>   ===============
>   
> @@ -916,4 +993,3 @@ above:
>   .. note::
>      Both the ``create-layers-setup`` and the ``setup-layers`` provided several additional options
>      that customize their behavior - you are welcome to study them via ``--help`` command line parameter.
> -

Not sure this line deletion makes sense in this patch?

Cheers,
Quentin


  reply	other threads:[~2024-10-30 10:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-30  9:23 [PATCH 0/2] Document how to provide configuration from layer.conf Antonin Godard
2024-10-30  9:23 ` [PATCH 1/2] conf.py: add a bitbake_git extlink Antonin Godard
2024-10-30 10:21   ` [docs] " Quentin Schulz
2024-10-30 10:31     ` Antonin Godard
2024-10-30  9:23 ` [PATCH 2/2] dev-manual: document how to provide confs from layer.conf Antonin Godard
2024-10-30 10:18   ` Quentin Schulz [this message]
2024-10-30 14:32     ` [docs] " Antonin Godard
2024-10-31 10:13       ` Quentin Schulz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4fa6fe53-13a1-41e3-9604-ffb9698b78ca@cherry.de \
    --to=quentin.schulz@cherry.de \
    --cc=antonin.godard@bootlin.com \
    --cc=docs@lists.yoctoproject.org \
    --cc=thomas.petazzoni@bootlin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox