15b6bfdb9SJed Brownfrom __future__ import print_function 25b6bfdb9SJed Brownfrom __future__ import absolute_import 3179860b2SJed Brownimport sys 4179860b2SJed Brownif not hasattr(sys, 'version_info'): 55b6bfdb9SJed Brown print('*** Python version 1 is not supported. Please get the latest version from www.python.org ***') 6179860b2SJed Brown sys.exit(4) 7179860b2SJed Brown 8179860b2SJed Brownimport cPickle 9179860b2SJed Brown 10179860b2SJed Browntry: 11179860b2SJed Brown import subprocess 12179860b2SJed Brown USE_SUBPROCESS = 1 13179860b2SJed Brownexcept ImportError: 14179860b2SJed Brown USE_SUBPROCESS = 0 15179860b2SJed Brown 16179860b2SJed Brown# Some features related to detecting login failures cannot be easily 17179860b2SJed Brown# implemented with the 'subprocess' module. Disable it for now ... 18179860b2SJed BrownUSE_SUBPROCESS = 0 19179860b2SJed Brown# In Python 2.6 and above, the 'popen2' module is deprecated 20179860b2SJed Brownif sys.version_info[:2] >= (2, 6) and not USE_SUBPROCESS: 21179860b2SJed Brown import warnings 22179860b2SJed Brown warnings.filterwarnings('ignore', category=DeprecationWarning, module=__name__) 23179860b2SJed Brown 24179860b2SJed Brownimport nargs 25179860b2SJed BrownuseThreads = nargs.Arg.findArgument('useThreads', sys.argv[1:]) 26179860b2SJed Brownif useThreads is None: 2792626d4aSBarry Smith useThreads = 0 # workaround issue with parallel configure 2892626d4aSBarry Smithelif useThreads == 'no' or useThreads == '0': 2992626d4aSBarry Smith useThreads = 0 3092626d4aSBarry Smithelif useThreads == 'yes' or useThreads == '1': 3192626d4aSBarry Smith useThreads = 1 32179860b2SJed Brownelse: 3392626d4aSBarry Smith raise RuntimeError('Unknown option value for --useThreads ',useThreads) 34179860b2SJed Brown 35179860b2SJed BrownuseSelect = nargs.Arg.findArgument('useSelect', sys.argv[1:]) 36179860b2SJed Brownif useSelect is None: 377efd6112SBarry Smith useSelect = 1 3892626d4aSBarry Smithelif useSelect == 'no' or useSelect == '0': 3992626d4aSBarry Smith useSelect = 0 4092626d4aSBarry Smithelif useSelect == 'yes' or useSelect == '1': 41179860b2SJed Brown useSelect = 1 42179860b2SJed Brownelse: 4392626d4aSBarry Smith raise RuntimeError('Unknown option value for --useSelect ',useSelect) 44179860b2SJed Brown 45179860b2SJed Brownimport logger 46179860b2SJed Brown 47179860b2SJed Brownclass Script(logger.Logger): 48179860b2SJed Brown def __init__(self, clArgs = None, argDB = None, log = None): 49179860b2SJed Brown self.checkPython() 50179860b2SJed Brown logger.Logger.__init__(self, clArgs, argDB, log) 51179860b2SJed Brown self.shell = '/bin/sh' 52179860b2SJed Brown self.showHelp = 1 53179860b2SJed Brown return 54179860b2SJed Brown 55179860b2SJed Brown def hasHelpFlag(self): 56179860b2SJed Brown '''Decide whether to display the help message and exit''' 57179860b2SJed Brown import nargs 58179860b2SJed Brown 59179860b2SJed Brown if not self.showHelp: 60179860b2SJed Brown return 0 61179860b2SJed Brown if nargs.Arg.findArgument('help', self.clArgs) is None and nargs.Arg.findArgument('h', self.clArgs) is None: 62179860b2SJed Brown return 0 63179860b2SJed Brown return 1 64179860b2SJed Brown 6575f179b0SBarry Smith def hasListFlag(self): 6675f179b0SBarry Smith '''Decide whether to display the list of download files and exit''' 6775f179b0SBarry Smith import nargs 6875f179b0SBarry Smith 6975f179b0SBarry Smith if not self.showHelp: 7075f179b0SBarry Smith return 0 71*0aa1f76dSSatish Balay if nargs.Arg.findArgument('with-packages-download-dir', self.clArgs) is None: 7275f179b0SBarry Smith return 0 7375f179b0SBarry Smith return 1 7475f179b0SBarry Smith 75179860b2SJed Brown def setupArguments(self, argDB): 76179860b2SJed Brown '''This method now also creates the help and action logs''' 77179860b2SJed Brown import help 78179860b2SJed Brown 79179860b2SJed Brown argDB = logger.Logger.setupArguments(self, argDB) 80179860b2SJed Brown 81179860b2SJed Brown self.help = help.Help(argDB) 82179860b2SJed Brown self.help.title = 'Script Help' 83179860b2SJed Brown 84179860b2SJed Brown self.actions = help.Info(argDB) 85179860b2SJed Brown self.actions.title = 'Script Actions' 86179860b2SJed Brown 87179860b2SJed Brown self.setupHelp(self.help) 88179860b2SJed Brown return argDB 89179860b2SJed Brown 90179860b2SJed Brown def setupHelp(self, help): 91179860b2SJed Brown '''This method should be overidden to provide help for arguments''' 92179860b2SJed Brown import nargs 93179860b2SJed Brown 94179860b2SJed Brown help.addArgument('Script', '-h', nargs.ArgBool(None, 0, 'Print this help message', isTemporary = 1), ignoreDuplicates = 1) 95*0aa1f76dSSatish Balay help.addArgument('Script', '-help', nargs.ArgBool(None, 0, 'Print this help message', isTemporary = 1), ignoreDuplicates = 1) 96*0aa1f76dSSatish Balay help.addArgument('Script', '-with-packages-download-dir=<dir>', nargs.ArgDir(None,None, 'Skip network download of package tarballs and locate them in specified dir. If not found in dir, print package URL - so it can be obtained manually.', isTemporary = 1), ignoreDuplicates = 1) 97179860b2SJed Brown return help 98179860b2SJed Brown 99179860b2SJed Brown def setup(self): 100179860b2SJed Brown ''' This method checks to see whether help was requested''' 101179860b2SJed Brown if hasattr(self, '_setup'): 102179860b2SJed Brown return 103179860b2SJed Brown logger.Logger.setup(self) 104179860b2SJed Brown self._setup = 1 105179860b2SJed Brown if self.hasHelpFlag(): 106e1362b5bSMatthew G. Knepley self.argDB.readonly = True 107179860b2SJed Brown if self.argDB.target == ['default']: 108179860b2SJed Brown sections = None 109179860b2SJed Brown else: 110179860b2SJed Brown sections = self.argDB.target 111179860b2SJed Brown self.help.output(sections = sections) 112179860b2SJed Brown sys.exit() 11375f179b0SBarry Smith if self.hasListFlag(): 11475f179b0SBarry Smith self.help.outputDownload() 115179860b2SJed Brown return 116179860b2SJed Brown 117179860b2SJed Brown def cleanup(self): 118179860b2SJed Brown '''This method outputs the action log''' 119179860b2SJed Brown self.actions.output(self.log) 120179860b2SJed Brown return 121179860b2SJed Brown 122179860b2SJed Brown def checkPython(self): 123db5c7c58SSatish Balay if not hasattr(sys, 'version_info') or float(sys.version_info[0]) != 2 or float(sys.version_info[1]) < 6: 124db5c7c58SSatish Balay raise RuntimeError('BuildSystem requires Python2 version 2.6 or higher. Get Python at http://www.python.org') 125179860b2SJed Brown return 126179860b2SJed Brown 127179860b2SJed Brown def getModule(root, name): 128179860b2SJed Brown '''Retrieve a specific module from the directory root, bypassing the usual paths''' 129179860b2SJed Brown import imp 130179860b2SJed Brown 131179860b2SJed Brown (fp, pathname, description) = imp.find_module(name, [root]) 132179860b2SJed Brown try: 133179860b2SJed Brown return imp.load_module(name, fp, pathname, description) 134179860b2SJed Brown finally: 135179860b2SJed Brown if fp: fp.close() 136179860b2SJed Brown return 137179860b2SJed Brown getModule = staticmethod(getModule) 138179860b2SJed Brown 139179860b2SJed Brown def importModule(moduleName): 140179860b2SJed Brown '''Import the named module, and return the module object 141179860b2SJed Brown - Works properly for fully qualified names''' 142179860b2SJed Brown module = __import__(moduleName) 143179860b2SJed Brown components = moduleName.split('.') 144179860b2SJed Brown for comp in components[1:]: 145179860b2SJed Brown module = getattr(module, comp) 146179860b2SJed Brown return module 147179860b2SJed Brown importModule = staticmethod(importModule) 148179860b2SJed Brown 149179860b2SJed Brown if USE_SUBPROCESS: 150179860b2SJed Brown 151179860b2SJed Brown def runShellCommand(command, log=None, cwd=None): 152179860b2SJed Brown Popen = subprocess.Popen 153179860b2SJed Brown PIPE = subprocess.PIPE 154179860b2SJed Brown if log: log.write('Executing: %s\n' % (command,)) 155179860b2SJed Brown pipe = Popen(command, cwd=cwd, stdin=None, stdout=PIPE, stderr=PIPE, 156179860b2SJed Brown bufsize=-1, shell=True, universal_newlines=True) 157179860b2SJed Brown (out, err) = pipe.communicate() 158179860b2SJed Brown ret = pipe.returncode 159179860b2SJed Brown return (out, err, ret) 160179860b2SJed Brown 161179860b2SJed Brown else: 162179860b2SJed Brown 163179860b2SJed Brown def openPipe(command): 164179860b2SJed Brown '''We need to use the asynchronous version here since we want to avoid blocking reads''' 165179860b2SJed Brown import popen2 166179860b2SJed Brown 167179860b2SJed Brown pipe = None 168179860b2SJed Brown if hasattr(popen2, 'Popen3'): 169179860b2SJed Brown pipe = popen2.Popen3(command, 1) 170179860b2SJed Brown input = pipe.tochild 171179860b2SJed Brown output = pipe.fromchild 172179860b2SJed Brown err = pipe.childerr 173179860b2SJed Brown else: 174179860b2SJed Brown import os 175179860b2SJed Brown (input, output, err) = os.popen3(command) 176179860b2SJed Brown return (input, output, err, pipe) 177179860b2SJed Brown openPipe = staticmethod(openPipe) 178179860b2SJed Brown 179179860b2SJed Brown def runShellCommand(command, log = None, cwd = None): 180179860b2SJed Brown import select, os 181179860b2SJed Brown 182179860b2SJed Brown ret = None 183179860b2SJed Brown out = '' 184179860b2SJed Brown err = '' 185179860b2SJed Brown loginError = 0 186179860b2SJed Brown if cwd is not None: 187179860b2SJed Brown oldpath = os.getcwd() 188179860b2SJed Brown os.chdir(cwd) 189179860b2SJed Brown if log: log.write('Executing: %s\n' % (command,)) 190179860b2SJed Brown (input, output, error, pipe) = Script.openPipe(command) 191179860b2SJed Brown if cwd is not None: 192179860b2SJed Brown os.chdir(oldpath) 193179860b2SJed Brown input.close() 194179860b2SJed Brown if useSelect: 195179860b2SJed Brown outputClosed = 0 196179860b2SJed Brown errorClosed = 0 197179860b2SJed Brown lst = [output, error] 198179860b2SJed Brown while 1: 19992987420SSatish Balay try: 200179860b2SJed Brown ready = select.select(lst, [], []) 2015b6bfdb9SJed Brown except Exception as e: 20292987420SSatish Balay if log: log.write('** Error calling select() : '+str(e)+'\n') 20392987420SSatish Balay continue 204179860b2SJed Brown if len(ready[0]): 205179860b2SJed Brown if error in ready[0]: 206179860b2SJed Brown msg = error.readline() 207179860b2SJed Brown if msg: 208179860b2SJed Brown err += msg 209179860b2SJed Brown else: 210179860b2SJed Brown errorClosed = 1 211179860b2SJed Brown lst.remove(error) 212179860b2SJed Brown if output in ready[0]: 213179860b2SJed Brown msg = output.readline() 214179860b2SJed Brown if msg: 215179860b2SJed Brown out += msg 216179860b2SJed Brown else: 217179860b2SJed Brown outputClosed = 1 218179860b2SJed Brown lst.remove(output) 219acc7487bSSatish Balay if msg and msg.find('password:') >= 0: 220179860b2SJed Brown loginError = 1 221179860b2SJed Brown break 222179860b2SJed Brown if outputClosed and errorClosed: 223179860b2SJed Brown break 224179860b2SJed Brown else: 225179860b2SJed Brown out = output.read() 226179860b2SJed Brown err = error.read() 227179860b2SJed Brown output.close() 228179860b2SJed Brown error.close() 229179860b2SJed Brown if pipe: 230179860b2SJed Brown # We would like the NOHANG argument here 231179860b2SJed Brown ret = pipe.wait() 232179860b2SJed Brown if loginError: 233179860b2SJed Brown raise RuntimeError('Could not login to site') 234179860b2SJed Brown return (out, err, ret) 235179860b2SJed Brown 236179860b2SJed Brown runShellCommand = staticmethod(runShellCommand) 237179860b2SJed Brown 238179860b2SJed Brown def defaultCheckCommand(command, status, output, error): 239179860b2SJed Brown '''Raise an error if the exit status is nonzero''' 240179860b2SJed Brown if status: raise RuntimeError('Could not execute "%s":\n%s' % (command,output+error)) 241179860b2SJed Brown defaultCheckCommand = staticmethod(defaultCheckCommand) 242179860b2SJed Brown 243179860b2SJed Brown def executeShellCommand(command, checkCommand = None, timeout = 600.0, log = None, lineLimit = 0, cwd=None): 244179860b2SJed Brown '''Execute a shell command returning the output, and optionally provide a custom error checker 245179860b2SJed Brown - This returns a tuple of the (output, error, statuscode)''' 246179860b2SJed Brown if not checkCommand: 247179860b2SJed Brown checkCommand = Script.defaultCheckCommand 248179860b2SJed Brown if log is None: 249179860b2SJed Brown log = logger.Logger.defaultLog 250179860b2SJed Brown def logOutput(log, output): 251179860b2SJed Brown import re 252179860b2SJed Brown # get rid of multiple blank lines 2539f0d583aSJed Brown output = re.sub('\n+','\n', output).strip() 2544854f487SJed Brown if output: 255179860b2SJed Brown if lineLimit: 256179860b2SJed Brown output = '\n'.join(output.split('\n')[:lineLimit]) 2574854f487SJed Brown if '\n' in output: # multi-line output 2584854f487SJed Brown log.write('stdout:\n'+output+'\n') 2594854f487SJed Brown else: 2604854f487SJed Brown log.write('stdout: '+output+'\n') 261179860b2SJed Brown return output 262179860b2SJed Brown def runInShell(command, log, cwd): 263179860b2SJed Brown if useThreads: 264179860b2SJed Brown import threading 265179860b2SJed Brown class InShell(threading.Thread): 266179860b2SJed Brown def __init__(self): 267179860b2SJed Brown threading.Thread.__init__(self) 268179860b2SJed Brown self.name = 'Shell Command' 269179860b2SJed Brown self.setDaemon(1) 270179860b2SJed Brown def run(self): 271179860b2SJed Brown (self.output, self.error, self.status) = ('', '', -1) # So these fields exist even if command fails with no output 272179860b2SJed Brown (self.output, self.error, self.status) = Script.runShellCommand(command, log, cwd) 273179860b2SJed Brown thread = InShell() 274179860b2SJed Brown thread.start() 275179860b2SJed Brown thread.join(timeout) 276179860b2SJed Brown if thread.isAlive(): 277179860b2SJed Brown error = 'Runaway process exceeded time limit of '+str(timeout)+'s\n' 278179860b2SJed Brown log.write(error) 279179860b2SJed Brown return ('', error, -1) 280179860b2SJed Brown else: 281179860b2SJed Brown return (thread.output, thread.error, thread.status) 282179860b2SJed Brown else: 283179860b2SJed Brown return Script.runShellCommand(command, log, cwd) 284179860b2SJed Brown 285179860b2SJed Brown (output, error, status) = runInShell(command, log, cwd) 286179860b2SJed Brown output = logOutput(log, output) 287179860b2SJed Brown checkCommand(command, status, output, error) 288179860b2SJed Brown return (output, error, status) 289179860b2SJed Brown executeShellCommand = staticmethod(executeShellCommand) 290179860b2SJed Brown 291179860b2SJed Brown def loadConfigure(self, argDB = None): 292179860b2SJed Brown if argDB is None: 293179860b2SJed Brown argDB = self.argDB 294179860b2SJed Brown if not 'configureCache' in argDB: 295179860b2SJed Brown self.logPrint('No cached configure in RDict at '+str(argDB.saveFilename)) 296179860b2SJed Brown return None 297179860b2SJed Brown try: 298179860b2SJed Brown cache = argDB['configureCache'] 299179860b2SJed Brown framework = cPickle.loads(cache) 300179860b2SJed Brown framework.framework = framework 301179860b2SJed Brown framework.argDB = argDB 302179860b2SJed Brown self.logPrint('Loaded configure to cache: size '+str(len(cache))) 3035b6bfdb9SJed Brown except cPickle.UnpicklingError as e: 304179860b2SJed Brown framework = None 305179860b2SJed Brown self.logPrint('Invalid cached configure: '+str(e)) 306179860b2SJed Brown return framework 307179860b2SJed Brown 308179860b2SJed Brownimport args 309179860b2SJed Brown 310179860b2SJed Brownclass LanguageProcessor(args.ArgumentProcessor): 311179860b2SJed Brown def __init__(self, clArgs = None, argDB = None, framework = None, versionControl = None): 312179860b2SJed Brown self.languageModule = {} 313179860b2SJed Brown self.preprocessorObject = {} 314179860b2SJed Brown self.compilerObject = {} 315179860b2SJed Brown self.linkerObject = {} 316179860b2SJed Brown self.sharedLinkerObject = {} 317179860b2SJed Brown self.dynamicLinkerObject = {} 318179860b2SJed Brown self.framework = framework 319179860b2SJed Brown self.versionControl = versionControl 320179860b2SJed Brown args.ArgumentProcessor.__init__(self, clArgs, argDB) 321179860b2SJed Brown self.outputFiles = {} 322179860b2SJed Brown self.modulePath = 'config.compile' 323179860b2SJed Brown return 324179860b2SJed Brown 325179860b2SJed Brown def getCompilers(self): 326179860b2SJed Brown if self.framework is None: 327179860b2SJed Brown return 328179860b2SJed Brown return self.framework.require('config.compilers', None) 329179860b2SJed Brown compilers = property(getCompilers, doc = 'The config.compilers configure object') 330179860b2SJed Brown def getLibraries(self): 331179860b2SJed Brown if self.framework is None: 332179860b2SJed Brown return 333179860b2SJed Brown return self.framework.require('config.libraries', None) 334179860b2SJed Brown libraries = property(getLibraries, doc = 'The config.libraries configure object') 335179860b2SJed Brown 336179860b2SJed Brown def __getstate__(self, d = None): 337179860b2SJed Brown '''We only want to pickle the language module names and output files. The other objects are set by configure.''' 338179860b2SJed Brown if d is None: 339179860b2SJed Brown d = args.ArgumentProcessor.__getstate__(self) 340179860b2SJed Brown if 'languageModule' in d: 341179860b2SJed Brown d['languageModule'] = dict([(lang,mod._loadName) for lang,mod in d['languageModule'].items()]) 342179860b2SJed Brown for member in ['preprocessorObject', 'compilerObject', 'linkerObject', 'sharedLinkerObject', 'dynamicLinkerObject', 'framework']: 343179860b2SJed Brown if member in d: 344179860b2SJed Brown del d[member] 345179860b2SJed Brown return d 346179860b2SJed Brown 347179860b2SJed Brown def __setstate__(self, d): 348179860b2SJed Brown '''We must create the language modules''' 349179860b2SJed Brown args.ArgumentProcessor.__setstate__(self, d) 350179860b2SJed Brown self.__dict__.update(d) 351179860b2SJed Brown [self.getLanguageModule(language, moduleName) for language,moduleName in self.languageModule.items()] 352179860b2SJed Brown self.preprocessorObject = {} 353179860b2SJed Brown self.compilerObject = {} 354179860b2SJed Brown self.linkerObject = {} 355179860b2SJed Brown self.sharedLinkerObject = {} 356179860b2SJed Brown self.dynamicLinkerObject = {} 357179860b2SJed Brown return 358179860b2SJed Brown 359179860b2SJed Brown def setArgDB(self, argDB): 360179860b2SJed Brown args.ArgumentProcessor.setArgDB(self, argDB) 361179860b2SJed Brown for obj in self.preprocessorObject.values(): 362179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 363179860b2SJed Brown obj.argDB = argDB 364179860b2SJed Brown for obj in self.compilerObject.values(): 365179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 366179860b2SJed Brown obj.argDB = argDB 367179860b2SJed Brown for obj in self.linkerObject.values(): 368179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 369179860b2SJed Brown obj.argDB = argDB 370179860b2SJed Brown for obj in self.sharedLinkerObject.values(): 371179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 372179860b2SJed Brown obj.argDB = argDB 373179860b2SJed Brown for obj in self.dynamicLinkerObject.values(): 374179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 375179860b2SJed Brown obj.argDB = argDB 376179860b2SJed Brown if not self.compilers is None: 377179860b2SJed Brown self.compilers.argDB = argDB 378179860b2SJed Brown for obj in self.preprocessorObject.values(): 379179860b2SJed Brown if hasattr(obj, 'configCompilers'): 380179860b2SJed Brown obj.configCompilers.argDB = argDB 381179860b2SJed Brown for obj in self.compilerObject.values(): 382179860b2SJed Brown if hasattr(obj, 'configCompilers'): 383179860b2SJed Brown obj.configCompilers.argDB = argDB 384179860b2SJed Brown for obj in self.linkerObject.values(): 385179860b2SJed Brown if hasattr(obj, 'configCompilers'): 386179860b2SJed Brown obj.configCompilers.argDB = argDB 387179860b2SJed Brown for obj in self.sharedLinkerObject.values(): 388179860b2SJed Brown if hasattr(obj, 'configCompilers'): 389179860b2SJed Brown obj.configCompilers.argDB = argDB 390179860b2SJed Brown for obj in self.dynamicLinkerObject.values(): 391179860b2SJed Brown if hasattr(obj, 'configCompilers'): 392179860b2SJed Brown obj.configCompilers.argDB = argDB 393179860b2SJed Brown if not self.libraries is None: 394179860b2SJed Brown self.libraries.argDB = argDB 395179860b2SJed Brown for obj in self.linkerObject.values(): 396179860b2SJed Brown if hasattr(obj, 'configLibraries'): 397179860b2SJed Brown obj.configLibraries.argDB = argDB 398179860b2SJed Brown for obj in self.sharedLinkerObject.values(): 399179860b2SJed Brown if hasattr(obj, 'configLibraries'): 400179860b2SJed Brown obj.configLibraries.argDB = argDB 401179860b2SJed Brown for obj in self.dynamicLinkerObject.values(): 402179860b2SJed Brown if hasattr(obj, 'configLibraries'): 403179860b2SJed Brown obj.configLibraries.argDB = argDB 404179860b2SJed Brown return 405179860b2SJed Brown argDB = property(args.ArgumentProcessor.getArgDB, setArgDB, doc = 'The RDict argument database') 406179860b2SJed Brown 407179860b2SJed Brown def getLanguageModule(self, language, moduleName = None): 408179860b2SJed Brown '''Return the module associated with operations for a given language 409179860b2SJed Brown - Giving a moduleName explicitly forces a reimport''' 410179860b2SJed Brown if not language in self.languageModule or not moduleName is None: 411179860b2SJed Brown try: 412179860b2SJed Brown if moduleName is None: 413179860b2SJed Brown moduleName = self.modulePath+'.'+language 414179860b2SJed Brown module = __import__(moduleName) 4155b6bfdb9SJed Brown except ImportError as e: 416179860b2SJed Brown if not moduleName is None: 417179860b2SJed Brown self.logPrint('Failure to find language module: '+str(e)) 418179860b2SJed Brown try: 419179860b2SJed Brown moduleName = self.modulePath+'.'+language 420179860b2SJed Brown module = __import__(moduleName) 4215b6bfdb9SJed Brown except ImportError as e: 422179860b2SJed Brown self.logPrint('Failure to find language module: '+str(e)) 423179860b2SJed Brown moduleName = 'config.compile.'+language 424179860b2SJed Brown module = __import__(moduleName) 425179860b2SJed Brown components = moduleName.split('.') 426179860b2SJed Brown for component in components[1:]: 427179860b2SJed Brown module = getattr(module, component) 428179860b2SJed Brown module._loadName = moduleName 429179860b2SJed Brown self.languageModule[language] = module 430179860b2SJed Brown return self.languageModule[language] 431179860b2SJed Brown 432179860b2SJed Brown def getPreprocessorObject(self, language): 433179860b2SJed Brown if not language in self.preprocessorObject: 434179860b2SJed Brown self.preprocessorObject[language] = self.getLanguageModule(language).Preprocessor(self.argDB) 435179860b2SJed Brown self.preprocessorObject[language].setup() 436179860b2SJed Brown if not self.compilers is None: 437179860b2SJed Brown self.preprocessorObject[language].configCompilers = self.compilers 438179860b2SJed Brown if not self.versionControl is None: 439179860b2SJed Brown self.preprocessorObject[language].versionControl = self.versionControl 440179860b2SJed Brown return self.preprocessorObject[language] 441179860b2SJed Brown 442179860b2SJed Brown def setPreprocessorObject(self, language, preprocessor): 443179860b2SJed Brown self.preprocessorObject[language] = preprocessor 444179860b2SJed Brown return self.getPreprocessorObject(language) 445179860b2SJed Brown 446179860b2SJed Brown def getCompilerObject(self, language): 447179860b2SJed Brown if not language in self.compilerObject: 448179860b2SJed Brown self.compilerObject[language] = self.getLanguageModule(language).Compiler(self.argDB) 449179860b2SJed Brown self.compilerObject[language].setup() 450179860b2SJed Brown if not self.compilers is None: 451179860b2SJed Brown self.compilerObject[language].configCompilers = self.compilers 452179860b2SJed Brown if not self.versionControl is None: 453179860b2SJed Brown self.compilerObject[language].versionControl = self.versionControl 454179860b2SJed Brown return self.compilerObject[language] 455179860b2SJed Brown 456179860b2SJed Brown def setCompilerObject(self, language, compiler): 457179860b2SJed Brown self.compilerObject[language] = compiler 458179860b2SJed Brown return self.getCompilerObject(language) 459179860b2SJed Brown 460179860b2SJed Brown def getLinkerObject(self, language): 461179860b2SJed Brown if not language in self.linkerObject: 462179860b2SJed Brown self.linkerObject[language] = self.getLanguageModule(language).Linker(self.argDB) 463179860b2SJed Brown self.linkerObject[language].setup() 464179860b2SJed Brown if not self.compilers is None: 465179860b2SJed Brown self.linkerObject[language].configCompilers = self.compilers 466179860b2SJed Brown if not self.libraries is None: 467179860b2SJed Brown self.linkerObject[language].configLibraries = self.libraries 468179860b2SJed Brown if not self.versionControl is None: 469179860b2SJed Brown self.linkerObject[language].versionControl = self.versionControl 470179860b2SJed Brown return self.linkerObject[language] 471179860b2SJed Brown 472179860b2SJed Brown def setLinkerObject(self, language, linker): 473179860b2SJed Brown self.linkerObject[language] = linker 474179860b2SJed Brown return self.getLinkerObject(language) 475179860b2SJed Brown 476179860b2SJed Brown def getSharedLinkerObject(self, language): 477179860b2SJed Brown if not language in self.sharedLinkerObject: 478179860b2SJed Brown self.sharedLinkerObject[language] = self.getLanguageModule(language).SharedLinker(self.argDB) 479179860b2SJed Brown self.sharedLinkerObject[language].setup() 480179860b2SJed Brown if not self.compilers is None: 481179860b2SJed Brown self.sharedLinkerObject[language].configCompilers = self.compilers 482179860b2SJed Brown if not self.libraries is None: 483179860b2SJed Brown self.sharedLinkerObject[language].configLibraries = self.libraries 484179860b2SJed Brown if not self.versionControl is None: 485179860b2SJed Brown self.sharedLinkerObject[language].versionControl = self.versionControl 486179860b2SJed Brown return self.sharedLinkerObject[language] 487179860b2SJed Brown 488179860b2SJed Brown def setSharedLinkerObject(self, language, linker): 489179860b2SJed Brown self.sharedLinkerObject[language] = linker 490179860b2SJed Brown return self.getSharedLinkerObject(language) 491179860b2SJed Brown 492179860b2SJed Brown def getDynamicLinkerObject(self, language): 493179860b2SJed Brown if not language in self.dynamicLinkerObject: 494179860b2SJed Brown self.dynamicLinkerObject[language] = self.getLanguageModule(language).DynamicLinker(self.argDB) 495179860b2SJed Brown self.dynamicLinkerObject[language].setup() 496179860b2SJed Brown if not self.compilers is None: 497179860b2SJed Brown self.dynamicLinkerObject[language].configCompilers = self.compilers 498179860b2SJed Brown if not self.libraries is None: 499179860b2SJed Brown self.dynamicLinkerObject[language].configLibraries = self.libraries 500179860b2SJed Brown if not self.versionControl is None: 501179860b2SJed Brown self.dynamicLinkerObject[language].versionControl = self.versionControl 502179860b2SJed Brown return self.dynamicLinkerObject[language] 503179860b2SJed Brown 504179860b2SJed Brown def setDynamicLinkerObject(self, language, linker): 505179860b2SJed Brown self.dynamicLinkerObject[language] = linker 506179860b2SJed Brown return self.getDynamicLinkerObject(language) 507