From: "Antonin Godard" <antonin.godard@bootlin.com>
To: "Quentin Schulz" <quentin.schulz@cherry.de>,
<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 15:32:34 +0100 [thread overview]
Message-ID: <D597PUBREPC3.3UL7RTF5HBN0X@bootlin.com> (raw)
In-Reply-To: <4fa6fe53-13a1-41e3-9604-ffb9698b78ca@cherry.de>
Hi Quentin,
On Wed Oct 30, 2024 at 11:18 AM CET, Quentin Schulz wrote:
[...]
>> +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/
+1, thanks.
>> +``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.
You're right, it's not a good practice. Initially, I wanted to document only the
conditional case below, but it felt strange introducing it without a note on the
role of layers.conf & setting things from there. What about the following
changes instead:
* Remove the first section that shows how to set configurations unconditionally.
* Instead, introduce the next section by saying something like "Since it's not
good practice to unconditionally set global configurations from the layer.conf
file, we can use the following technique...".
* Simply rename the section "Providing Global-level Configurations With Your
Layer" instead of "Conditionally Provide Global-level Configurations With Your
Layer". This way we only show the "good" way to make changes from layer.conf.
> 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.
My bad you're right, it's only the order in BBLAYERS that matters, I'll remove
this sentence.
>> +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
Yes, it should be 3 actually, missed that!
>> +
>> +#. 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.
+1, better that way :)
>> + ``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 :)
Correct, I thought `require` would've failed if contains returned an empty
string (and that it was for that reason they used include in meta-virt) but
apparently not, the parser is smart enough. :) Will change, thanks
> 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 :)
I've tested it and no, it doesn't affect the sstate-cache.
I've done the following:
1) Build core-image-minimal with virtual/kernel set to linux-yocto-rt (set with
a custom layer + technique detailed above, through a distro feature).
2) Same directory, rm -r tmp/, rebuild -> setscene tasks are executed as
expected, so no rebuild, just the rootfs being created.
3) Different directory (to make LAYERDIR change for my custom layer), rm -r
tmp/, rebuild -> same result as 2).
>> +
>> +#. 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?
Not really, but I'd rather advise here to place it in a conventionally used
directories (since we generally use this directory for machine include files)
rather than giving a random example. What do you think?
>> 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?
Oops, will remove.
> Cheers,
> Quentin
Cheers,
Antonin
--
Antonin Godard, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2024-10-30 14:32 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 ` [docs] " Quentin Schulz
2024-10-30 14:32 ` Antonin Godard [this message]
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=D597PUBREPC3.3UL7RTF5HBN0X@bootlin.com \
--to=antonin.godard@bootlin.com \
--cc=docs@lists.yoctoproject.org \
--cc=quentin.schulz@cherry.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.