buildman: Support a tilde to represent the home directory

It is convenient to use ~ to represent the home directory in the
settings file. Add support for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2024-11-08 08:23:48 -07:00 committed by Tom Rini
parent eae1eb0e86
commit e2ca257287
3 changed files with 73 additions and 11 deletions

View file

@ -933,12 +933,18 @@ a set of (tag, value) pairs.
For example powerpc-linux-gcc will be noted as a toolchain for 'powerpc'
and CROSS_COMPILE will be set to powerpc-linux- when using it.
The tilde character ``~`` is supported in paths, to represent the home
directory.
'[toolchain-prefix]' section
This can be used to provide the full toolchain-prefix for one or more
architectures. The full CROSS_COMPILE prefix must be provided. These
typically have a higher priority than matches in the '[toolchain]', due to
this prefix.
The tilde character ``~`` is supported in paths, to represent the home
directory.
'[toolchain-alias]' section
This converts toolchain architecture names to U-Boot names. For example,
if an x86 toolchains is called i386-linux-gcc it will not normally be

View file

@ -46,6 +46,16 @@ main: /usr/sbin
wrapper = ccache
'''
settings_data_homedir = '''
# Buildman settings file
[toolchain]
main = ~/mypath
[toolchain-prefix]
x86 = ~/mypath-x86-
'''
migration = '''===================== WARNING ======================
This board does not use CONFIG_DM. CONFIG_DM will be
compulsory starting with the v2020.01 release.
@ -1030,6 +1040,46 @@ class TestBuild(unittest.TestCase):
finally:
os.environ['PATH'] = old_path
def testHomedir(self):
"""Test using ~ in a toolchain or toolchain-prefix section"""
# Add some test settings
bsettings.setup(None)
bsettings.add_file(settings_data_homedir)
# Set up the toolchains
home = os.path.expanduser('~')
toolchains = toolchain.Toolchains()
toolchains.GetSettings()
self.assertEqual([f'{home}/mypath'], toolchains.paths)
# Check scanning
with test_util.capture_sys_output() as (stdout, _):
toolchains.Scan(verbose=True, raise_on_error=False)
lines = iter(stdout.getvalue().splitlines() + ['##done'])
self.assertEqual('Scanning for tool chains', next(lines))
self.assertEqual(f" - scanning prefix '{home}/mypath-x86-'",
next(lines))
self.assertEqual(
f"Error: No tool chain found for prefix '{home}/mypath-x86-gcc'",
next(lines))
self.assertEqual(f" - scanning path '{home}/mypath'", next(lines))
self.assertEqual(f" - looking in '{home}/mypath/.'", next(lines))
self.assertEqual(f" - looking in '{home}/mypath/bin'", next(lines))
self.assertEqual(f" - looking in '{home}/mypath/usr/bin'",
next(lines))
self.assertEqual('##done', next(lines))
# Check adding a toolchain
with test_util.capture_sys_output() as (stdout, _):
toolchains.Add('~/aarch64-linux-gcc', test=True, verbose=True)
lines = iter(stdout.getvalue().splitlines() + ['##done'])
self.assertEqual('Tool chain test: BAD', next(lines))
self.assertEqual(f'Command: {home}/aarch64-linux-gcc --version',
next(lines))
self.assertEqual('', next(lines))
self.assertEqual('', next(lines))
self.assertEqual('##done', next(lines))
if __name__ == "__main__":
unittest.main()

View file

@ -65,12 +65,13 @@ class Toolchain:
"""Create a new toolchain object.
Args:
fname: Filename of the gcc component
fname: Filename of the gcc component, possibly with ~ or $HOME in it
test: True to run the toolchain to test it
verbose: True to print out the information
priority: Priority to use for this toolchain, or PRIORITY_CALC to
calculate it
"""
fname = os.path.expanduser(fname)
self.gcc = fname
self.path = os.path.dirname(fname)
self.override_toolchain = override_toolchain
@ -109,7 +110,7 @@ class Toolchain:
self.priority))
else:
print('BAD')
print('Command: ', cmd)
print(f"Command: {' '.join(cmd)}")
print(result.stdout)
print(result.stderr)
else:
@ -296,10 +297,11 @@ class Toolchains:
paths = []
for name, value in toolchains:
fname = os.path.expanduser(value)
if '*' in value:
paths += glob.glob(value)
paths += glob.glob(fname)
else:
paths.append(value)
paths.append(fname)
return paths
def GetSettings(self, show_warning=True):
@ -373,7 +375,7 @@ class Toolchains:
pathname_list.append(pathname)
return pathname_list
def Scan(self, verbose):
def Scan(self, verbose, raise_on_error=True):
"""Scan for available toolchains and select the best for each arch.
We look for all the toolchains we can file, figure out the
@ -385,11 +387,12 @@ class Toolchains:
"""
if verbose: print('Scanning for tool chains')
for name, value in self.prefixes:
if verbose: print(" - scanning prefix '%s'" % value)
if os.path.exists(value):
self.Add(value, True, verbose, PRIORITY_FULL_PREFIX, name)
fname = os.path.expanduser(value)
if verbose: print(" - scanning prefix '%s'" % fname)
if os.path.exists(fname):
self.Add(fname, True, verbose, PRIORITY_FULL_PREFIX, name)
continue
fname = value + 'gcc'
fname += 'gcc'
if os.path.exists(fname):
self.Add(fname, True, verbose, PRIORITY_PREFIX_GCC, name)
continue
@ -397,8 +400,11 @@ class Toolchains:
for f in fname_list:
self.Add(f, True, verbose, PRIORITY_PREFIX_GCC_PATH, name)
if not fname_list:
raise ValueError("No tool chain found for prefix '%s'" %
value)
msg = f"No tool chain found for prefix '{fname}'"
if raise_on_error:
raise ValueError(msg)
else:
print(f'Error: {msg}')
for path in self.paths:
if verbose: print(" - scanning path '%s'" % path)
fnames = self.ScanPath(path, verbose)