1import args 2import logger 3 4class Processor(logger.Logger): 5 '''This class is intended to provide a basis for language operations, such as compiling and linking. Each operation will have a Processor.''' 6 def __init__(self, argDB, name, flagsName, sourceExtension, targetExtension): 7 logger.Logger.__init__(self, None, argDB) 8 self.language = 'C' 9 self.name = name 10 if isinstance(flagsName, list): 11 self.flagsName = flagsName 12 else: 13 self.flagsName = [flagsName] 14 self.requiredFlags = [''] 15 self.outputFlag = '' 16 self.sourceExtension = sourceExtension 17 self.targetExtension = targetExtension 18 return 19 20 def copy(self, other): 21 other.language = self.language 22 other.name = self.name 23 other.flagsName = self.flagsName[:] 24 other.requiredFlags = self.requiredFlags[:] 25 other.outputFlag = self.outputFlag 26 other.sourceExtension = self.sourceExtension 27 other.targetExtension = self.targetExtension 28 return 29 30 def setArgDB(self, argDB): 31 args.ArgumentProcessor.setArgDB(self, argDB) 32 if hasattr(self, 'configCompilers'): 33 if not self.configCompilers.argDB == argDB: 34 self.configCompilers.argDB = argDB 35 if not self.configCompilers.framework.argDB == argDB: 36 self.configCompilers.framework.argDB = argDB 37 if hasattr(self, 'configLibraries'): 38 if not self.configLibraries.argDB == argDB: 39 self.configLibraries.argDB = argDB 40 if not self.configLibraries.framework.argDB == argDB: 41 self.configLibraries.framework.argDB = argDB 42 if hasattr(self, 'versionControl'): 43 self.versionControl.argDB = argDB 44 return 45 argDB = property(args.ArgumentProcessor.getArgDB, setArgDB, doc = 'The RDict argument database') 46 47 def getName(self): 48 if not hasattr(self, '_name'): 49 raise RuntimeError('No valid argument name set for '+self.language+' '+self.__class__.__name__.lower()) 50 if isinstance(self._name, list): 51 for n in self._name: 52 if hasattr(self, 'configCompilers') and hasattr(self.configCompilers, n): 53 self._name = n 54 break 55 if n in self.argDB: 56 self._name = n 57 break 58 if isinstance(self._name, list): 59 if hasattr(self, 'configCompilers'): 60 raise RuntimeError('Name '+str(self._name)+' was not found in RDict or configure data') 61 else: 62 raise RuntimeError('Name '+str(self._name)+' was not found in RDict') 63 return self._name 64 65 def setName(self, name): 66 self._name = name 67 return 68 name = property(getName, setName, doc = 'The name of the processor in RDict') 69 70 def pushRequiredFlags(self, flags): 71 self.requiredFlags.append(flags) 72 return 73 def popRequiredFlags(self): 74 self.requiredFlags.pop() 75 return 76 77 def checkSetup(self): 78 '''Check that this program has been specified. We assume that configure has checked its viability.''' 79 if hasattr(self, 'configCompilers') and hasattr(self.configCompilers, self.name): 80 pass 81 elif not self.name in self.argDB: 82 raise RuntimeError('Could not find a '+self.language+' '+self.__class__.__name__.lower()+'. Please set with the option --with-'+self.name.lower()+' or -'+self.name+' and load the config.compilers module.') 83 return 84 85 def getProcessor(self): 86 '''Returns the processor executable''' 87 if hasattr(self, 'configCompilers'): 88 return getattr(self.configCompilers, self.name) 89 return self.argDB[self.name] 90 91 def getFlags(self): 92 '''Returns a string with the flags specified for running this processor.''' 93 # can't change _flags - as this broke triangle build 94 if not hasattr(self, '_flags'): 95 if hasattr(self, 'configCompilers'): 96 flags = ' '.join([getattr(self.configCompilers, name) for name in self.flagsName]) 97 else: 98 flags = ' '.join([self.argDB[name] for name in self.flagsName]) 99 return flags 100 return self._flags 101 def setFlags(self, flags): 102 self._flags = flags 103 flags = property(getFlags, setFlags, doc = 'The flags for the executable') 104 105 def getExtraArguments(self): 106 '''Returns a string which should be appended to every command''' 107 if not hasattr(self, '_extraArguments'): 108 return '' 109 return self._extraArguments 110 def setExtraArguments(self, extraArguments): 111 self._extraArguments = extraArguments 112 return 113 extraArguments = property(getExtraArguments, setExtraArguments, doc = 'Optional arguments for the end of the command') 114 115 def getTarget(self, source, shared = 0): 116 '''Returns the default target for the given source file, or None''' 117 return None 118 119 def getCommand(self, sourceFiles, outputFile = None): 120 '''Returns a shell command as a string which will invoke the processor on sourceFiles, producing outputFile if given''' 121 if isinstance(sourceFiles, str): 122 sourceFiles = [sourceFiles] 123 cmd = [self.getProcessor()] 124 cmd.append(self.requiredFlags[-1]) 125 if not outputFile is None: 126 cmd.extend([self.outputFlag, outputFile]) 127 if hasattr(self, 'includeDirectories'): 128 cmd.extend(['-I'+inc for inc in self.includeDirectories]) 129 cmd.append(self.flags) 130 cmd.extend(sourceFiles) 131 cmd.append(self.extraArguments) 132 if hasattr(self, 'libraries') and hasattr(self, 'configLibraries'): 133 self.configLibraries.pushLanguage(self.language) 134 cmd.extend([self.configLibraries.getLibArgument(lib) for lib in self.libraries]) 135 self.configLibraries.popLanguage() 136 return ' '.join(cmd) 137