From patchwork Fri Jan 24 21:20:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "chris.larson" X-Patchwork-Id: 4044 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Fri, 24 Jan 2025 22:21:17 +0100 X-Sieve: CMU Sieve 2.4 Received: from mail-lf1-f59.google.com (mail-lf1-f59.google.com [209.85.167.59]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 50OLLHIL015731 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 24 Jan 2025 22:21:17 +0100 Received: by mail-lf1-f59.google.com with SMTP id 2adb3069b0e04-5424a89c885sf1261501e87.0 for ; Fri, 24 Jan 2025 13:21:17 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1737753670; cv=pass; d=google.com; s=arc-20240605; b=HegKRybTId5t5OqbrEd+bGOjpKehNNBL0+3VoiZ3nFAR04l7/BtK39KhjXdthNoyna 4AOHt4MeOCRiqEldAl2IQFR4GyB5aHvPcJb75J5EgM9yJUKqMALoNASQR/LoO35FOU5B xu4sYSmSsIidUAkKmOSQqDltYZC9MHjdH13wvDKtJawVn0PfpV1VNwaRU0MlAjF7/rWx e35dWWktJmV+leyLoVTWOuzSFE16xnQ1NQUGMSQHYR92Kz0BwvsLeWdJ1u9XfoT0Mu/7 VY5wKNydXfWmHiuivgnZjksf7lpBUl/QKvEx7lZkfzPaFApm5X+RCUWGnlLs0vieS6L1 qGUA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=zQtnlrJ4facWn3vmIEvwDks0wxQgt+8PDXeCUbWcbsU=; fh=ubgPnReQVvTlWGccFFeDWmV/2dnUPBtHq8E3493MSZU=; b=k407u/3r/MZ2CqqHxg8vyaFLG43g7mg9M05YwOOLeILIemxwJScxyUsfZ7mB40sKqG 5/Ny+okpFKc/IbkOLaMub0KDYbS0mblw+GM0O830NY1fx12AMmVHs8cteC1/Mr0x/FE+ uZL+7TLIjLHFUXoDzWXwYpgW9PP6JuVtDBRIx8/LXdy62vqCVBV2Y9caHmpkyXygNpJy d06e0vJxHJFpoUOddAsH3L11sjj0YMnnN0OqvMS48Ull2B/nICOQTvdFGyXkeLaPCD7S STPFVNbYsgWC37QFCD/mQ9VvnM7bEZBAHz4d9yeg+ksVH4gjJ20rVbvLiDzRDCBV1x+S 2reA==; darn=isar-build.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=REBnw62y; spf=pass (google.com: domain of fm-1325773-20250124212106991bb51add0c10c971-pbxwzs@rts-flowmailer.siemens.com designates 185.136.64.228 as permitted sender) smtp.mailfrom=fm-1325773-20250124212106991bb51add0c10c971-pBxwZS@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=1737753670; x=1738358470; 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:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=zQtnlrJ4facWn3vmIEvwDks0wxQgt+8PDXeCUbWcbsU=; b=iKomL3omnZooR6+7bv6DoX6QZJKwKn+J6mzCzdaAcxA2ZEX/TGmeg4F/i3KRTnNR+j 6Dpitvg4FBhKd/J8X06T1HuEqE52uIrvktvrHAgC3GT5oFTQtIbR/XOiUFAijstNZhZw kLGZt3ftlyg49fEpN96BYS0eZpxbhSYdBIASnUHYKD2HqcuiEqUt2pnt35SlxzIPlbNf FvHdIsmEoU6cE23/EdrfhCk8aANTCpvktgDynbyIStenrTeVDq0KT7GObMVvmbiECpsQ /DMC6k8/f8H7F7hj9Y3WaF25qgZ67EH1hJs8tjbuP9yungA8oPiBgfOrmxjQ2Va7LSeO 18iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737753670; x=1738358470; 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:references:in-reply-to:message-id:date:subject:cc:to :from:x-beenthere:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=zQtnlrJ4facWn3vmIEvwDks0wxQgt+8PDXeCUbWcbsU=; b=tS0tJxEc2sj4ld57DjXWd7qCNa3SachQtmvCgJf6IyQXczzlp1r7GAiPL6zuyfzmiJ lPBehT/pgzgZdF6sTtFRt88966LvzJ2pw4SjBWt6DGQDzUPI29kL61mYFoBes/f/EQRt 2qtOGyHGfUTUaEalwgZFs84nFEzBuRMNcGChDC4r4nd78KzTJm1DRV30LnKIjT5l8fd4 93SKNFJ1mr9pbrPQYIPFPAhOuoJRfxb3ns3G3BKeYaO873qWbdj7CmBNhV6a2cpf5VjK rTqG/OO+0u6dJL02JfmUTCrpE5yEuE8wc+X3Yt71FrGUv5/S99cRiy/LCZUO5rfiJ8OE vlgw== X-Forwarded-Encrypted: i=2; AJvYcCVRSIz6Ub9JPLOVoO1jwHu1Uny16L1wsrHf8yKQl0346RQu37K9N2fSy1iQsDNq3w87D8tuQJw=@isar-build.org X-Gm-Message-State: AOJu0Yww2ZjRH0Eih/1B8JfR1MyDdl1Yl5rAtdq/cyQX1sQ1THXoiynH 3ob1HeXp0C1WH1zB4yF9JWTYEpzB9Rx9iTioEZ8DDEYyRjjSMYxX X-Google-Smtp-Source: AGHT+IE116J0KY2YrUFtqU8ER0uNgtU9axW8fu5PIoC/CcI5FB6rgcCl0PyjXB1JYcGHVExHbsIMhQ== X-Received: by 2002:ac2:5497:0:b0:542:9757:d5df with SMTP id 2adb3069b0e04-5439c2291dbmr8477955e87.21.1737753669611; Fri, 24 Jan 2025 13:21:09 -0800 (PST) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a19:8c0b:0:b0:540:1bb1:7828 with SMTP id 2adb3069b0e04-543c2488714ls466628e87.1.-pod-prod-07-eu; Fri, 24 Jan 2025 13:21:07 -0800 (PST) X-Received: by 2002:a05:6512:1312:b0:53e:39e6:a1c2 with SMTP id 2adb3069b0e04-5439c2807a0mr12183654e87.44.1737753667235; Fri, 24 Jan 2025 13:21:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1737753667; cv=none; d=google.com; s=arc-20240605; b=Qx/oYDL6pZrwkr6zPiDlit+UmjZOGdQ6vff33r2eYCEE0pbTYWoE20H1W7uc1dKV4k lj8IEe2qlCP7eClEclGtFVot/pHtkUTYm0cJ2NH/wyzIuPKWawkpZ5c1ePH1W+0Lwjyh 0llVoCIFX8pbfSu8lYWkE8El/4OdXNw4Ko8l4inl9/gECUN8Is7OMadnTbivi+tFKUjO Q2+93lLJAz4FPdNwYtAmH3fF00vS9hWHwT7T9MObSQH8gMcW7dzMu0m+D7D9jYFA17Ap Diny71qoJqVkwH3yliLPJW6MKTk0cQmNqlCk0Pond3VK4iQ3IfFsuILR1zqGRQ5unec5 RbZw== 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:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=bUfcTd9bPX4/Nlx+G8mKsnrwqG/sGWnaNdM2lpfe5Mc=; fh=3bh9z2BWAzGAc1byRhMi0K+arMZmX5BQHE0sOxINdyU=; b=Ixmlix7D2dWTAheDCVAgX9mRNK8szfkNDI1fTkMos8hQ42Ntcjm3k/elo0y7VszC3n 1npyyK/rgC79xbgD5EY9zkUKJrzQaA0BV8QKu6JXJzUGZlnWhy0pdyuhdpWTFa+11hmQ Ovb3sLSZTqU+tiiZIJ4T4WLou5K915OxGBnEZEupL7kpEdI14se+W5+UYMwsuZQa6sWY w0CkitGyJfQGbHiEm3yxd+SqdrR2S73dm+8ATfhiCdT0qjDWKVTueAmzC5h1jGqgSQKI E9YqS5jfad7627sm+Aev1fJNJdhYnO4cEz/7GwVPOoCoF5pYGMt9CpBTFBhLK1Yv3AdF cXSg==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=REBnw62y; spf=pass (google.com: domain of fm-1325773-20250124212106991bb51add0c10c971-pbxwzs@rts-flowmailer.siemens.com designates 185.136.64.228 as permitted sender) smtp.mailfrom=fm-1325773-20250124212106991bb51add0c10c971-pBxwZS@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: from mta-64-228.siemens.flowmailer.net (mta-64-228.siemens.flowmailer.net. [185.136.64.228]) by gmr-mx.google.com with ESMTPS id 2adb3069b0e04-543c82228c5si66497e87.1.2025.01.24.13.21.07 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Jan 2025 13:21:07 -0800 (PST) Received-SPF: pass (google.com: domain of fm-1325773-20250124212106991bb51add0c10c971-pbxwzs@rts-flowmailer.siemens.com designates 185.136.64.228 as permitted sender) client-ip=185.136.64.228; Received: by mta-64-228.siemens.flowmailer.net with ESMTPSA id 20250124212106991bb51add0c10c971 for ; Fri, 24 Jan 2025 22:21:06 +0100 X-Patchwork-Original-From: "chris.larson via isar-users" From: "chris.larson" To: isar-users@googlegroups.com Cc: Christopher Larson Subject: [PATCHv3 1/3] lists.bbclass: add class Date: Fri, 24 Jan 2025 14:20:37 -0700 Message-ID: <20250124212040.473-1-chris.larson@siemens.com> In-Reply-To: <20241216201602.619-1-chris.larson@siemens.com> References: <20241216201602.619-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=REBnw62y; spf=pass (google.com: domain of fm-1325773-20250124212106991bb51add0c10c971-pbxwzs@rts-flowmailer.siemens.com designates 185.136.64.228 as permitted sender) smtp.mailfrom=fm-1325773-20250124212106991bb51add0c10c971-pBxwZS@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')