diff mbox series

[2/2] buildman: Provide an argument to the -R option

Message ID 20230622114426.2114584-2-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show
Series [1/2] buildman: Fix verboose typo and add comment | expand

Commit Message

Simon Glass June 22, 2023, 11:44 a.m. UTC
Allow writing the file to a selected location, since otherwise this is
controlled by the buildman configuration, so cannot be determined by the
caller.

Fixes: https://source.denx.de/u-boot/u-boot/-/issues/17
Signed-off-by: Simon Glass <sjg@chromium.org>
---

 .azure-pipelines.yml        |  2 +-
 .gitlab-ci.yml              |  2 +-
 tools/buildman/buildman.rst |  7 ++++---
 tools/buildman/cmdline.py   |  2 +-
 tools/buildman/control.py   |  2 ++
 tools/buildman/func_test.py | 24 ++++++++++++++++++------
 6 files changed, 27 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
index 3c1846a5bc3d..4d3c588ee020 100644
--- a/.azure-pipelines.yml
+++ b/.azure-pipelines.yml
@@ -123,7 +123,7 @@  stages:
       options: $(container_option)
     steps:
       - script: |
-          ./tools/buildman/buildman -R
+          ./tools/buildman/buildman -R -
 
   - job: tools_only
     displayName: 'Ensure host tools build'
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e6c6ab3586e1..336db7a7448f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -184,7 +184,7 @@  sloccount:
 Check for configs without MAINTAINERS entry:
   stage: testsuites
   script:
-    - ./tools/buildman/buildman -R
+    - ./tools/buildman/buildman -R -
 
 # Ensure host tools build
 Build tools-only:
diff --git a/tools/buildman/buildman.rst b/tools/buildman/buildman.rst
index c8b0db3d8b9c..b28aea477dfe 100644
--- a/tools/buildman/buildman.rst
+++ b/tools/buildman/buildman.rst
@@ -1307,9 +1307,10 @@  Using boards.cfg
 
 This file is no-longer needed by buildman but it is still generated in the
 working directory. This helps avoid a delay on every build, since scanning all
-the Kconfig files takes a few seconds. Use the -R flag to force regeneration
-of the file - in that case buildman exits after writing the file. with exit code
-2 if there was an error in the maintainer files.
+the Kconfig files takes a few seconds. Use the `-R <filename>` flag to force
+regeneration of the file - in that case buildman exits after writing the file
+with exit code 2 if there was an error in the maintainer files. To use the
+default filename, use a hyphen, i.e. `-R -`.
 
 You should use 'buildman -nv <criteria>' instead of greoing the boards.cfg file,
 since it may be dropped altogether in future.
diff --git a/tools/buildman/cmdline.py b/tools/buildman/cmdline.py
index a9cda2495727..ea43685e394d 100644
--- a/tools/buildman/cmdline.py
+++ b/tools/buildman/cmdline.py
@@ -104,7 +104,7 @@  def ParseArgs():
           default=False, help="Use an O= (output) directory per board rather than per thread")
     parser.add_option('-r', '--reproducible-builds', action='store_true',
           help='Set SOURCE_DATE_EPOCH=0 to suuport a reproducible build')
-    parser.add_option('-R', '--regen-board-list', action='store_true',
+    parser.add_option('-R', '--regen-board-list', type='string',
           help='Force regeneration of the list of boards, like the old boards.cfg file')
     parser.add_option('-s', '--summary', action='store_true',
           default=False, help='Show a build summary')
diff --git a/tools/buildman/control.py b/tools/buildman/control.py
index 09a11f25b3f3..b8286e185411 100644
--- a/tools/buildman/control.py
+++ b/tools/buildman/control.py
@@ -207,6 +207,8 @@  def DoBuildman(options, args, toolchains=None, make_func=None, brds=None,
         if not os.path.exists(options.output_dir):
             os.makedirs(options.output_dir)
         board_file = os.path.join(options.output_dir, 'boards.cfg')
+        if options.regen_board_list and options.regen_board_list != '-':
+            board_file = options.regen_board_list
 
         brds = boards.Boards()
         ok = brds.ensure_board_list(board_file,
diff --git a/tools/buildman/func_test.py b/tools/buildman/func_test.py
index ebd78f225e1a..08b2714b7be2 100644
--- a/tools/buildman/func_test.py
+++ b/tools/buildman/func_test.py
@@ -225,29 +225,33 @@  class TestFunctional(unittest.TestCase):
         return command.run_pipe([[self._buildman_pathname] + list(args)],
                 capture=True, capture_stderr=True)
 
-    def _RunControl(self, *args, brds=None, clean_dir=False,
-                    test_thread_exceptions=False):
+    def _RunControl(self, *args, brds=False, clean_dir=False,
+                    test_thread_exceptions=False, get_builder=True):
         """Run buildman
 
         Args:
             args: List of arguments to pass
-            brds: Boards object
+            brds: Boards object, or False to pass self._boards, or None to pass
+                None
             clean_dir: Used for tests only, indicates that the existing output_dir
                 should be removed before starting the build
             test_thread_exceptions: Uses for tests only, True to make the threads
                 raise an exception instead of reporting their result. This simulates
                 a failure in the code somewhere
+            get_builder (bool): Set self._builder to the resulting builder
 
         Returns:
             result code from buildman
         """
         sys.argv = [sys.argv[0]] + list(args)
         options, args = cmdline.ParseArgs()
+        if brds == False:
+            brds = self._boards
         result = control.DoBuildman(options, args, toolchains=self._toolchains,
-                make_func=self._HandleMake, brds=brds or self._boards,
-                clean_dir=clean_dir,
+                make_func=self._HandleMake, brds=brds, clean_dir=clean_dir,
                 test_thread_exceptions=test_thread_exceptions)
-        self._builder = control.builder
+        if get_builder:
+            self._builder = control.builder
         return result
 
     def testFullHelp(self):
@@ -779,3 +783,11 @@  Some images are invalid'''
 CONFIG_LOCALVERSION=y
 ''', cfg_data)
         self.assertIn('Not dropping LOCALVERSION_AUTO', stdout.getvalue())
+
+    def testRegenBoards(self):
+        """Test that we can regenerate the boards.cfg file"""
+        outfile = os.path.join(self._output_dir, 'test-boards.cfg')
+        if os.path.exists(outfile):
+            os.remove(outfile)
+        result = self._RunControl('-R', outfile, brds=None, get_builder=False)
+        self.assertTrue(os.path.exists(outfile))