xref: /petsc/config/PETSc/options/languages.py (revision 017deb10d530c1b6d9744fcd772cd96c5fcd74f2)
19d310bb7SBarry Smithfrom __future__ import generators
29d310bb7SBarry Smithimport config.base
39d310bb7SBarry Smith
49d310bb7SBarry Smithclass Configure(config.base.Configure):
59d310bb7SBarry Smith  def __init__(self, framework):
69d310bb7SBarry Smith    config.base.Configure.__init__(self, framework)
79d310bb7SBarry Smith    self.headerPrefix = ''
89d310bb7SBarry Smith    self.substPrefix  = ''
99d310bb7SBarry Smith    return
109d310bb7SBarry Smith
119d310bb7SBarry Smith  def __str1__(self):
129d310bb7SBarry Smith    if not hasattr(self, 'clanguage'):
139d310bb7SBarry Smith      return ''
1461897808SPierre Jolivet    desc = ['PETSc:']
1561897808SPierre Jolivet    desc.append('  Language used to compile PETSc: ' + self.clanguage)
16*c95305b8SPierre Jolivet    desc.append('  Language used to compile PetscDevice: ' + self.devicelanguage)
1761897808SPierre Jolivet    return '\n'.join(desc)+'\n'
189d310bb7SBarry Smith
199d310bb7SBarry Smith  def setupHelp(self, help):
209d310bb7SBarry Smith    import nargs
219d310bb7SBarry Smith    help.addArgument('PETSc', '-with-clanguage=<C or C++>', nargs.Arg(None, 'C', 'Specify C (recommended) or C++ to compile PETSc. You can use C++ in either case.'))
22*c95305b8SPierre Jolivet    help.addArgument('PETSc', '-with-devicelanguage=<C or C++>', nargs.Arg(None, None, 'Specify C or C++ to compile PetscDevice. You cannot use C if you either use --with-clanguage=C++ or you are using devices such as NVIDIA GPUs. You cannot use C++ if you use --with-cxx=0.'))
239d310bb7SBarry Smith    return
249d310bb7SBarry Smith
259d310bb7SBarry Smith  def setupDependencies(self, framework):
269d310bb7SBarry Smith    config.base.Configure.setupDependencies(self, framework)
279d310bb7SBarry Smith    return
289d310bb7SBarry Smith
299d310bb7SBarry Smith  def configureCLanguage(self):
309d310bb7SBarry Smith    '''Choose whether to compile the PETSc library using a C or C++ compiler'''
319d310bb7SBarry Smith    self.clanguage = self.framework.argDB['with-clanguage'].upper().replace('+','x').replace('X','x')
329d310bb7SBarry Smith    if not self.clanguage in ['C', 'Cxx']:
339d310bb7SBarry Smith      raise RuntimeError('Invalid C language specified: '+str(self.clanguage))
34bb376940SSatish Balay    if self.clanguage == 'Cxx':
35408d3fceSSatish Balay      self.logPrintBox('WARNING -with-clanguage=C++ is a developer feature and is *not* required for regular usage of PETSc either from C or C++')
367ad10985SMatthew G. Knepley    self.logPrint('C language is '+str(self.clanguage))
379d310bb7SBarry Smith    self.addDefine('CLANGUAGE_'+self.clanguage.upper(),'1')
38f5718a65SBarry Smith    self.addMakeMacro('CLANGUAGE',self.clanguage.upper())
399d310bb7SBarry Smith
40*c95305b8SPierre Jolivet  def configureDeviceLanguage(self):
41*c95305b8SPierre Jolivet    '''Choose whether to compile the PetscDevice code using a C or C++ compiler'''
42*c95305b8SPierre Jolivet    if 'with-devicelanguage' in self.argDB:
43*c95305b8SPierre Jolivet      self.devicelanguage = self.framework.argDB['with-devicelanguage'].upper().replace('+','x').replace('X','x')
44*c95305b8SPierre Jolivet      if not self.devicelanguage in ['C', 'Cxx']:
45*c95305b8SPierre Jolivet        raise RuntimeError('Invalid PetscDevice language specified: '+str(self.devicelanguage))
46*c95305b8SPierre Jolivet      if self.clanguage == 'Cxx' and self.devicelanguage == 'C':
47*c95305b8SPierre Jolivet        raise RuntimeError('Cannot use both --with-clanguage=C++ and --with-devicelanguage=C')
48*c95305b8SPierre Jolivet      self.logPrint('PetscDevice language is '+str(self.devicelanguage))
49*c95305b8SPierre Jolivet      self.addDefine('DEVICELANGUAGE_'+self.devicelanguage.upper(),'1')
50*c95305b8SPierre Jolivet      self.addMakeMacro('DEVICELANGUAGE',self.devicelanguage.upper())
51*c95305b8SPierre Jolivet    else:
52*c95305b8SPierre Jolivet      self.logPrint('PetscDevice language will be determined once all package dependencies have been configured')
53*c95305b8SPierre Jolivet      self.devicelanguage = ''
54*c95305b8SPierre Jolivet
559d310bb7SBarry Smith  def configure(self):
569d310bb7SBarry Smith    self.executeTest(self.configureCLanguage)
57*c95305b8SPierre Jolivet    self.executeTest(self.configureDeviceLanguage)
589d310bb7SBarry Smith    return
59