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