diff mbox series

[1/2] bitbake-setup: update: add a --update-bb-conf option

Message ID 20251114-bitbake-setup-conf-updates-v1-1-990583d8251b@bootlin.com
State New
Headers show
Series bitbake-setup: update: add a --update-bb-conf option | expand

Commit Message

Antonin Godard Nov. 14, 2025, 4:44 p.m. UTC
Add a --update-bb-conf option that can be used to choose whether to
update the BitBake configuration files (local.conf, bblayers.conf, etc.)
in the conf/ directory.

The argument can take up to three values:

-  ``prompt`` (default): ask the user whether to update.
-  ``yes``: update the configuration files.
-  ``no``: don't update the configuration files.

Signed-off-by: Antonin Godard <antonin.godard@bootlin.com>
---
 bin/bitbake-setup                                  | 28 ++++++++++++++++------
 .../bitbake-user-manual-environment-setup.rst      |  8 +++++++
 lib/bb/tests/setup.py                              |  6 ++---
 3 files changed, 32 insertions(+), 10 deletions(-)

Comments

Alexander Kanavin Nov. 14, 2025, 7:20 p.m. UTC | #1
On Fri, 14 Nov 2025 at 17:44, Antonin Godard via
lists.yoctoproject.org
<antonin.godard=bootlin.com@lists.yoctoproject.org> wrote:
> +    if update_bb_conf == "prompt":
> +        print(f'bitbake-setup can update the BitBake configuration in {setupdir}/conf')
> +        print('This means updating the local.conf, bblayers.conf, and other files in this directory.')
> +        print('A backup will be created for the existing files.')
> +        y_or_n = input('Proceed to update? (y/N): ')
> +        if y_or_n == 'y':
> +            update_bb_conf = 'yes'
> +
> +    if update_bb_conf == "yes":
> +        setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir)

I don't think this is the proper way to implement the feature. Even if
the user answers no, they should still get the new updated config that
they can inspect and integrate into their existing one, so rather than
ask the question here, it should be asked *inside*
setup_bitbake_build(), and only if that function determines that a
config already exists. Then, depending on the answer, it either
renames the old config, and writes a new one (current behavior), or
leaves the current one as it is, and writes the new config into a
newly made separate directory. Then there's existing code to compare
and diff the directories, so if they turn out identical, the redundant
copy is deleted.

Alex
Alexander Kanavin Nov. 14, 2025, 7:37 p.m. UTC | #2
On Fri, 14 Nov 2025 at 20:20, Alexander Kanavin via
lists.openembedded.org <alex.kanavin=gmail.com@lists.openembedded.org>
wrote:

> I don't think this is the proper way to implement the feature. Even if
> the user answers no, they should still get the new updated config that
> they can inspect and integrate into their existing one, so rather than
> ask the question here, it should be asked *inside*
> setup_bitbake_build(), and only if that function determines that a
> config already exists. Then, depending on the answer, it either
> renames the old config, and writes a new one (current behavior), or
> leaves the current one as it is, and writes the new config into a
> newly made separate directory. Then there's existing code to compare
> and diff the directories, so if they turn out identical, the redundant
> copy is deleted.

Come to think of it, we could do even better:
- write the new config into a temporary directory
- check if a config exists, move into place if it doesn't
- check if a new config is same as existing one, remove the unneeded
new copy if so
- if it is not the same, then print the diff, and ask the user if they
would like the new config to replace the old one (if the answer is not
already given on the command line)
- with either 'yes' or 'no' both old and new configs should be
preserved for further inspection

Alex
diff mbox series

Patch

diff --git a/bin/bitbake-setup b/bin/bitbake-setup
index 5a9dde5c92..3e711f5cd7 100755
--- a/bin/bitbake-setup
+++ b/bin/bitbake-setup
@@ -291,7 +291,7 @@  def get_registry_config(registry_path, id):
                 return os.path.join(root, f)
     raise Exception("Unable to find {} in available configurations; use 'list' sub-command to see what is available".format(id))
 
-def update_build(config, confdir, setupdir, layerdir, d):
+def update_build(config, confdir, setupdir, layerdir, d, update_bb_conf="prompt"):
     layer_config = copy.deepcopy(config["data"]["sources"])
     layer_overrides = config["source-overrides"]["sources"]
     for k,v in layer_overrides.items():
@@ -300,7 +300,18 @@  def update_build(config, confdir, setupdir, layerdir, d):
     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)
+
+    if update_bb_conf == "prompt":
+        print(f'bitbake-setup can update the BitBake configuration in {setupdir}/conf')
+        print('This means updating the local.conf, bblayers.conf, and other files in this directory.')
+        print('A backup will be created for the existing files.')
+        y_or_n = input('Proceed to update? (y/N): ')
+        if y_or_n == 'y':
+            update_bb_conf = 'yes'
+
+    if update_bb_conf == "yes":
+        setup_bitbake_build(bitbake_config, layerdir, setupdir, thisdir)
+
     write_sources_fixed_revisions(confdir, sources_fixed_revisions)
 
 def int_input(allowed_values):
@@ -514,7 +525,7 @@  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_build(upstream_config, confdir, setupdir, layerdir, d, update_bb_conf="yes")
     commit_config(confdir)
 
     bb.event.remove("bb.build.TaskProgress", None)
