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