|
@@ -3,6 +3,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
#
|
|
#
|
|
|
|
|
|
|
|
+import re
|
|
import glob
|
|
import glob
|
|
import os
|
|
import os
|
|
|
|
|
|
@@ -97,12 +98,18 @@ class Toolchains:
|
|
def __init__(self):
|
|
def __init__(self):
|
|
self.toolchains = {}
|
|
self.toolchains = {}
|
|
self.paths = []
|
|
self.paths = []
|
|
- for name, value in bsettings.GetItems('toolchain'):
|
|
|
|
|
|
+ toolchains = bsettings.GetItems('toolchain')
|
|
|
|
+ if not toolchains:
|
|
|
|
+ print ("Warning: No tool chains - please add a [toolchain] section"
|
|
|
|
+ " to your buildman config file %s. See README for details" %
|
|
|
|
+ config_fname)
|
|
|
|
+
|
|
|
|
+ for name, value in toolchains:
|
|
if '*' in value:
|
|
if '*' in value:
|
|
self.paths += glob.glob(value)
|
|
self.paths += glob.glob(value)
|
|
else:
|
|
else:
|
|
self.paths.append(value)
|
|
self.paths.append(value)
|
|
-
|
|
|
|
|
|
+ self._make_flags = dict(bsettings.GetItems('make-flags'))
|
|
|
|
|
|
def Add(self, fname, test=True, verbose=False):
|
|
def Add(self, fname, test=True, verbose=False):
|
|
"""Add a toolchain to our list
|
|
"""Add a toolchain to our list
|
|
@@ -167,3 +174,73 @@ class Toolchains:
|
|
if not arch in self.toolchains:
|
|
if not arch in self.toolchains:
|
|
raise ValueError, ("No tool chain found for arch '%s'" % arch)
|
|
raise ValueError, ("No tool chain found for arch '%s'" % arch)
|
|
return self.toolchains[arch]
|
|
return self.toolchains[arch]
|
|
|
|
+
|
|
|
|
+ def ResolveReferences(self, var_dict, args):
|
|
|
|
+ """Resolve variable references in a string
|
|
|
|
+
|
|
|
|
+ This converts ${blah} within the string to the value of blah.
|
|
|
|
+ This function works recursively.
|
|
|
|
+
|
|
|
|
+ Args:
|
|
|
|
+ var_dict: Dictionary containing variables and their values
|
|
|
|
+ args: String containing make arguments
|
|
|
|
+ Returns:
|
|
|
|
+ Resolved string
|
|
|
|
+
|
|
|
|
+ >>> bsettings.Setup()
|
|
|
|
+ >>> tcs = Toolchains()
|
|
|
|
+ >>> tcs.Add('fred', False)
|
|
|
|
+ >>> var_dict = {'oblique' : 'OBLIQUE', 'first' : 'fi${second}rst', \
|
|
|
|
+ 'second' : '2nd'}
|
|
|
|
+ >>> tcs.ResolveReferences(var_dict, 'this=${oblique}_set')
|
|
|
|
+ 'this=OBLIQUE_set'
|
|
|
|
+ >>> tcs.ResolveReferences(var_dict, 'this=${oblique}_set${first}nd')
|
|
|
|
+ 'this=OBLIQUE_setfi2ndrstnd'
|
|
|
|
+ """
|
|
|
|
+ re_var = re.compile('(\$\{[a-z0-9A-Z]{1,}\})')
|
|
|
|
+
|
|
|
|
+ while True:
|
|
|
|
+ m = re_var.search(args)
|
|
|
|
+ if not m:
|
|
|
|
+ break
|
|
|
|
+ lookup = m.group(0)[2:-1]
|
|
|
|
+ value = var_dict.get(lookup, '')
|
|
|
|
+ args = args[:m.start(0)] + value + args[m.end(0):]
|
|
|
|
+ return args
|
|
|
|
+
|
|
|
|
+ def GetMakeArguments(self, board):
|
|
|
|
+ """Returns 'make' arguments for a given board
|
|
|
|
+
|
|
|
|
+ The flags are in a section called 'make-flags'. Flags are named
|
|
|
|
+ after the target they represent, for example snapper9260=TESTING=1
|
|
|
|
+ will pass TESTING=1 to make when building the snapper9260 board.
|
|
|
|
+
|
|
|
|
+ References to other boards can be added in the string also. For
|
|
|
|
+ example:
|
|
|
|
+
|
|
|
|
+ [make-flags]
|
|
|
|
+ at91-boards=ENABLE_AT91_TEST=1
|
|
|
|
+ snapper9260=${at91-boards} BUILD_TAG=442
|
|
|
|
+ snapper9g45=${at91-boards} BUILD_TAG=443
|
|
|
|
+
|
|
|
|
+ This will return 'ENABLE_AT91_TEST=1 BUILD_TAG=442' for snapper9260
|
|
|
|
+ and 'ENABLE_AT91_TEST=1 BUILD_TAG=443' for snapper9g45.
|
|
|
|
+
|
|
|
|
+ A special 'target' variable is set to the board target.
|
|
|
|
+
|
|
|
|
+ Args:
|
|
|
|
+ board: Board object for the board to check.
|
|
|
|
+ Returns:
|
|
|
|
+ 'make' flags for that board, or '' if none
|
|
|
|
+ """
|
|
|
|
+ self._make_flags['target'] = board.target
|
|
|
|
+ arg_str = self.ResolveReferences(self._make_flags,
|
|
|
|
+ self._make_flags.get(board.target, ''))
|
|
|
|
+ args = arg_str.split(' ')
|
|
|
|
+ i = 0
|
|
|
|
+ while i < len(args):
|
|
|
|
+ if not args[i]:
|
|
|
|
+ del args[i]
|
|
|
|
+ else:
|
|
|
|
+ i += 1
|
|
|
|
+ return args
|