[PATCH 3/4] buildman: Support disabling LTO
Simon Glass
sjg at chromium.org
Mon Feb 20 03:41:54 CET 2023
This cuts down build performance considerably and is not always needed,
when checking for build errors, etc.
Add a flag to disable it.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
tools/buildman/builder.py | 5 ++++-
tools/buildman/builderthread.py | 2 ++
tools/buildman/buildman.rst | 14 ++++++++++++++
tools/buildman/cmdline.py | 2 ++
tools/buildman/control.py | 2 +-
tools/buildman/func_test.py | 25 +++++++++++++++++++++----
6 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py
index c2a69027f88..107086cc0e5 100644
--- a/tools/buildman/builder.py
+++ b/tools/buildman/builder.py
@@ -194,6 +194,7 @@ class Builder:
work_in_output: Use the output directory as the work directory and
don't write to a separate output directory.
thread_exceptions: List of exceptions raised by thread jobs
+ no_lto (bool): True to set the NO_LTO flag when building
Private members:
_base_board_dict: Last-summarised Dict of boards
@@ -253,7 +254,7 @@ class Builder:
config_only=False, squash_config_y=False,
warnings_as_errors=False, work_in_output=False,
test_thread_exceptions=False, adjust_cfg=None,
- allow_missing=False):
+ allow_missing=False, no_lto=False):
"""Create a new Builder object
Args:
@@ -292,6 +293,7 @@ class Builder:
C=val to set the value of C (val must have quotes if C is
a string Kconfig
allow_missing: Run build with BINMAN_ALLOW_MISSING=1
+ no_lto (bool): True to set the NO_LTO flag when building
"""
self.toolchains = toolchains
@@ -331,6 +333,7 @@ class Builder:
self.adjust_cfg = adjust_cfg
self.allow_missing = allow_missing
self._ide = False
+ self.no_lto = no_lto
if not self.squash_config_y:
self.config_filenames += EXTRA_CONFIG_FILENAMES
diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py
index 7ba9a856dd5..dae3d4ab9ff 100644
--- a/tools/buildman/builderthread.py
+++ b/tools/buildman/builderthread.py
@@ -255,6 +255,8 @@ class BuilderThread(threading.Thread):
args.append('KCFLAGS=-Werror')
if self.builder.allow_missing:
args.append('BINMAN_ALLOW_MISSING=1')
+ if self.builder.no_lto:
+ args.append('NO_LTO=1')
config_args = ['%s_defconfig' % brd.target]
config_out = ''
args.extend(self.builder.toolchains.GetMakeArguments(brd))
diff --git a/tools/buildman/buildman.rst b/tools/buildman/buildman.rst
index 11c72141791..800b83a89de 100644
--- a/tools/buildman/buildman.rst
+++ b/tools/buildman/buildman.rst
@@ -1123,6 +1123,20 @@ toolchain. For example:
buildman -O clang-7 --board sandbox
+Building without LTO
+--------------------
+
+Link-time optimisation (LTO) is designed to reduce code size by globally
+optimising the U-Boot build. Unfortunately this can dramatically slow down
+builds. This is particularly noticeable when running a lot of builds.
+
+Use the -L (--no-lto) flag to disable LTO.
+
+.. code-block:: bash
+
+ buildman -L --board sandbox
+
+
Doing a simple build
--------------------
diff --git a/tools/buildman/cmdline.py b/tools/buildman/cmdline.py
index c485994e9fe..409013671be 100644
--- a/tools/buildman/cmdline.py
+++ b/tools/buildman/cmdline.py
@@ -71,6 +71,8 @@ def ParseArgs():
default=False, help="Don't convert y to 1 in configs")
parser.add_option('-l', '--list-error-boards', action='store_true',
default=False, help='Show a list of boards next to each error/warning')
+ parser.add_option('-L', '--no-lto', action='store_true',
+ default=False, help='Disable Link-time Optimisation (LTO) for builds')
parser.add_option('--list-tool-chains', action='store_true', default=False,
help='List available tool chains (use -v to see probing detail)')
parser.add_option('-m', '--mrproper', action='store_true',
diff --git a/tools/buildman/control.py b/tools/buildman/control.py
index 87e7d0e2012..13a462ae595 100644
--- a/tools/buildman/control.py
+++ b/tools/buildman/control.py
@@ -351,7 +351,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, brds=None,
work_in_output=options.work_in_output,
test_thread_exceptions=test_thread_exceptions,
adjust_cfg=adjust_cfg,
- allow_missing=allow_missing)
+ allow_missing=allow_missing, no_lto=options.no_lto)
builder.force_config_on_failure = not options.quick
if make_func:
builder.do_make = make_func
diff --git a/tools/buildman/func_test.py b/tools/buildman/func_test.py
index 799c609446e..6d1557293f0 100644
--- a/tools/buildman/func_test.py
+++ b/tools/buildman/func_test.py
@@ -724,15 +724,32 @@ Some images are invalid'''
self.assertEqual(False,
control.get_allow_missing(False, True, 2, True))
- def testCmdFile(self):
- """Test that the -cmd-out file is produced"""
- self._RunControl('-o', self._output_dir)
+ def check_command(self, *extra_args):
+ """Run a command with the extra arguments and return the commands used
+
+ Args:
+ extra_args (list of str): List of extra arguments
+
+ Returns:
+ list of str: Lines returned in the out-cmd file
+ """
+ self._RunControl('-o', self._output_dir, *extra_args)
board0_dir = os.path.join(self._output_dir, 'current', 'board0')
self.assertTrue(os.path.exists(os.path.join(board0_dir, 'done')))
cmd_fname = os.path.join(board0_dir, 'out-cmd')
self.assertTrue(os.path.exists(cmd_fname))
data = tools.read_file(cmd_fname)
- lines = data.splitlines()
+ return data.splitlines()
+
+ def testCmdFile(self):
+ """Test that the -cmd-out file is produced"""
+ lines = self.check_command()
self.assertEqual(2, len(lines))
self.assertRegex(lines[0], b'make O=/.*board0_defconfig')
self.assertRegex(lines[0], b'make O=/.*-s.*')
+
+ def testNoLto(self):
+ """Test that the --no-lto flag works"""
+ lines = self.check_command('-L')
+ self.assertIn(b'NO_LTO=1', lines[0])
+
--
2.39.2.637.g21b0678d19-goog
More information about the U-Boot
mailing list