buildman: Allow the toolchain priority to be specified

At present the priority of a toolchain is calculated from its filename based
on hard-coded rules. Allow it to be specified by the caller. We will use
this in a later patch. Also display the priority and provide a message when
it is overriden by another toolchain of higher priority.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
Simon Glass 2016-03-06 19:45:37 -07:00
parent ad24ebace1
commit ff690df9fc

View File

@ -14,6 +14,8 @@ import urllib2
import bsettings
import command
PRIORITY_CALC = 0
# Simple class to collect links from a page
class MyHTMLParser(HTMLParser):
def __init__(self, arch):
@ -50,14 +52,17 @@ class Toolchain:
cross: Cross compile string, e.g. 'arm-linux-'
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)
"""
def __init__(self, fname, test, verbose=False):
def __init__(self, fname, test, verbose=False, priority=PRIORITY_CALC):
"""Create a new toolchain object.
Args:
fname: Filename of the gcc component
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
"""
self.gcc = fname
self.path = os.path.dirname(fname)
@ -76,6 +81,10 @@ class Toolchain:
# As a basic sanity check, run the C compiler with --version
cmd = [fname, '--version']
if priority == PRIORITY_CALC:
self.priority = self.GetPriority(fname)
else:
self.priority = priority
if test:
result = command.RunPipe([cmd], capture=True, env=env,
raise_on_error=False)
@ -83,7 +92,7 @@ class Toolchain:
if verbose:
print 'Tool chain test: ',
if self.ok:
print 'OK'
print 'OK, priority %d' % self.priority
else:
print 'BAD'
print 'Command: ', cmd
@ -91,7 +100,6 @@ class Toolchain:
print result.stderr
else:
self.ok = True
self.priority = self.GetPriority(fname)
def GetPriority(self, fname):
"""Return the priority of the toolchain.
@ -102,15 +110,15 @@ class Toolchain:
Args:
fname: Filename of toolchain
Returns:
Priority of toolchain, 0=highest, 20=lowest.
Priority of toolchain, PRIORITY_CALC=highest, 20=lowest.
"""
priority_list = ['-elf', '-unknown-linux-gnu', '-linux',
'-none-linux-gnueabi', '-uclinux', '-none-eabi',
'-gentoo-linux-gnu', '-linux-gnueabi', '-le-linux', '-uclinux']
for prio in range(len(priority_list)):
if priority_list[prio] in fname:
return prio
return prio
return PRIORITY_CALC + prio
return PRIORITY_CALC + prio
def MakeEnvironment(self, full_path):
"""Returns an environment for using the toolchain.
@ -171,7 +179,7 @@ class Toolchains:
def GetSettings(self):
self.paths += self.GetPathList()
def Add(self, fname, test=True, verbose=False):
def Add(self, fname, test=True, verbose=False, priority=PRIORITY_CALC):
"""Add a toolchain to our list
We select the given toolchain as our preferred one for its
@ -180,14 +188,20 @@ class Toolchains:
Args:
fname: Filename of toolchain's gcc driver
test: True to run the toolchain to test it
priority: Priority to use for this toolchain
"""
toolchain = Toolchain(fname, test, verbose)
toolchain = Toolchain(fname, test, verbose, priority)
add_it = toolchain.ok
if toolchain.arch in self.toolchains:
add_it = (toolchain.priority <
self.toolchains[toolchain.arch].priority)
if add_it:
self.toolchains[toolchain.arch] = toolchain
elif verbose:
print ("Toolchain '%s' at priority %d will be ignored because "
"another toolchain for arch '%s' has priority %d" %
(toolchain.gcc, toolchain.priority, toolchain.arch,
self.toolchains[toolchain.arch].priority))
def ScanPath(self, path, verbose):
"""Scan a path for a valid toolchain