From patchwork Thu Feb 13 21:41:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "chris.larson" X-Patchwork-Id: 4056 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Thu, 13 Feb 2025 22:42:27 +0100 X-Sieve: CMU Sieve 2.4 Received: from mail-pj1-f63.google.com (mail-pj1-f63.google.com [209.85.216.63]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 51DLgPnQ031241 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 13 Feb 2025 22:42:26 +0100 Received: by mail-pj1-f63.google.com with SMTP id 98e67ed59e1d1-2fc1eadf5a8sf1665971a91.3 for ; Thu, 13 Feb 2025 13:42:26 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1739482939; cv=pass; d=google.com; s=arc-20240605; b=BsvwRNRA4x8kVbTfSWmbW7aJcSRWmMM5mzZPe6gCEYhms6q9wVi3BYTzhnY2DDOdZj 8ITnFNqNl2+c1M91bQPHrXbO6m6n94B9EvKwXTCZUw2WS1wt6T1xhGasxyERBWTK0iv1 io4Bk8SXoYWosqZeWxdW83OmsBfFojEijsU/tk7ETBBVfv+iFoKJOVkh5XjkVjSH8ePl X02cveXWOesOD+d2w1oGzlx92yUBLSslgJ9w8kBMmfJ00Mws1piQn8DaLUmnGa2cZ/aX M7avwOHJicnfXAAOFe2Ufqt+83F7tJy/NY3sqjyQjhaL0yL2jQwdLvo9WhQ1qJKU5vda AaIQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to:feedback-id:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=uQmE74xtO5qN07yAdqw2iTmW7503KNxUE4I3cejgVPI=; fh=XzkhjwIm7S5OhWGOUQRnBlcGwHqGV9ZaCC27P5xvcXA=; b=JeFuMcMpiQ6G5h2yiNuy4gaQDPIh9UI/6op4fNyT8RTpER/FY3lt8n9MdwQVBMO1tO 4cuPvW0Wcb6ZEjwl5tgWn+4seYMeRStfPYAJn+b3esl0RZkbB3ch6j2eKQRYtpFYni3V 519vcFFKtirgKMHZxaZwoLnUIidTpVTodi6tiBmu1QwL/KYkXTSIkuY3UyZof9R2DAXN dy5HUe7BHUgfrB95S68Amscn/47LdoZz3T5t0NV0CpqTSx1ilj784vR4PlFR5+t620S1 CrpXpz7j8Zl0SYRN+A+2Q+fQlZl8202wkULJHo2OdxvWzzry6HOB2wsSncCxzFsFJd6q YOIA==; darn=isar-build.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=Qh4vR2mt; spf=pass (google.com: domain of fm-1325773-2025021321421519d55a6503a474787e-stzvef@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) smtp.mailfrom=fm-1325773-2025021321421519d55a6503a474787e-STzVEF@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1739482939; x=1740087739; darn=isar-build.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:feedback-id :mime-version:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=uQmE74xtO5qN07yAdqw2iTmW7503KNxUE4I3cejgVPI=; b=xveCI+78R41c3Fddu+y4jkHz8BBW4GzVJHFs8aUZpJQojmFbEDFfUI6qy9MdqGXXor k5tgg8ffAI3TZtrdk1rPsvnEgScXS0pndpi9ivPtVgs073LQ023CBQ3k3y7KTvnzrNPs Sy/ycxBrQhrTifETrZi4DMLg4kRCs7v9sImJT73PKnUzUi6+AlHvUZzQTWu9IzL5dfNB ltunWDiGnlp4c1Rizpgl7pwqtA048ho0ZaE2NNZ+qcSM93iBMgrAzZu/80WoIpZgAqtx 8wgHs4EU48PBB6DR+rroOf6ekunwlyZA6cdPGM7nZ0LWt9FoVOJ/YlOEHkIoDRlius4r 09Vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739482939; x=1740087739; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:feedback-id :mime-version:message-id:date:subject:cc:to:from:x-beenthere :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=uQmE74xtO5qN07yAdqw2iTmW7503KNxUE4I3cejgVPI=; b=Uy0R/MWJDBPMbSMYLJfFB/5lCT+JrrSQgv8pQcY7sMqY3gYGWRrsOIJUXeT8VQospT Mqz8vF+aYQeKdPtDd/djMtY93GjWX4CklMgQ6MEYbe9VKvgRrZ6hqmvwSov1JMuWcKKK Gb/TSSfgUnr42VMOSeXDZblARnyMn/+UYUMCeNjA4ySLRf+J2g3892Vp9A7yUgo6sTzG qQyAKAMvwlf1P61PsoM0SbXvrMPspCt++u5OO7Y/fZqTxicOn/HVBD1qOE/MFbOz4S4+ JkJo3z1KfF+HjGoTYe+VyjxuJrN1XCLn4kEG4k/Xy7ap6W088R3/2BReSoJuNMZ7usVQ XW2Q== X-Forwarded-Encrypted: i=2; AJvYcCU/m5XRAf2wk6D54ikQjSA+z1Gkw1T2ZbfNmwFVdcWfSrLFue9pJ0kftCR/Y13Pd7juKkwYQBc=@isar-build.org X-Gm-Message-State: AOJu0YyJbOOZyVI2nBhV/TpTWx6yu2i3TCv/X/tIsBeMklcgYlb8UNB7 UVxAv6bYfw+NpII06jijww+1fX79FXyTQs7lDnWYpbZRxWUosyn7 X-Google-Smtp-Source: AGHT+IG4rI7wVyItuOyWmUJYNZuAtl8gykdjC+oVwEb0b/mVT4GzIBxXcCNHyw/c0SsRAZ8GtglRuw== X-Received: by 2002:a17:90a:eb04:b0:2fc:2a9c:21de with SMTP id 98e67ed59e1d1-2fc2a9c21e4mr1544492a91.35.1739482939041; Thu, 13 Feb 2025 13:42:19 -0800 (PST) X-BeenThere: isar-users@googlegroups.com; h=Adn5yVGvoPvth2JQhKGHkWALejBGaGuYQjTlsMib3wUtETo9cw== Received: by 2002:a17:90a:ec02:b0:2ee:8220:1966 with SMTP id 98e67ed59e1d1-2fc0d57e4d3ls787199a91.0.-pod-prod-09-us; Thu, 13 Feb 2025 13:42:18 -0800 (PST) X-Received: by 2002:a17:90b:520d:b0:2f9:c144:9d13 with SMTP id 98e67ed59e1d1-2fbf5c57faamr13936719a91.24.1739482937709; Thu, 13 Feb 2025 13:42:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1739482937; cv=none; d=google.com; s=arc-20240605; b=T8rogO6QMZ1l8L43LmfxfHCqju+WQnOBZPr7/+6n/X0JQwNpK1UzeTgGp3sePzwODr TbD6VSUen2ojnYm8frCeaFtsAgTdcQ33zG9IueQ9z2MS/+TnAAgM0C4OGVl1eHPS8gap Uv4M3xm8i+sB7ohUCu+fBEEzdNPG4LydG3vFxvsV/bBaEJRdn7cYkm9TZkLVNnPRK3Wu 6876dZqEMnzLR8rr88CkC7mFu+99yfM8ZmvzlpHXwzRnY8Qw6xsKsX9OeznKVAz7igfh 5RoH8r3OnQeXaenK4SlI4cpRk7r3XUdRXET5fqr63vCbWHUkoUthKB6jljbynw5AV5op oxAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=feedback-id:content-transfer-encoding:mime-version:message-id:date :subject:cc:to:from:dkim-signature; bh=bUfcTd9bPX4/Nlx+G8mKsnrwqG/sGWnaNdM2lpfe5Mc=; fh=3bh9z2BWAzGAc1byRhMi0K+arMZmX5BQHE0sOxINdyU=; b=DG5NsvWAd0gcxblsKHKkDs8yCOG2xxks2k8UdAqL/EZgl4qD6QimFM16ZqUv5qScHq dSMzMJsdoDa1Ny/uS4xovsWP5tASuTiK7xk8y0ZIhIJj+4br1nfKt28fhMLiDauGFSxk LhXmGecyBWMGz467T9983+BJdTGHPXs/YK9N58Tkyd1jUH/TGsycbZmGPh0C3c8wSAez 6jjlxgDce/L3tCuT96+5rfmr6gwJ7nUXueBvtAoC2tJnfgfH/3Q1G4vAuNaKU1daD78w kz3SPTcrNbBMSXS0Bpq6nG+Nu8OhwYiJnbrCkq5IDX8w3rEq2K6IMGvae/QYdbHFHe8b MXtA==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=Qh4vR2mt; spf=pass (google.com: domain of fm-1325773-2025021321421519d55a6503a474787e-stzvef@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) smtp.mailfrom=fm-1325773-2025021321421519d55a6503a474787e-STzVEF@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: from mta-64-227.siemens.flowmailer.net (mta-64-227.siemens.flowmailer.net. [185.136.64.227]) by gmr-mx.google.com with ESMTPS id 98e67ed59e1d1-2faa5cee208si468355a91.1.2025.02.13.13.42.17 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Feb 2025 13:42:17 -0800 (PST) Received-SPF: pass (google.com: domain of fm-1325773-2025021321421519d55a6503a474787e-stzvef@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) client-ip=185.136.64.227; Received: by mta-64-227.siemens.flowmailer.net with ESMTPSA id 2025021321421519d55a6503a474787e for ; Thu, 13 Feb 2025 22:42:15 +0100 X-Patchwork-Original-From: "chris.larson via isar-users" From: "chris.larson" To: isar-users@googlegroups.com Cc: Christopher Larson Subject: [PATCHv4 1/3] lists.bbclass: add class Date: Thu, 13 Feb 2025 14:41:55 -0700 Message-ID: <20250213214200.296-1-chris.larson@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-1325773:519-21489:flowmailer X-Original-Sender: chris.larson@siemens.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=Qh4vR2mt; spf=pass (google.com: domain of fm-1325773-2025021321421519d55a6503a474787e-stzvef@rts-flowmailer.siemens.com designates 185.136.64.227 as permitted sender) smtp.mailfrom=fm-1325773-2025021321421519d55a6503a474787e-STzVEF@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com X-Original-From: chris.larson@siemens.com Reply-To: chris.larson@siemens.com Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-Spam-Status: No, score=-4.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H2,RCVD_IN_RP_CERTIFIED, RCVD_IN_RP_RNBL,RCVD_IN_RP_SAFE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= From: Christopher Larson This class provides 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 a configured variable, append '-alpha' to it. 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". Signed-off-by: Christopher Larson --- meta/classes/lists.bbclass | 105 +++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 meta/classes/lists.bbclass 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')