diff mbox series

[v2,1/1] bitbake-setup: Initialize build environment after setup/update

Message ID 20251226172034.1091465-2-adrian.freihofer@siemens.com
State New
Headers show
Series bitbake-setup: Initialize build environment after setup/update | expand

Commit Message

AdrianF Dec. 26, 2025, 5:19 p.m. UTC
From: Adrian Freihofer <adrian.freihofer@siemens.com>

Add verify_and_prepare_environment() function to source the init-build-env
script after configuration setup or updates. This ensures the build
environment is properly initialized and IDE configuration files (such as
.vscode/settings.json) are created before the user starts the IDE.

Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com>
---
 bin/bitbake-setup | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

Comments

Alexander Kanavin Dec. 26, 2025, 7:21 p.m. UTC | #1
On Fri, 26 Dec 2025 at 18:21, Adrian Freihofer via
lists.openembedded.org
<adrian.freihofer=siemens.com@lists.openembedded.org> wrote:
> Add verify_and_prepare_environment() function to source the init-build-env
> script after configuration setup or updates. This ensures the build
> environment is properly initialized and IDE configuration files (such as
> .vscode/settings.json) are created before the user starts the IDE.

Should we rather call oe-setup-vscode directly from bitbake-setup? I'm
somewhat torn, but leaning towards doing that instead.

The problem is that oe-init-build-env, for historical reasons, has two
disjointed functions:
- add some variables into the environment so that bitbake can run;
- run assorted 'magic scripts' (such as copying templates into
build/conf with oe-setup-builddir or calling oe-setup-vscode to make
the needed settings file for vscode)

In this case, neither the first function (adding to environment), nor
the template copying is actually necessary or useful;
oe-init-build-env is only ran for the vscode stuff. I'd say let's do
it directly. Opinions?

Alex
diff mbox series

Patch

diff --git a/bin/bitbake-setup b/bin/bitbake-setup
index 73f734e73..0faa5da4e 100755
--- a/bin/bitbake-setup
+++ b/bin/bitbake-setup
@@ -280,7 +280,7 @@  def setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir, update_bb_c
             logger.plain('New bitbake configuration from upstream is the same as the current one, no need to update it.')
             shutil.rmtree(bitbake_confdir)
             os.rename(backup_bitbake_confdir, bitbake_confdir)
-            return
+            return init_script
 
         logger.plain('Upstream bitbake configuration changes were found:')
         logger.plain(conf_diff)
@@ -295,7 +295,7 @@  def setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir, update_bb_c
             logger.plain(f'Leaving the upstream configuration in {upstream_bitbake_confdir}')
             os.rename(bitbake_confdir, upstream_bitbake_confdir)
             os.rename(backup_bitbake_confdir, bitbake_confdir)
-            return
+            return init_script
 
         logger.plain('Applying upstream bitbake configuration changes')
         logger.plain(f'Leaving the previous configuration in {backup_bitbake_confdir}')
@@ -324,6 +324,8 @@  The bitbake configuration files (local.conf, bblayers.conf and more) can be foun
     logger.plain("{}\n".format(fragment_note))
     logger.plain("The bitbake configuration files (local.conf, bblayers.conf and more) can be found in\n    {}/conf\n".format(bitbake_builddir))
 
+    return init_script
+
 def get_registry_config(registry_path, id):
     for root, dirs, files in os.walk(registry_path):
         for f in files:
@@ -340,8 +342,9 @@  def update_build(config, confdir, setupdir, layerdir, d, update_bb_conf="prompt"
     sources_fixed_revisions = checkout_layers(layer_config, layerdir, d)
     bitbake_config = config["bitbake-config"]
     thisdir = os.path.dirname(config["path"]) if config["type"] == 'local' else None
-    setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir, update_bb_conf)
+    init_script = setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir, update_bb_conf)
     write_sources_fixed_revisions(confdir, sources_fixed_revisions)
+    return init_script
 
 def int_input(allowed_values, prompt=''):
     n = None
@@ -511,6 +514,14 @@  def obtain_overrides(args):
 
     return overrides
 
+def verify_and_prepare_environment(init_script):
+    """
+    Source the build environment init-build-env script.
+
+    This verifies the setup is working.
+    Additionally it may initialize the environment with e.g. a .vscode/settings.json if needed.
+    """
+    bb.process.run(['sh', '-c', '. {}'.format(init_script)])
 
 def init_config(top_dir, settings, args):
     create_siteconf(top_dir, args.non_interactive, settings)
@@ -580,9 +591,12 @@  def init_config(top_dir, settings, args):
     bb.event.register("bb.build.TaskProgress", handle_task_progress, data=d)
 
     write_upstream_config(confdir, upstream_config)
-    update_build(upstream_config, confdir, setupdir, layerdir, d, update_bb_conf="yes")
+    init_script = update_build(upstream_config, confdir, setupdir, layerdir, d, update_bb_conf="yes")
     commit_config(confdir)
 
+    # Source the build environment to verify setup and prepare for VSCode if needed
+    verify_and_prepare_environment(init_script)
+
     bb.event.remove("bb.build.TaskProgress", None)
 
 def get_diff(file1, file2):
@@ -649,16 +663,18 @@  def build_status(top_dir, settings, args, d, update=False):
         logger.plain('\nConfiguration in {} has changed:\n{}'.format(setupdir, config_diff))
         if update:
             commit_config(confdir)
-            update_build(new_upstream_config, confdir, setupdir, layerdir, d,
+            init_script = update_build(new_upstream_config, confdir, setupdir, layerdir, d,
                          update_bb_conf=args.update_bb_conf)
+            verify_and_prepare_environment(init_script)
         else:
             bb.process.run('git -C {} restore config-upstream.json'.format(confdir))
         return
 
     if are_layers_changed(current_upstream_config["data"]["sources"], layerdir, d):
         if update:
-            update_build(current_upstream_config, confdir, setupdir, layerdir,
+            init_script = update_build(current_upstream_config, confdir, setupdir, layerdir,
                          d, update_bb_conf=args.update_bb_conf)
+            verify_and_prepare_environment(init_script)
         return
 
     logger.plain("\nConfiguration in {} has not changed.".format(setupdir))