@@ -556,7 +567,7 @@  def are_layers_changed(layers, layerdir, d):
 
     return changed
 
-def build_status(top_dir, settings, args, d, update=False):
+def build_status(top_dir, settings, args, d, update=False, update_bb_conf="prompt"):
     setupdir = args.setup_dir
 
     confdir = os.path.join(setupdir, "config")
@@ -576,21 +587,23 @@  def build_status(top_dir, settings, args, d, update=False):
     if config_diff:
         print('\nConfiguration in {} has changed:\n{}'.format(setupdir, config_diff))
         if update:
+            update_build(new_upstream_config, confdir, setupdir, layerdir, d,
+                         update_bb_conf=update_bb_conf)
             commit_config(confdir)
-            update_build(new_upstream_config, confdir, setupdir, layerdir, d)
         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, d)
+            update_build(current_upstream_config, confdir, setupdir, layerdir, d,
+                         update_bb_conf=update_bb_conf)
         return
 
     print("\nConfiguration in {} has not changed.".format(setupdir))
 
 def build_update(top_dir, settings, args, d):
-    build_status(top_dir, settings, args, d, update=True)
+    build_status(top_dir, settings, args, d, update=True, update_bb_conf=args.update_bb_conf)
 
 def do_fetch(fetcher, dir):
     # git fetcher simply dumps git output to stdout; in bitbake context that is redirected to temp/log.do_fetch
@@ -844,6 +857,7 @@  def main():
 
     parser_update = subparsers.add_parser('update', help='Update a setup to be in sync with configuration')
     add_setup_dir_arg(parser_update)
+    parser_update.add_argument('--update-bb-conf', choices=['prompt', 'yes', 'no'], default='prompt', help='Update bitbake configuration files (bblayers.conf, local.conf) (default: prompt)')
     parser_update.set_defaults(func=build_update)
 
     parser_install_buildtools = subparsers.add_parser('install-buildtools', help='Install buildtools which can help fulfil missing or incorrect dependencies on the host machine')
diff --git a/doc/bitbake-user-manual/bitbake-user-manual-environment-setup.rst b/doc/bitbake-user-manual/bitbake-user-manual-environment-setup.rst
index 3193952972..dd8d08877f 100644
--- a/doc/bitbake-user-manual/bitbake-user-manual-environment-setup.rst
+++ b/doc/bitbake-user-manual/bitbake-user-manual-environment-setup.rst
@@ -401,6 +401,14 @@  status of the :term:`Setup` before updating it.
 
 In addition, the command can take the following arguments:
 
+-  ``--update-bb-conf``: whether to update the :term:`BitBake Build`
+   configuration (``local.conf``, ``bblayers.conf``, etc.). This argument can
+   take up to three values:
+
+   -  ``prompt`` (default): ask the user whether to update.
+   -  ``yes``: update the configuration files.
+   -  ``no``: don't update the configuration files.
+
 -  ``--setup-dir``: path to the :term:`Setup` to update. Not required if the
    command is invoked from an initialized BitBake environment that contains
    :term:`BBPATH`.
diff --git a/lib/bb/tests/setup.py b/lib/bb/tests/setup.py
index 46834f361e..58049c8c7a 100644
--- a/lib/bb/tests/setup.py
+++ b/lib/bb/tests/setup.py
@@ -310,7 +310,7 @@  print("BBPATH is {{}}".format(os.environ["BBPATH"]))
                 os.environ['BBPATH'] = os.path.join(setuppath, 'build')
                 out = self.runbbsetup("status")
                 self.assertIn("Configuration in {} has not changed".format(setuppath), out[0])
-                out = self.runbbsetup("update")
+                out = self.runbbsetup("update --update-bb-conf='yes'")
                 self.assertIn("Configuration in {} has not changed".format(setuppath), out[0])
 
         # install buildtools
@@ -331,7 +331,7 @@  print("BBPATH is {{}}".format(os.environ["BBPATH"]))
             os.environ['BBPATH'] = os.path.join(setuppath, 'build')
             out = self.runbbsetup("status")
             self.assertIn("Layer repository file://{} checked out into {}/layers/test-repo updated revision master from".format(self.testrepopath, setuppath), out[0])
-            out = self.runbbsetup("update")
+            out = self.runbbsetup("update --update-bb-conf='yes'")
             if c in ('gadget', 'gizmo'):
                 self.assertIn("Existing bitbake configuration directory renamed to {}/build/conf-backup.".format(setuppath), out[0])
                 self.assertIn('-{}+{}'.format(prev_test_file_content, test_file_content), out[0])
@@ -355,7 +355,7 @@  print("BBPATH is {{}}".format(os.environ["BBPATH"]))
             out = self.runbbsetup("status")
             self.assertIn("Configuration in {} has changed:".format(setuppath), out[0])
             self.assertIn('-                    "rev": "master"\n+                    "rev": "another-branch"', out[0])
-            out = self.runbbsetup("update")
+            out = self.runbbsetup("update --update-bb-conf='yes'")
             if c in ('gadget', 'gizmo'):
                 self.assertIn("Existing bitbake configuration directory renamed to {}/build/conf-backup.".format(setuppath), out[0])
                 self.assertIn('-{}+{}'.format(prev_test_file_content, test_file_content), out[0])