public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: "chris.larson via isar-users" <isar-users@googlegroups.com>
To: isar-users@googlegroups.com
Cc: Christopher Larson <chris.larson@siemens.com>
Subject: [PATCHv2] lists.bbclass,bitbake.conf: use features lists
Date: Fri, 27 Dec 2024 14:55:26 -0700	[thread overview]
Message-ID: <20241227215526.781-1-chris.larson@siemens.com> (raw)
In-Reply-To: <20241216201602.619-1-chris.larson@siemens.com>

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



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



-- 
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/20241227215526.781-1-chris.larson%40siemens.com.

  parent reply	other threads:[~2024-12-27 21:55 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
2024-12-27 21:55 ` chris.larson via isar-users [this message]
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=20241227215526.781-1-chris.larson@siemens.com \
    --to=isar-users@googlegroups.com \
    --cc=chris.larson@siemens.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