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 8492432c8SJed Brownimport pickle 9179860b2SJed Brown 10179860b2SJed Brownimport subprocess 11179860b2SJed Brown 12179860b2SJed Brownimport nargs 13179860b2SJed BrownuseThreads = nargs.Arg.findArgument('useThreads', sys.argv[1:]) 14179860b2SJed Brownif useThreads is None: 1592626d4aSBarry Smith useThreads = 0 # workaround issue with parallel configure 1692626d4aSBarry Smithelif useThreads == 'no' or useThreads == '0': 1792626d4aSBarry Smith useThreads = 0 1892626d4aSBarry Smithelif useThreads == 'yes' or useThreads == '1': 1992626d4aSBarry Smith useThreads = 1 20179860b2SJed Brownelse: 2192626d4aSBarry Smith raise RuntimeError('Unknown option value for --useThreads ',useThreads) 22179860b2SJed Brown 23179860b2SJed BrownuseSelect = nargs.Arg.findArgument('useSelect', sys.argv[1:]) 24179860b2SJed Brownif useSelect is None: 257efd6112SBarry Smith useSelect = 1 2692626d4aSBarry Smithelif useSelect == 'no' or useSelect == '0': 2792626d4aSBarry Smith useSelect = 0 2892626d4aSBarry Smithelif useSelect == 'yes' or useSelect == '1': 29179860b2SJed Brown useSelect = 1 30179860b2SJed Brownelse: 3192626d4aSBarry Smith raise RuntimeError('Unknown option value for --useSelect ',useSelect) 32179860b2SJed Brown 33179860b2SJed Brownimport logger 34179860b2SJed Brown 35179860b2SJed Brownclass Script(logger.Logger): 36179860b2SJed Brown def __init__(self, clArgs = None, argDB = None, log = None): 37179860b2SJed Brown self.checkPython() 38179860b2SJed Brown logger.Logger.__init__(self, clArgs, argDB, log) 39179860b2SJed Brown self.shell = '/bin/sh' 40179860b2SJed Brown self.showHelp = 1 41179860b2SJed Brown return 42179860b2SJed Brown 43179860b2SJed Brown def hasHelpFlag(self): 44179860b2SJed Brown '''Decide whether to display the help message and exit''' 45179860b2SJed Brown import nargs 46179860b2SJed Brown 47179860b2SJed Brown if not self.showHelp: 48179860b2SJed Brown return 0 49179860b2SJed Brown if nargs.Arg.findArgument('help', self.clArgs) is None and nargs.Arg.findArgument('h', self.clArgs) is None: 50179860b2SJed Brown return 0 51179860b2SJed Brown return 1 52179860b2SJed Brown 5375f179b0SBarry Smith def hasListFlag(self): 5475f179b0SBarry Smith '''Decide whether to display the list of download files and exit''' 5575f179b0SBarry Smith import nargs 5675f179b0SBarry Smith 5775f179b0SBarry Smith if not self.showHelp: 5875f179b0SBarry Smith return 0 590aa1f76dSSatish Balay if nargs.Arg.findArgument('with-packages-download-dir', self.clArgs) is None: 6075f179b0SBarry Smith return 0 6175f179b0SBarry Smith return 1 6275f179b0SBarry Smith 63179860b2SJed Brown def setupArguments(self, argDB): 64179860b2SJed Brown '''This method now also creates the help and action logs''' 65179860b2SJed Brown import help 66179860b2SJed Brown 67179860b2SJed Brown argDB = logger.Logger.setupArguments(self, argDB) 68179860b2SJed Brown 69179860b2SJed Brown self.help = help.Help(argDB) 70179860b2SJed Brown self.help.title = 'Script Help' 71179860b2SJed Brown 72179860b2SJed Brown self.actions = help.Info(argDB) 73179860b2SJed Brown self.actions.title = 'Script Actions' 74179860b2SJed Brown 75179860b2SJed Brown self.setupHelp(self.help) 76179860b2SJed Brown return argDB 77179860b2SJed Brown 78179860b2SJed Brown def setupHelp(self, help): 79179860b2SJed Brown '''This method should be overidden to provide help for arguments''' 80179860b2SJed Brown import nargs 81179860b2SJed Brown 82179860b2SJed Brown help.addArgument('Script', '-h', nargs.ArgBool(None, 0, 'Print this help message', isTemporary = 1), ignoreDuplicates = 1) 830aa1f76dSSatish Balay help.addArgument('Script', '-help', nargs.ArgBool(None, 0, 'Print this help message', isTemporary = 1), ignoreDuplicates = 1) 840aa1f76dSSatish 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) 85179860b2SJed Brown return help 86179860b2SJed Brown 87179860b2SJed Brown def setup(self): 88179860b2SJed Brown ''' This method checks to see whether help was requested''' 89179860b2SJed Brown if hasattr(self, '_setup'): 90179860b2SJed Brown return 91179860b2SJed Brown logger.Logger.setup(self) 92179860b2SJed Brown self._setup = 1 93179860b2SJed Brown if self.hasHelpFlag(): 94e1362b5bSMatthew G. Knepley self.argDB.readonly = True 95179860b2SJed Brown if self.argDB.target == ['default']: 96179860b2SJed Brown sections = None 97179860b2SJed Brown else: 98179860b2SJed Brown sections = self.argDB.target 99179860b2SJed Brown self.help.output(sections = sections) 100179860b2SJed Brown sys.exit() 10175f179b0SBarry Smith if self.hasListFlag(): 10275f179b0SBarry Smith self.help.outputDownload() 103179860b2SJed Brown return 104179860b2SJed Brown 105179860b2SJed Brown def cleanup(self): 106179860b2SJed Brown '''This method outputs the action log''' 107179860b2SJed Brown self.actions.output(self.log) 108179860b2SJed Brown return 109179860b2SJed Brown 110179860b2SJed Brown def checkPython(self): 111813ae6e9SJed Brown if not hasattr(sys, 'version_info') or sys.version_info < (2,6): 112813ae6e9SJed Brown raise RuntimeError('BuildSystem requires Python version 2.6 or higher. Get Python at http://www.python.org') 113179860b2SJed Brown return 114179860b2SJed Brown 115179860b2SJed Brown def getModule(root, name): 116179860b2SJed Brown '''Retrieve a specific module from the directory root, bypassing the usual paths''' 117179860b2SJed Brown import imp 118179860b2SJed Brown 119179860b2SJed Brown (fp, pathname, description) = imp.find_module(name, [root]) 120179860b2SJed Brown try: 121179860b2SJed Brown return imp.load_module(name, fp, pathname, description) 122179860b2SJed Brown finally: 123179860b2SJed Brown if fp: fp.close() 124179860b2SJed Brown return 125179860b2SJed Brown getModule = staticmethod(getModule) 126179860b2SJed Brown 127179860b2SJed Brown def importModule(moduleName): 128179860b2SJed Brown '''Import the named module, and return the module object 129179860b2SJed Brown - Works properly for fully qualified names''' 130179860b2SJed Brown module = __import__(moduleName) 131179860b2SJed Brown components = moduleName.split('.') 132179860b2SJed Brown for comp in components[1:]: 133179860b2SJed Brown module = getattr(module, comp) 134179860b2SJed Brown return module 135179860b2SJed Brown importModule = staticmethod(importModule) 136179860b2SJed Brown 13750f8d48fSJed Brown @staticmethod 138179860b2SJed Brown def runShellCommand(command, log=None, cwd=None): 13950f8d48fSJed Brown return Script.runShellCommandSeq([command], log=log, cwd=cwd) 14050f8d48fSJed Brown 14150f8d48fSJed Brown @staticmethod 14250f8d48fSJed Brown def runShellCommandSeq(commandseq, log=None, cwd=None): 143179860b2SJed Brown Popen = subprocess.Popen 144179860b2SJed Brown PIPE = subprocess.PIPE 14550f8d48fSJed Brown output = '' 14650f8d48fSJed Brown error = '' 14750f8d48fSJed Brown for command in commandseq: 14850f8d48fSJed Brown useShell = isinstance(command, str) or isinstance(command, bytes) 149179860b2SJed Brown if log: log.write('Executing: %s\n' % (command,)) 15050f8d48fSJed Brown try: 151179860b2SJed Brown pipe = Popen(command, cwd=cwd, stdin=None, stdout=PIPE, stderr=PIPE, 152*9467260aSSatish Balay shell=useShell) 153179860b2SJed Brown (out, err) = pipe.communicate() 154*9467260aSSatish Balay if sys.version_info >= (3,0): 155*9467260aSSatish Balay out = out.decode(encoding='UTF-8',errors='replace') 156*9467260aSSatish Balay err = err.decode(encoding='UTF-8',errors='replace') 157179860b2SJed Brown ret = pipe.returncode 15850f8d48fSJed Brown except OSError as e: 15950f8d48fSJed Brown return ('', e.message, e.errno) 16050f8d48fSJed Brown except FileNotFoundError as e: 16150f8d48fSJed Brown return ('', e.message, e.errno) 16250f8d48fSJed Brown output += out 16350f8d48fSJed Brown error += err 16450f8d48fSJed Brown if ret: 16550f8d48fSJed Brown break 16650f8d48fSJed Brown return (output, error, ret) 167179860b2SJed Brown 168179860b2SJed Brown def defaultCheckCommand(command, status, output, error): 169179860b2SJed Brown '''Raise an error if the exit status is nonzero''' 170179860b2SJed Brown if status: raise RuntimeError('Could not execute "%s":\n%s' % (command,output+error)) 171179860b2SJed Brown defaultCheckCommand = staticmethod(defaultCheckCommand) 172179860b2SJed Brown 17350f8d48fSJed Brown @staticmethod 174c3ec109aSBarry Smith def executeShellCommand(command, checkCommand = None, timeout = 600.0, log = None, lineLimit = 0, cwd=None, logOutputflg = True): 175179860b2SJed Brown '''Execute a shell command returning the output, and optionally provide a custom error checker 176179860b2SJed Brown - This returns a tuple of the (output, error, statuscode)''' 177c3ec109aSBarry Smith return Script.executeShellCommandSeq([command], checkCommand=checkCommand, timeout=timeout, log=log, lineLimit=lineLimit, cwd=cwd,logOutputflg = logOutputflg) 17850f8d48fSJed Brown 17950f8d48fSJed Brown @staticmethod 180c3ec109aSBarry Smith def executeShellCommandSeq(commandseq, checkCommand = None, timeout = 600.0, log = None, lineLimit = 0, cwd=None, logOutputflg = True): 18150f8d48fSJed Brown '''Execute a sequence of shell commands (an && chain) returning the output, and optionally provide a custom error checker 18250f8d48fSJed Brown - This returns a tuple of the (output, error, statuscode)''' 183179860b2SJed Brown if not checkCommand: 184179860b2SJed Brown checkCommand = Script.defaultCheckCommand 185179860b2SJed Brown if log is None: 186179860b2SJed Brown log = logger.Logger.defaultLog 187c3ec109aSBarry Smith def logOutput(log, output, logOutputflg): 188179860b2SJed Brown import re 189c3ec109aSBarry Smith if not logOutputflg: return output 190179860b2SJed Brown # get rid of multiple blank lines 1919f0d583aSJed Brown output = re.sub('\n+','\n', output).strip() 1924854f487SJed Brown if output: 193179860b2SJed Brown if lineLimit: 194179860b2SJed Brown output = '\n'.join(output.split('\n')[:lineLimit]) 1954854f487SJed Brown if '\n' in output: # multi-line output 1964854f487SJed Brown log.write('stdout:\n'+output+'\n') 1974854f487SJed Brown else: 1984854f487SJed Brown log.write('stdout: '+output+'\n') 199179860b2SJed Brown return output 20050f8d48fSJed Brown def runInShell(commandseq, log, cwd): 201179860b2SJed Brown if useThreads: 202179860b2SJed Brown import threading 203179860b2SJed Brown class InShell(threading.Thread): 204179860b2SJed Brown def __init__(self): 205179860b2SJed Brown threading.Thread.__init__(self) 206179860b2SJed Brown self.name = 'Shell Command' 207179860b2SJed Brown self.setDaemon(1) 208179860b2SJed Brown def run(self): 209179860b2SJed Brown (self.output, self.error, self.status) = ('', '', -1) # So these fields exist even if command fails with no output 21050f8d48fSJed Brown (self.output, self.error, self.status) = Script.runShellCommandSeq(commandseq, log, cwd) 211179860b2SJed Brown thread = InShell() 212179860b2SJed Brown thread.start() 213179860b2SJed Brown thread.join(timeout) 214179860b2SJed Brown if thread.isAlive(): 215179860b2SJed Brown error = 'Runaway process exceeded time limit of '+str(timeout)+'s\n' 216179860b2SJed Brown log.write(error) 217179860b2SJed Brown return ('', error, -1) 218179860b2SJed Brown else: 219179860b2SJed Brown return (thread.output, thread.error, thread.status) 220179860b2SJed Brown else: 22150f8d48fSJed Brown return Script.runShellCommandSeq(commandseq, log, cwd) 222179860b2SJed Brown 22350f8d48fSJed Brown (output, error, status) = runInShell(commandseq, log, cwd) 224c3ec109aSBarry Smith output = logOutput(log, output,logOutputflg) 22550f8d48fSJed Brown checkCommand(commandseq, status, output, error) 226179860b2SJed Brown return (output, error, status) 227179860b2SJed Brown 228179860b2SJed Brown def loadConfigure(self, argDB = None): 229179860b2SJed Brown if argDB is None: 230179860b2SJed Brown argDB = self.argDB 231179860b2SJed Brown if not 'configureCache' in argDB: 232179860b2SJed Brown self.logPrint('No cached configure in RDict at '+str(argDB.saveFilename)) 233179860b2SJed Brown return None 234179860b2SJed Brown try: 235179860b2SJed Brown cache = argDB['configureCache'] 236492432c8SJed Brown framework = pickle.loads(cache) 237179860b2SJed Brown framework.framework = framework 238179860b2SJed Brown framework.argDB = argDB 239179860b2SJed Brown self.logPrint('Loaded configure to cache: size '+str(len(cache))) 240492432c8SJed Brown except pickle.UnpicklingError as e: 241179860b2SJed Brown framework = None 242179860b2SJed Brown self.logPrint('Invalid cached configure: '+str(e)) 243179860b2SJed Brown return framework 244179860b2SJed Brown 245179860b2SJed Brownimport args 246179860b2SJed Brown 247179860b2SJed Brownclass LanguageProcessor(args.ArgumentProcessor): 248179860b2SJed Brown def __init__(self, clArgs = None, argDB = None, framework = None, versionControl = None): 249179860b2SJed Brown self.languageModule = {} 250179860b2SJed Brown self.preprocessorObject = {} 251179860b2SJed Brown self.compilerObject = {} 252179860b2SJed Brown self.linkerObject = {} 253179860b2SJed Brown self.sharedLinkerObject = {} 254179860b2SJed Brown self.dynamicLinkerObject = {} 255179860b2SJed Brown self.framework = framework 256179860b2SJed Brown self.versionControl = versionControl 257179860b2SJed Brown args.ArgumentProcessor.__init__(self, clArgs, argDB) 258179860b2SJed Brown self.outputFiles = {} 259179860b2SJed Brown self.modulePath = 'config.compile' 260179860b2SJed Brown return 261179860b2SJed Brown 262179860b2SJed Brown def getCompilers(self): 263179860b2SJed Brown if self.framework is None: 264179860b2SJed Brown return 265179860b2SJed Brown return self.framework.require('config.compilers', None) 266179860b2SJed Brown compilers = property(getCompilers, doc = 'The config.compilers configure object') 267179860b2SJed Brown def getLibraries(self): 268179860b2SJed Brown if self.framework is None: 269179860b2SJed Brown return 270179860b2SJed Brown return self.framework.require('config.libraries', None) 271179860b2SJed Brown libraries = property(getLibraries, doc = 'The config.libraries configure object') 272179860b2SJed Brown 273179860b2SJed Brown def __getstate__(self, d = None): 274179860b2SJed Brown '''We only want to pickle the language module names and output files. The other objects are set by configure.''' 275179860b2SJed Brown if d is None: 276179860b2SJed Brown d = args.ArgumentProcessor.__getstate__(self) 277179860b2SJed Brown if 'languageModule' in d: 278179860b2SJed Brown d['languageModule'] = dict([(lang,mod._loadName) for lang,mod in d['languageModule'].items()]) 279179860b2SJed Brown for member in ['preprocessorObject', 'compilerObject', 'linkerObject', 'sharedLinkerObject', 'dynamicLinkerObject', 'framework']: 280179860b2SJed Brown if member in d: 281179860b2SJed Brown del d[member] 282179860b2SJed Brown return d 283179860b2SJed Brown 284179860b2SJed Brown def __setstate__(self, d): 285179860b2SJed Brown '''We must create the language modules''' 286179860b2SJed Brown args.ArgumentProcessor.__setstate__(self, d) 287179860b2SJed Brown self.__dict__.update(d) 288179860b2SJed Brown [self.getLanguageModule(language, moduleName) for language,moduleName in self.languageModule.items()] 289179860b2SJed Brown self.preprocessorObject = {} 290179860b2SJed Brown self.compilerObject = {} 291179860b2SJed Brown self.linkerObject = {} 292179860b2SJed Brown self.sharedLinkerObject = {} 293179860b2SJed Brown self.dynamicLinkerObject = {} 294179860b2SJed Brown return 295179860b2SJed Brown 296179860b2SJed Brown def setArgDB(self, argDB): 297179860b2SJed Brown args.ArgumentProcessor.setArgDB(self, argDB) 298179860b2SJed Brown for obj in self.preprocessorObject.values(): 299179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 300179860b2SJed Brown obj.argDB = argDB 301179860b2SJed Brown for obj in self.compilerObject.values(): 302179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 303179860b2SJed Brown obj.argDB = argDB 304179860b2SJed Brown for obj in self.linkerObject.values(): 305179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 306179860b2SJed Brown obj.argDB = argDB 307179860b2SJed Brown for obj in self.sharedLinkerObject.values(): 308179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 309179860b2SJed Brown obj.argDB = argDB 310179860b2SJed Brown for obj in self.dynamicLinkerObject.values(): 311179860b2SJed Brown if not hasattr(obj, 'argDB') or not obj.argDB == argDB: 312179860b2SJed Brown obj.argDB = argDB 313179860b2SJed Brown if not self.compilers is None: 314179860b2SJed Brown self.compilers.argDB = argDB 315179860b2SJed Brown for obj in self.preprocessorObject.values(): 316179860b2SJed Brown if hasattr(obj, 'configCompilers'): 317179860b2SJed Brown obj.configCompilers.argDB = argDB 318179860b2SJed Brown for obj in self.compilerObject.values(): 319179860b2SJed Brown if hasattr(obj, 'configCompilers'): 320179860b2SJed Brown obj.configCompilers.argDB = argDB 321179860b2SJed Brown for obj in self.linkerObject.values(): 322179860b2SJed Brown if hasattr(obj, 'configCompilers'): 323179860b2SJed Brown obj.configCompilers.argDB = argDB 324179860b2SJed Brown for obj in self.sharedLinkerObject.values(): 325179860b2SJed Brown if hasattr(obj, 'configCompilers'): 326179860b2SJed Brown obj.configCompilers.argDB = argDB 327179860b2SJed Brown for obj in self.dynamicLinkerObject.values(): 328179860b2SJed Brown if hasattr(obj, 'configCompilers'): 329179860b2SJed Brown obj.configCompilers.argDB = argDB 330179860b2SJed Brown if not self.libraries is None: 331179860b2SJed Brown self.libraries.argDB = argDB 332179860b2SJed Brown for obj in self.linkerObject.values(): 333179860b2SJed Brown if hasattr(obj, 'configLibraries'): 334179860b2SJed Brown obj.configLibraries.argDB = argDB 335179860b2SJed Brown for obj in self.sharedLinkerObject.values(): 336179860b2SJed Brown if hasattr(obj, 'configLibraries'): 337179860b2SJed Brown obj.configLibraries.argDB = argDB 338179860b2SJed Brown for obj in self.dynamicLinkerObject.values(): 339179860b2SJed Brown if hasattr(obj, 'configLibraries'): 340179860b2SJed Brown obj.configLibraries.argDB = argDB 341179860b2SJed Brown return 342179860b2SJed Brown argDB = property(args.ArgumentProcessor.getArgDB, setArgDB, doc = 'The RDict argument database') 343179860b2SJed Brown 344179860b2SJed Brown def getLanguageModule(self, language, moduleName = None): 345179860b2SJed Brown '''Return the module associated with operations for a given language 346179860b2SJed Brown - Giving a moduleName explicitly forces a reimport''' 347179860b2SJed Brown if not language in self.languageModule or not moduleName is None: 348179860b2SJed Brown try: 349179860b2SJed Brown if moduleName is None: 350179860b2SJed Brown moduleName = self.modulePath+'.'+language 351179860b2SJed Brown module = __import__(moduleName) 3525b6bfdb9SJed Brown except ImportError as e: 353179860b2SJed Brown if not moduleName is None: 354179860b2SJed Brown self.logPrint('Failure to find language module: '+str(e)) 355179860b2SJed Brown try: 356179860b2SJed Brown moduleName = self.modulePath+'.'+language 357179860b2SJed Brown module = __import__(moduleName) 3585b6bfdb9SJed Brown except ImportError as e: 359179860b2SJed Brown self.logPrint('Failure to find language module: '+str(e)) 360179860b2SJed Brown moduleName = 'config.compile.'+language 361179860b2SJed Brown module = __import__(moduleName) 362179860b2SJed Brown components = moduleName.split('.') 363179860b2SJed Brown for component in components[1:]: 364179860b2SJed Brown module = getattr(module, component) 365179860b2SJed Brown module._loadName = moduleName 366179860b2SJed Brown self.languageModule[language] = module 367179860b2SJed Brown return self.languageModule[language] 368179860b2SJed Brown 369179860b2SJed Brown def getPreprocessorObject(self, language): 370179860b2SJed Brown if not language in self.preprocessorObject: 371179860b2SJed Brown self.preprocessorObject[language] = self.getLanguageModule(language).Preprocessor(self.argDB) 372179860b2SJed Brown self.preprocessorObject[language].setup() 373179860b2SJed Brown if not self.compilers is None: 374179860b2SJed Brown self.preprocessorObject[language].configCompilers = self.compilers 375179860b2SJed Brown if not self.versionControl is None: 376179860b2SJed Brown self.preprocessorObject[language].versionControl = self.versionControl 377179860b2SJed Brown return self.preprocessorObject[language] 378179860b2SJed Brown 379179860b2SJed Brown def setPreprocessorObject(self, language, preprocessor): 380179860b2SJed Brown self.preprocessorObject[language] = preprocessor 381179860b2SJed Brown return self.getPreprocessorObject(language) 382179860b2SJed Brown 383179860b2SJed Brown def getCompilerObject(self, language): 384179860b2SJed Brown if not language in self.compilerObject: 385179860b2SJed Brown self.compilerObject[language] = self.getLanguageModule(language).Compiler(self.argDB) 386179860b2SJed Brown self.compilerObject[language].setup() 387179860b2SJed Brown if not self.compilers is None: 388179860b2SJed Brown self.compilerObject[language].configCompilers = self.compilers 389179860b2SJed Brown if not self.versionControl is None: 390179860b2SJed Brown self.compilerObject[language].versionControl = self.versionControl 391179860b2SJed Brown return self.compilerObject[language] 392179860b2SJed Brown 393179860b2SJed Brown def setCompilerObject(self, language, compiler): 394179860b2SJed Brown self.compilerObject[language] = compiler 395179860b2SJed Brown return self.getCompilerObject(language) 396179860b2SJed Brown 397179860b2SJed Brown def getLinkerObject(self, language): 398179860b2SJed Brown if not language in self.linkerObject: 399179860b2SJed Brown self.linkerObject[language] = self.getLanguageModule(language).Linker(self.argDB) 400179860b2SJed Brown self.linkerObject[language].setup() 401179860b2SJed Brown if not self.compilers is None: 402179860b2SJed Brown self.linkerObject[language].configCompilers = self.compilers 403179860b2SJed Brown if not self.libraries is None: 404179860b2SJed Brown self.linkerObject[language].configLibraries = self.libraries 405179860b2SJed Brown if not self.versionControl is None: 406179860b2SJed Brown self.linkerObject[language].versionControl = self.versionControl 407179860b2SJed Brown return self.linkerObject[language] 408179860b2SJed Brown 409179860b2SJed Brown def setLinkerObject(self, language, linker): 410179860b2SJed Brown self.linkerObject[language] = linker 411179860b2SJed Brown return self.getLinkerObject(language) 412179860b2SJed Brown 413179860b2SJed Brown def getSharedLinkerObject(self, language): 414179860b2SJed Brown if not language in self.sharedLinkerObject: 415179860b2SJed Brown self.sharedLinkerObject[language] = self.getLanguageModule(language).SharedLinker(self.argDB) 416179860b2SJed Brown self.sharedLinkerObject[language].setup() 417179860b2SJed Brown if not self.compilers is None: 418179860b2SJed Brown self.sharedLinkerObject[language].configCompilers = self.compilers 419179860b2SJed Brown if not self.libraries is None: 420179860b2SJed Brown self.sharedLinkerObject[language].configLibraries = self.libraries 421179860b2SJed Brown if not self.versionControl is None: 422179860b2SJed Brown self.sharedLinkerObject[language].versionControl = self.versionControl 423179860b2SJed Brown return self.sharedLinkerObject[language] 424179860b2SJed Brown 425179860b2SJed Brown def setSharedLinkerObject(self, language, linker): 426179860b2SJed Brown self.sharedLinkerObject[language] = linker 427179860b2SJed Brown return self.getSharedLinkerObject(language) 428179860b2SJed Brown 429179860b2SJed Brown def getDynamicLinkerObject(self, language): 430179860b2SJed Brown if not language in self.dynamicLinkerObject: 431179860b2SJed Brown self.dynamicLinkerObject[language] = self.getLanguageModule(language).DynamicLinker(self.argDB) 432179860b2SJed Brown self.dynamicLinkerObject[language].setup() 433179860b2SJed Brown if not self.compilers is None: 434179860b2SJed Brown self.dynamicLinkerObject[language].configCompilers = self.compilers 435179860b2SJed Brown if not self.libraries is None: 436179860b2SJed Brown self.dynamicLinkerObject[language].configLibraries = self.libraries 437179860b2SJed Brown if not self.versionControl is None: 438179860b2SJed Brown self.dynamicLinkerObject[language].versionControl = self.versionControl 439179860b2SJed Brown return self.dynamicLinkerObject[language] 440179860b2SJed Brown 441179860b2SJed Brown def setDynamicLinkerObject(self, language, linker): 442179860b2SJed Brown self.dynamicLinkerObject[language] = linker 443179860b2SJed Brown return self.getDynamicLinkerObject(language) 444