buildman: Add an option to use the full tool chain path

In some cases there may be multiple toolchains with the same name in the
path. Provide an option to use the full path in the CROSS_COMPILE
environment variable.

Note: Wolfgang mentioned that this is dangerous since in some cases there
may be other tools on the path that are needed. So this is set up as an
option, not the default. I will need test confirmation (i.e. that this
commit fixes a real problem) before merging it.

Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Steve Rae <srae@broadcom.com>
This commit is contained in:
Simon Glass 2014-12-01 17:34:00 -07:00
parent f210b58734
commit bb1501f2c2
5 changed files with 25 additions and 10 deletions

View File

@ -175,7 +175,7 @@ class Builder:
def __init__(self, toolchains, base_dir, git_dir, num_threads, num_jobs, def __init__(self, toolchains, base_dir, git_dir, num_threads, num_jobs,
gnu_make='make', checkout=True, show_unknown=True, step=1, gnu_make='make', checkout=True, show_unknown=True, step=1,
no_subdirs=False): no_subdirs=False, full_path=False):
"""Create a new Builder object """Create a new Builder object
Args: Args:
@ -189,6 +189,10 @@ class Builder:
This is used for testing. This is used for testing.
show_unknown: Show unknown boards (those not built) in summary show_unknown: Show unknown boards (those not built) in summary
step: 1 to process every commit, n to process every nth commit step: 1 to process every commit, n to process every nth commit
no_subdirs: Don't create subdirectories when building current
source for a single board
full_path: Return the full path in CROSS_COMPILE and don't set
PATH
""" """
self.toolchains = toolchains self.toolchains = toolchains
self.base_dir = base_dir self.base_dir = base_dir
@ -215,6 +219,7 @@ class Builder:
self.in_tree = False self.in_tree = False
self._error_lines = 0 self._error_lines = 0
self.no_subdirs = no_subdirs self.no_subdirs = no_subdirs
self.full_path = full_path
self.col = terminal.Color() self.col = terminal.Color()

View File

@ -177,7 +177,7 @@ class BuilderThread(threading.Thread):
commit = 'current' commit = 'current'
# Set up the environment and command line # Set up the environment and command line
env = self.toolchain.MakeEnvironment() env = self.toolchain.MakeEnvironment(self.builder.full_path)
Mkdir(out_dir) Mkdir(out_dir)
args = [] args = []
cwd = work_dir cwd = work_dir
@ -284,7 +284,7 @@ class BuilderThread(threading.Thread):
print >>fd, 'path', result.toolchain.path print >>fd, 'path', result.toolchain.path
# Write out the image and function size information and an objdump # Write out the image and function size information and an objdump
env = result.toolchain.MakeEnvironment() env = result.toolchain.MakeEnvironment(self.builder.full_path)
lines = [] lines = []
for fname in ['u-boot', 'spl/u-boot-spl']: for fname in ['u-boot', 'spl/u-boot-spl']:
cmd = ['%snm' % self.toolchain.cross, '--size-sort', fname] cmd = ['%snm' % self.toolchain.cross, '--size-sort', fname]

View File

@ -62,6 +62,8 @@ def ParseArgs():
help='Directory where all builds happen and buildman has its workspace (default is ../)') help='Directory where all builds happen and buildman has its workspace (default is ../)')
parser.add_option('-Q', '--quick', action='store_true', parser.add_option('-Q', '--quick', action='store_true',
default=False, help='Do a rough build, with limited warning resolution') default=False, help='Do a rough build, with limited warning resolution')
parser.add_option('-p', '--full-path', action='store_true',
default=False, help="Use full toolchain path in CROSS_COMPILE")
parser.add_option('-s', '--summary', action='store_true', parser.add_option('-s', '--summary', action='store_true',
default=False, help='Show a build summary') default=False, help='Show a build summary')
parser.add_option('-S', '--show-sizes', action='store_true', parser.add_option('-S', '--show-sizes', action='store_true',

View File

@ -232,7 +232,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
builder = Builder(toolchains, output_dir, options.git_dir, builder = Builder(toolchains, output_dir, options.git_dir,
options.threads, options.jobs, gnu_make=gnu_make, checkout=True, options.threads, options.jobs, gnu_make=gnu_make, checkout=True,
show_unknown=options.show_unknown, step=options.step, show_unknown=options.show_unknown, step=options.step,
no_subdirs=options.no_subdirs) no_subdirs=options.no_subdirs, full_path=options.full_path)
builder.force_config_on_failure = not options.quick builder.force_config_on_failure = not options.quick
if make_func: if make_func:
builder.do_make = make_func builder.do_make = make_func

View File

@ -41,7 +41,7 @@ class Toolchain:
pos = self.cross.find('-') pos = self.cross.find('-')
self.arch = self.cross[:pos] if pos != -1 else 'sandbox' self.arch = self.cross[:pos] if pos != -1 else 'sandbox'
env = self.MakeEnvironment() env = self.MakeEnvironment(False)
# As a basic sanity check, run the C compiler with --version # As a basic sanity check, run the C compiler with --version
cmd = [fname, '--version'] cmd = [fname, '--version']
@ -81,15 +81,23 @@ class Toolchain:
return prio return prio
return prio return prio
def MakeEnvironment(self): def MakeEnvironment(self, full_path):
"""Returns an environment for using the toolchain. """Returns an environment for using the toolchain.
Thie takes the current environment, adds CROSS_COMPILE and Thie takes the current environment and adds CROSS_COMPILE so that
augments PATH so that the toolchain will operate correctly. the tool chain will operate correctly.
Args:
full_path: Return the full path in CROSS_COMPILE and don't set
PATH
""" """
env = dict(os.environ) env = dict(os.environ)
env['CROSS_COMPILE'] = self.cross if full_path:
env['PATH'] = self.path + ':' + env['PATH'] env['CROSS_COMPILE'] = os.path.join(self.path, self.cross)
else:
env['CROSS_COMPILE'] = self.cross
env['PATH'] = self.path + ':' + env['PATH']
return env return env