From 516039e60916da4c3bb39f0d0c18d721e7ecf75e Mon Sep 17 00:00:00 2001 From: Alexander Kanavin Date: Thu, 6 Nov 2025 18:08:04 +0100 Subject: [PATCH] bitbake: bitbake-setup: replace {THISDIR} token with a keyword: bb-layers-relative {THISDIR} is a special value token that can be used in the list of enabled layers to specify the layer location relative to the confguration file: https://git.openembedded.org/bitbake/commit/?id=b3153be29de8b8570b0c184369bd41f4c646cf92 This replaces the token with an explicit separate keyword for such layers: so that special processing to determine the final value can be avoided, and the feature can be formalized in the json schema: instead of "bb-layers": [ "{THISDIR}/meta-my-project" ] this allows "bb-layers-relative": [ "meta-my-project" Going forward I think we should strive to avoid any further special value tokens. (Bitbake rev: 90da82bd2bfcfd5590c9ae06015737b616074b56) Signed-off-by: Alexander Kanavin Signed-off-by: Richard Purdie --- bitbake/bin/bitbake-setup | 28 ++++++++++++++++------------ bitbake/lib/bb/tests/setup.py | 20 ++++++++++---------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/bitbake/bin/bitbake-setup b/bitbake/bin/bitbake-setup index 47de4654e3..29fdf11892 100755 --- a/bitbake/bin/bitbake-setup +++ b/bitbake/bin/bitbake-setup @@ -129,21 +129,24 @@ def checkout_layers(layers, layerdir, d): return layers_fixed_revisions def setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir): - def _setup_build_conf(layers, build_conf_dir): + def _setup_build_conf(layers, relative_layers, build_conf_dir): os.makedirs(build_conf_dir) layers_s = [] + for l in layers: - if l.startswith("{THISDIR}/"): - if thisdir: - l = l.format(THISDIR=thisdir) - else: - raise Exception("Configuration is using {THISDIR} to specify " \ - "a layer path relative to itself. This can be done only " \ - "when the configuration is specified by its path on local " \ - "disk, not when it's in a registry or is fetched over http.") - if not os.path.isabs(l): - l = os.path.join(layerdir, l) + l = os.path.join(layerdir, l) layers_s.append(" {} \\".format(l)) + + for l in relative_layers: + if thisdir: + l = os.path.join(thisdir, l) + else: + raise Exception("Configuration is using bb-layers-relative to specify " \ + "a layer path relative to itself. This can be done only " \ + "when the configuration is specified by its path on local " \ + "disk, not when it's in a registry or is fetched over http.") + layers_s.append(" {} \\".format(l)) + layers_s = "\n".join(layers_s) bblayers_conf = """BBLAYERS ?= " \\ {} @@ -220,7 +223,8 @@ def setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir): os.rename(bitbake_confdir, backup_bitbake_confdir) if layers: - _setup_build_conf(layers, bitbake_confdir) + relative_layers = bitbake_config.get("bb-layers-relative") or [] + _setup_build_conf(layers, relative_layers, bitbake_confdir) if template: bb.process.run("{} setup -c {} -b {} --no-shell".format(oesetupbuild, template, bitbake_builddir)) diff --git a/bitbake/lib/bb/tests/setup.py b/bitbake/lib/bb/tests/setup.py index 767a6298da..ba2a90009d 100644 --- a/bitbake/lib/bb/tests/setup.py +++ b/bitbake/lib/bb/tests/setup.py @@ -148,9 +148,10 @@ print("BBPATH is {{}}".format(os.environ["BBPATH"])) "oe-fragments": ["test-fragment-2"] }, { - "name": "gizmo-notemplate-with-thisdir", - "description": "Gizmo notemplate configuration using THISDIR", - "bb-layers": ["layerC","layerD/meta-layer","{THISDIR}/layerE/meta-layer"], + "name": "gizmo-notemplate-with-relative-layers", + "description": "Gizmo notemplate configuration using relative layers", + "bb-layers": ["layerC","layerD/meta-layer"], + "bb-layers-relative": ["layerE/meta-layer"], "oe-fragments": ["test-fragment-2"] } ] @@ -204,14 +205,13 @@ print("BBPATH is {{}}".format(os.environ["BBPATH"])) with open(os.path.join(bb_conf_path, 'bblayers.conf')) as f: bblayers = f.read() for l in bitbake_config["bb-layers"]: - if l.startswith('{THISDIR}/'): - thisdir_layer = os.path.join( + self.assertIn(os.path.join(setuppath, "layers", l), bblayers) + for l in bitbake_config.get("bb-layers-relative") or []: + relative_layer = os.path.join( os.path.dirname(config_upstream["path"]), - l.removeprefix("{THISDIR}/"), + l, ) - self.assertIn(thisdir_layer, bblayers) - else: - self.assertIn(os.path.join(setuppath, "layers", l), bblayers) + self.assertIn(relative_layer, bblayers) if 'oe-fragment' in bitbake_config.keys(): for f in bitbake_config["oe-fragments"]: @@ -298,7 +298,7 @@ print("BBPATH is {{}}".format(os.environ["BBPATH"])) 'gizmo-env-passthrough', 'gizmo-no-fragment', 'gadget-notemplate','gizmo-notemplate', - 'gizmo-notemplate-with-thisdir')} + 'gizmo-notemplate-with-relative-layers')} } for cf, v in test_configurations.items(): for c in v['buildconfigs']: