From: Uladzimir Bely <ubely@ilbers.de>
To: chris.larson@siemens.com, isar-users@googlegroups.com
Subject: Re: [PATCHv2] lists.bbclass,bitbake.conf: use features lists
Date: Thu, 26 Dec 2024 10:23:10 +0300 [thread overview]
Message-ID: <ae7bf3c853e86fc6412d7beba960cf41dbabdd02.camel@ilbers.de> (raw)
In-Reply-To: <20241223231656.120820-1-chris.larson@siemens.com>
On Mon, 2024-12-23 at 16:16 -0700, chris.larson via isar-users wrote:
> From: Christopher Larson <chris.larson@siemens.com>
>
>
> The intention behind this commit is to ease and encourage the use of
> Yocto-style
>
> features variables, beyond our current usage:
>
>
>
> - Add a bbclass to ease the handling of list variables in general
>
> - Add default values for the features variables
>
> - Add the features variables to the list variables
>
> - Add a combined features variable
>
>
>
> The intention is that a downstream layer will use `bb.utils.contains`
> or
>
> `bb.utils.contains_any` to enable or disable functionality based on
> the presence
>
> of defined features, rather than adding new variables in each case.
>
>
>
> Signed-off-by: Christopher Larson <chris.larson@siemens.com>
>
> ---
>
> meta/classes/lists.bbclass | 105
> +++++++++++++++++++++++++++++++++++++
>
> meta/conf/bitbake.conf | 19 +++++++
>
> 2 files changed, 124 insertions(+)
>
> create mode 100644 meta/classes/lists.bbclass
>
>
>
> v2 changes:
>
> - Corrected email address.
>
> - Added missing LIST_VARIABLES event handler
>
> - Changed the examples to the more appropriate ROOTFS_FEATURES
>
>
Hello.
Could you please resend properly formatted [PATCH v2]? Current one is
broken due to multiple extra empty lines and is not recognized as a
patch.
>
> diff --git a/meta/classes/lists.bbclass b/meta/classes/lists.bbclass
>
> new file mode 100644
>
> index 00000000..db8f5837
>
> --- /dev/null
>
> +++ b/meta/classes/lists.bbclass
>
> @@ -0,0 +1,105 @@
>
> +# Functions to improve the functionality of bitbake list variables.
>
> +#
>
> +# - Add the ability to remove items from a list variable without
> using :remove.
>
> +# - Add the ability for a list item to imply the addition of other
> list items.
>
> +#
>
> +
>
> +# Usage requires either adding the variable name to LIST_VARIABLES,
> or manually
>
> +# adding a :remove and a :prepend to each fully supported list
> variable.
>
> +#
>
> +# To remove items from a configured list, simply append the item to
> be removed
>
> +# to the variable with a '-' or '~' prefix. For example, to remove
> 'alpha' from
>
> +# ROOTFS_FEATURES, add '-alpha' to ROOTFS_FEATURES.
>
> +#
>
> +# To support implied list items, create a mapping of items to be
> appended to
>
> +# the variable when a specific item is present. For example, to
> append 'beta'
>
> +# to ROOTFS_FEATURES when 'alpha' is present, configure
> ROOTFS_FEATURES as such,
>
> +# then set IMPLIED_ROOTFS_FEATURES[alpha] = "beta".
>
> +#
>
> +# Boilerplate example:
>
> +#
>
> +# # Either this:
>
> +# LIST_VARIABLES += "ROOTFS_FEATURES"
>
> +#
>
> +# # Or this:
>
> +# ROOTFS_FEATURES:remove =
> "${@remove_prefixed_items('ROOTFS_FEATURES', d)}"
>
> +# ROOTFS_FEATURES:prepend =
> "${@add_implied_items('ROOTFS_FEATURES', 'IMPLIED_ROOTFS_FEATURES',
> d)} "
>
> +#
>
> +# Usage example:
>
> +#
>
> +# # ROOTFS_FEATURES will be "beta alpha" if the following
> configuration is used:
>
> +# IMPLIED_ROOTFS_FEATURES[alpha] = "beta"
>
> +# ROOTFS_FEATURES += "alpha"
>
> +#
>
> +# # ROOTFS_FEATURES will be "first" if the following configuration
> is used:
>
> +# ROOTFS_FEATURES = "first second"
>
> +# ROOTFS_FEATURES += "-second"
>
> +
>
> +python enable_list_variables() {
>
> + """Enable list variable functionality."""
>
> + for variable in d.getVar("LIST_VARIABLES").split():
>
> + d.setVar(variable + ':remove', '
> ${@remove_prefixed_items("%s", d)}' % variable)
>
> + d.setVar(variable + ':prepend', '${@add_implied_items("%s",
> "IMPLIED_%s", d)} ' % (variable, variable))
>
> +}
>
> +enable_list_variables[eventmask] = "bb.event.ConfigParsed"
>
> +addhandler enable_list_variables
>
> +
>
> +def remove_prefixed_items(var, d):
>
> + """Return the items to be removed from var with :remove.
>
> +
>
> + This function is intended to be used in a :remove handler to
> remove
>
> + items from a variable. It will interpret items prefixed with a
> '-'
>
> + or '~' as items to be removed.
>
> + """
>
> + # Use a flag to avoid infinite recursion.
>
> + if d.getVarFlag(var, 'remove_prefixed_items_internal') == '1':
>
> + return ''
>
> +
>
> + from collections import Counter
>
> +
>
> + d.setVarFlag(var, 'remove_prefixed_items_internal', '1')
>
> + try:
>
> + value = d.getVar(var)
>
> + counter = Counter()
>
> + for v in value.split():
>
> + if v.startswith('-') or v.startswith('~'):
>
> + counter[v[1:]] -= 1
>
> + counter[v] -= 1
>
> + else:
>
> + counter[v] += 1
>
> + return ' '.join(v for v, c in counter.items() if c < 1)
>
> + finally:
>
> + d.delVarFlag(var, 'remove_prefixed_items_internal')
>
> +
>
> +
>
> +def add_implied_items(var, implied_var, d):
>
> + """Return the items to be appended due to the presence of other
> items in var.
>
> +
>
> + This function is intended to be used in a :append handler to
> append
>
> + items from a variable. It will rely on the supplied mapping of
> implied items
>
> + to append the corresponding items.
>
> + """
>
> + # Use a flag to avoid infinite recursion.
>
> + if d.getVarFlag(var, 'add_implied_items_internal') == '1':
>
> + return ''
>
> +
>
> + def implied_items(item, implied_mapping, d, seen=None):
>
> + """Return the implied items for a given item."""
>
> + if seen is None:
>
> + seen = set()
>
> + if item in seen:
>
> + return ''
>
> + seen.add(item)
>
> + implied = implied_mapping.get(item, '').split()
>
> + return ' '.join(implied + [implied_items(f, implied_mapping,
> d, seen) for f in implied])
>
> +
>
> + d.setVarFlag(var, 'add_implied_items_internal', '1')
>
> + try:
>
> + value = d.getVar(var)
>
> + implied_mapping = d.getVarFlags(implied_var)
>
> + if implied_mapping is None:
>
> + return ''
>
> +
>
> + return ' '.join(implied_items(f, implied_mapping, d) for f
> in value.split())
>
> + finally:
>
> + d.delVarFlag(var, 'add_implied_items_internal')
>
> diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
>
> index cda98035..9f3b8a4e 100644
>
> --- a/meta/conf/bitbake.conf
>
> +++ b/meta/conf/bitbake.conf
>
> @@ -172,6 +172,25 @@ BBINCLUDELOGS ??= "yes"
>
> # Add event handlers for bitbake
>
> INHERIT += "isar-events sstate"
>
>
>
> +# Make features variables available
>
> +INHERIT += "lists"
>
> +
>
> +LIST_VARIABLES += "BASE_REPO_FEATURES MACHINE_FEATURES
> DISTRO_FEATURES ROOTFS_FEATURES"
>
> +
>
> +BASE_REPO_FEATURES ??= ""
>
> +BASE_REPO_FEATURES[doc] = "Specifies the list of features for the
> base-apt repository."
>
> +
>
> +MACHINE_FEATURES ??= ""
>
> +MACHINE_FEATURES[doc] = "Specifies the list of hardware features the
> MACHINE is capable of supporting."
>
> +
>
> +DISTRO_FEATURES ??= ""
>
> +DISTRO_FEATURES[doc] = "The software support you want in your
> distribution for various features."
>
> +
>
> +COMBINED_FEATURES = "${@oe.utils.set_intersect('DISTRO_FEATURES',
> 'MACHINE_FEATURES', d)}"
>
> +
>
> +ROOTFS_FEATURES ??= ""
>
> +ROOTFS_FEATURES[doc] = "The list of features to be included in a
> root filesystem. Typically, you configure this variable in an image
> recipe or class."
>
> +
>
> # Buildstats requires IMAGE_ROOTFS to be always defined
>
> IMAGE_ROOTFS ??= "${WORKDIR}/rootfs"
>
> INHERIT += "${@'buildstats' if
> bb.utils.to_boolean(d.getVar('USE_BUILDSTATS')) else ''}"
>
> --
>
> 2.47.1
>
>
>
--
Best regards,
Uladzimir.
--
You received this message because you are subscribed to the Google Groups "isar-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/isar-users/ae7bf3c853e86fc6412d7beba960cf41dbabdd02.camel%40ilbers.de.
next prev parent reply other threads:[~2024-12-26 7:23 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-16 20:16 [PATCH] " chris.larson via isar-users
2024-12-18 16:29 ` 'Larson, Chris' via isar-users
2024-12-23 23:16 ` [PATCHv2] " chris.larson via isar-users
2024-12-26 7:23 ` Uladzimir Bely [this message]
2024-12-27 21:55 ` chris.larson via isar-users
2025-01-24 21:20 ` [PATCHv3 1/3] lists.bbclass: add class chris.larson via isar-users
2025-02-12 7:49 ` Uladzimir Bely
2025-02-13 21:45 ` 'Larson, Chris' via isar-users
2025-01-24 21:20 ` [PATCHv3 2/3] bitbake.conf: use lists.bbclass for our existing features vars chris.larson via isar-users
2025-01-24 21:20 ` [PATCHv3 3/3] bitbake.conf: add MACHINE_FEATURES, DISTRO_FEATURES, COMBINED_FEATURES chris.larson via isar-users
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=ae7bf3c853e86fc6412d7beba960cf41dbabdd02.camel@ilbers.de \
--to=ubely@ilbers.de \
--cc=chris.larson@siemens.com \
--cc=isar-users@googlegroups.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