buildman: Add support for building with clang

Add a -O option which allows building with clang.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2019-01-07 16:44:20 -07:00
parent ed4e933d13
commit 00beb2485f
5 changed files with 48 additions and 5 deletions

View File

@ -1046,6 +1046,16 @@ value for 'altbootcmd', but lost one for ' altbootcmd'.
The -U option uses the u-boot.env files which are produced by a build.
Building with clang
===================
To build with clang (sandbox only), use the -O option to override the
toolchain. For example:
buildman -O clang-7 --board sandbox
Other options
=============

View File

@ -229,6 +229,7 @@ class BuilderThread(threading.Thread):
config_args = ['%s_defconfig' % brd.target]
config_out = ''
args.extend(self.builder.toolchains.GetMakeArguments(brd))
args.extend(self.toolchain.MakeArgs())
# If we need to reconfigure, do that now
if do_config:

View File

@ -74,6 +74,8 @@ def ParseArgs():
parser.add_option('-o', '--output-dir', type='string',
dest='output_dir', default='..',
help='Directory where all builds happen and buildman has its workspace (default is ../)')
parser.add_option('-O', '--override-toolchain', type='string',
help="Override host toochain to use for sandbox (e.g. 'clang-7')")
parser.add_option('-Q', '--quick', action='store_true',
default=False, help='Do a rough build, with limited warning resolution')
parser.add_option('-p', '--full-path', action='store_true',

View File

@ -141,7 +141,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
no_toolchains = toolchains is None
if no_toolchains:
toolchains = toolchain.Toolchains()
toolchains = toolchain.Toolchains(options.override_toolchain)
if options.fetch_arch:
if options.fetch_arch == 'list':

View File

@ -54,9 +54,11 @@ class Toolchain:
arch: Architecture of toolchain as determined from the first
component of the filename. E.g. arm-linux-gcc becomes arm
priority: Toolchain priority (0=highest, 20=lowest)
override_toolchain: Toolchain to use for sandbox, overriding the normal
one
"""
def __init__(self, fname, test, verbose=False, priority=PRIORITY_CALC,
arch=None):
arch=None, override_toolchain=None):
"""Create a new toolchain object.
Args:
@ -68,6 +70,7 @@ class Toolchain:
"""
self.gcc = fname
self.path = os.path.dirname(fname)
self.override_toolchain = override_toolchain
# Find the CROSS_COMPILE prefix to use for U-Boot. For example,
# 'arm-linux-gnueabihf-gcc' turns into 'arm-linux-gnueabihf-'.
@ -81,6 +84,8 @@ class Toolchain:
self.arch = arch
else:
self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
if self.arch == 'sandbox' and override_toolchain:
self.gcc = override_toolchain
env = self.MakeEnvironment(False)
@ -150,11 +155,18 @@ class Toolchain:
Args:
full_path: Return the full path in CROSS_COMPILE and don't set
PATH
Returns:
Dict containing the environemnt to use. This is based on the current
environment, with changes as needed to CROSS_COMPILE, PATH and
LC_ALL.
"""
env = dict(os.environ)
wrapper = self.GetWrapper()
if full_path:
if self.override_toolchain:
# We'll use MakeArgs() to provide this
pass
elif full_path:
env['CROSS_COMPILE'] = wrapper + os.path.join(self.path, self.cross)
else:
env['CROSS_COMPILE'] = wrapper + self.cross
@ -164,6 +176,22 @@ class Toolchain:
return env
def MakeArgs(self):
"""Create the 'make' arguments for a toolchain
This is only used when the toolchain is being overridden. Since the
U-Boot Makefile sets CC and HOSTCC explicitly we cannot rely on the
environment (and MakeEnvironment()) to override these values. This
function returns the arguments to accomplish this.
Returns:
List of arguments to pass to 'make'
"""
if self.override_toolchain:
return ['HOSTCC=%s' % self.override_toolchain,
'CC=%s' % self.override_toolchain]
return []
class Toolchains:
"""Manage a list of toolchains for building U-Boot
@ -180,10 +208,11 @@ class Toolchains:
paths: List of paths to check for toolchains (may contain wildcards)
"""
def __init__(self):
def __init__(self, override_toolchain=None):
self.toolchains = {}
self.prefixes = {}
self.paths = []
self.override_toolchain = override_toolchain
self._make_flags = dict(bsettings.GetItems('make-flags'))
def GetPathList(self, show_warning=True):
@ -234,7 +263,8 @@ class Toolchains:
priority: Priority to use for this toolchain
arch: Toolchain architecture, or None if not known
"""
toolchain = Toolchain(fname, test, verbose, priority, arch)
toolchain = Toolchain(fname, test, verbose, priority, arch,
self.override_toolchain)
add_it = toolchain.ok
if toolchain.arch in self.toolchains:
add_it = (toolchain.priority <