1import config.package 2import os 3 4class Configure(config.package.GNUPackage): 5 def __init__(self, framework): 6 config.package.GNUPackage.__init__(self, framework) 7 self.download = ['http://ftp.mcs.anl.gov/pub/petsc/externalpackages/zoltan_distrib_v3.83.tar.gz'] 8 self.functions = ['Zoltan_LB_Partition'] 9 self.includes = ['zoltan.h'] 10 self.liblist = [['libzoltan.a']] 11 self.license = 'http://www.cs.sandia.gov/Zoltan/Zoltan.html' 12 13 def setupDependencies(self, framework): 14 config.package.GNUPackage.setupDependencies(self, framework) 15 self.parmetis = framework.require('config.packages.parmetis',self) 16 self.ptscotch = framework.require('config.packages.PTScotch',self) 17 self.mpi = framework.require('config.packages.MPI',self) 18 self.mathlib = framework.require('config.packages.mathlib',self) 19 self.deps = [self.mpi,self.mathlib] 20 self.odeps = [self.parmetis, self.ptscotch] 21 22 def formGNUConfigureArgs(self): 23 args = config.package.GNUPackage.formGNUConfigureArgs(self) 24 if self.getDefaultIndexSize() == 64: 25 args.append('--with-id-type=ullong') 26 args.append('--enable-mpi') 27 if not hasattr(self.compilers, 'CXX'): 28 raise RuntimeError('Error: Zoltan requires C++ compiler. None specified') 29 30 args.append('CPPFLAGS="'+self.headers.toStringNoDupes(self.dinclude)+'"') 31 args.append('LIBS="'+self.libraries.toStringNoDupes(self.dlib)+'"') 32 if hasattr(self.compilers, 'FC'): 33 args.append('--enable-f90interface') 34 args.append('FCFLAGS="'+self.headers.toStringNoDupes(self.dinclude)+'"') 35 if self.parmetis.found: 36 args.append('--with-parmetis') 37 if self.ptscotch.found: 38 args.append('--with-scotch') 39 return args 40 41 def Install(self): 42 '''Zoltan does not have a make clean''' 43 packageDir = os.path.join(self.packageDir,'petsc-build') 44 args = self.formGNUConfigureArgs() 45 args = ' '.join(args) 46 conffile = os.path.join(self.packageDir,self.package+'.petscconf') 47 fd = open(conffile, 'w') 48 fd.write(args) 49 fd.close() 50 51 if not self.installNeeded(conffile): 52 return self.installDir 53 54 output1,err1,ret1 = config.base.Configure.executeShellCommand('rm -rf '+packageDir+' && mkdir '+packageDir, timeout=2000, log = self.log) 55 try: 56 self.logPrintBox('Running configure on ' +self.PACKAGE+'; this may take several minutes') 57 output1,err1,ret1 = config.base.Configure.executeShellCommand('cd '+packageDir+' && ../configure '+args, timeout=2000, log = self.log) 58 except RuntimeError as e: 59 raise RuntimeError('Error running configure on ' + self.PACKAGE+': '+str(e)) 60 try: 61 self.logPrintBox('Running make on '+self.PACKAGE+'; this may take several minutes') 62 63 output2,err2,ret2 = config.base.Configure.executeShellCommand('cd '+packageDir+' && '+self.make.make+' everything', timeout=6000, log = self.log) 64 self.logPrintBox('Running make install on '+self.PACKAGE+'; this may take several minutes') 65 self.installDirProvider.printSudoPasswordMessage(self.installSudo) 66 output3,err3,ret3 = config.base.Configure.executeShellCommand('cd '+packageDir+' && '+self.installSudo+self.make.make+' install', timeout=300, log = self.log) 67 except RuntimeError as e: 68 raise RuntimeError('Error running make; make install on '+self.PACKAGE+': '+str(e)) 69 self.postInstall(output1+err1+output2+err2+output3+err3, conffile) 70 return self.installDir 71 72