xref: /petsc/config/BuildSystem/config/compile/processor.py (revision e366c154b69cf29c88be23f768f0f07dd2b3250c)
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