xref: /petsc/config/BuildSystem/config/packages/pARMS.py (revision 4fc747eaadbeca11629f314a99edccbc2ed7b3d3)
1import config.package
2
3class Configure(config.package.Package):
4  def __init__(self, framework):
5    config.package.Package.__init__(self, framework)
6    self.download  = ['http://ftp.mcs.anl.gov/pub/petsc/externalpackages/pARMS_3.2p3.tar.gz']
7    self.functions = ['parms_PCCreate']
8    self.includes  = ['parms.h']
9    self.liblist   = [['libparms.a']]
10    #self.license   = 'http://www-users.cs.umn.edu/~saad/software/pARMS'
11    return
12
13  def setupDependencies(self, framework):
14    config.package.Package.setupDependencies(self, framework)
15    self.scalartypes =  framework.require('PETSc.options.scalarTypes',self)
16    self.blasLapack  = framework.require('config.packages.BlasLapack',self)
17    self.mpi         = framework.require('config.packages.MPI',self)
18    self.deps        = [self.mpi,self.blasLapack]
19    return
20
21  def Install(self):
22    import os
23
24    # Configure and Build pARMS
25    g = open(os.path.join(self.packageDir,'makefile.in'),'w')
26    g.write('SHELL =	/bin/sh\n')
27    g.write('.SUFFIXES:\n')
28    g.write('.SUFFIXES: .c .o .f .F\n')
29
30    # C compiler
31    self.setCompilers.pushLanguage('C')
32    g.write('CC         = '+self.setCompilers.getCompiler()+'\n')
33    g.write('CFLAGS     = '+self.removeWarningFlags(self.setCompilers.getCompilerFlags())+' -DUSE_MPI -DREAL=double -DHAS_BLAS ')
34    if self.scalartypes.scalartype == 'complex':
35      g.write('-DDBL_CMPLX\n')
36    else:
37      g.write('-DDBL\n')
38    self.setCompilers.popLanguage()
39
40    # BLAS mangling
41    if self.blasLapack.mangling == 'underscore':
42      g.write('CFDEFS     = -DFORTRAN_UNDERSCORE\n')
43    elif self.blasLapack.mangling == 'caps':
44      g.write('CFDEFS     = -DFORTRAN_CAPS\n')
45    elif self.blasLapack.mangling == 'unchanged':
46      g.write('CFDEFS     = \n')
47    else:
48      raise RuntimeError('Unknown blas mangling: cannot proceed with pARMS: '+str(self.blasLapack.mangling))
49    g.write('CFFLAGS    = ${CFDEFS} -DVOID_POINTER_SIZE_'+str(self.types.sizes['known-sizeof-void-p'])+'\n')
50
51    g.write('RM         = rm\n')
52    g.write('RMFLAGS    = -rf\n')
53    g.write('EXTFLAGS   = -x\n')
54
55    # archive and options
56    g.write('AR         = '+self.setCompilers.AR+'\n')
57    g.write('ARFLAGS    = '+self.setCompilers.AR_FLAGS+'\n')
58
59    # pARMS lib and its directory
60    g.write('LIBDIR     = '+self.installDir+'/lib\n')
61    g.write('LIB        = ${LIBDIR}/libparms.a\n')
62    g.write('LIBFLAGS   = -L${LIBDIR}\n')
63    g.write('PARMS_LIBS = -lparms\n')
64
65    #-----------------------------------------
66    g.close()
67
68    if self.installNeeded('makefile.in'):
69      try:
70        self.logPrintBox('Compiling pARMS; this may take several minutes')
71        libDir = os.path.join(self.installDir, self.libdir,'')
72        incDir = os.path.join(self.installDir, self.includedir,'')
73        if not os.path.isdir(libDir):
74          os.mkdir(libDir)
75        self.installDirProvider.printSudoPasswordMessage()
76        output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+libDir, timeout=2500, log=self.log)
77        output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+incDir, timeout=2500, log=self.log)
78        output,err,ret  = config.package.Package.executeShellCommand('cd '+self.packageDir+' && make cleanall && make OBJ3="" && '+self.installSudo+'cp -f include/*.h '+incDir +' && '+self.installSudo+'cp lib/* '+libDir, timeout=2500, log = self.log)
79      except RuntimeError, e:
80        raise RuntimeError('Error running make on pARMS: '+str(e))
81      self.postInstall(output+err,'makefile.in')
82    return self.installDir
83