1import config.package 2 3class Configure(config.package.Package): 4 def __init__(self, framework): 5 config.package.Package.__init__(self, framework) 6 self.gitcommit = 'v5.0-p1' 7 self.download = ['git://https://bitbucket.org/petsc/pkg-superlu.git', 8 'http://ftp.mcs.anl.gov/pub/petsc/externalpackages/superlu_5.0-p1.tar.gz'] 9 self.functions = ['set_default_options'] 10 self.includes = ['slu_ddefs.h'] 11 self.liblist = [['libsuperlu_5.0.a']] 12 # SuperLU has NO support for 64 bit integers, use SuperLU_Dist if you need that 13 self.requires32bitint = 1; # 1 means that the package will not work with 64 bit integers 14 self.excludedDirs = ['SuperLU_DIST','SuperLU_MT'] 15 # SuperLU does not work with --download-fblaslapack with Compaqf90 compiler on windows. 16 # However it should work with intel ifort. 17 self.downloadonWindows= 1 18 self.hastests = 1 19 self.hastestsdatafiles= 1 20 return 21 22 def setupDependencies(self, framework): 23 config.package.Package.setupDependencies(self, framework) 24 self.blasLapack = self.framework.require('config.packages.BlasLapack',self) 25 self.deps = [self.blasLapack] 26 return 27 28 def Install(self): 29 import os 30 if (self.compilers.c99flag == None): 31 raise RuntimeError(self.PACKAGE+': install requires c99 compiler. Configure cold not determine compatilbe compiler flag. Perhaps you can specify via CFLAG') 32 if not self.make.haveGNUMake: 33 raise RuntimeError(self.PACKAGE+': install requires GNU make. Suggest using --download-make') 34 35 g = open(os.path.join(self.packageDir,'make.inc'),'w') 36 g.write('SuperLUroot = '+self.packageDir+'\n') 37 g.write('TMGLIB = tmglib.'+self.setCompilers.AR_LIB_SUFFIX+'\n') 38 g.write('SUPERLULIB = $(SuperLUroot)/lib/libsuperlu_5.0.'+self.setCompilers.AR_LIB_SUFFIX+'\n') 39 g.write('BLASLIB = '+self.libraries.toString(self.blasLapack.dlib)+'\n') 40 g.write('BLASDEF = -DUSE_VENDOR_BLAS\n') 41 g.write('LIBS = $(SUPERLULIB) $(BLASLIB)\n') 42 g.write('ARCH = '+self.setCompilers.AR+'\n') 43 g.write('ARCHFLAGS = '+self.setCompilers.AR_FLAGS+'\n') 44 g.write('RANLIB = '+self.setCompilers.RANLIB+'\n') 45 self.setCompilers.pushLanguage('C') 46 g.write('CC = '+self.setCompilers.getCompiler()+'\n') 47 g.write('CFLAGS = '+self.setCompilers.getCompilerFlags()+'\n') 48 g.write('LOADER = '+self.setCompilers.getLinker()+'\n') 49 g.write('LOADOPTS = \n') 50 self.setCompilers.popLanguage() 51 52 # set blas name mangling 53 if self.blasLapack.mangling == 'underscore': 54 g.write('CDEFS = -DAdd_') 55 elif self.blasLapack.mangling == 'caps': 56 g.write('CDEFS = -DUpCase') 57 else: 58 g.write('CDEFS = -DNoChange') 59 g.write('\n') 60 61 g.write('MATLAB =\n') 62 g.write('NOOPTS = '+self.getSharedFlag(self.setCompilers.getCompilerFlags())+' '+self.getPointerSizeFlag(self.setCompilers.getCompilerFlags())+' '+self.getWindowsNonOptFlags(self.setCompilers.getCompilerFlags())+'\n') 63 g.close() 64 if self.installNeeded('make.inc'): 65 try: 66 self.logPrintBox('Compiling and installing superlu; this may take several minutes') 67 self.installDirProvider.printSudoPasswordMessage() 68 output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+os.path.join(self.installDir,'lib'), timeout=2500, log=self.log) 69 output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+os.path.join(self.installDir,'include'), timeout=2500, log=self.log) 70 if not os.path.exists(os.path.join(self.packageDir,'lib')): 71 os.makedirs(os.path.join(self.packageDir,'lib')) 72 # SLASRC,DLASRC,SCLAUX,DZLAUX appear to be required in 5.0 73 output,err,ret = config.package.Package.executeShellCommand('cd '+self.packageDir+' && '+self.make.make+' clean && '+self.make.make+' superlulib LAAUX="" CLASRC="" ZLASRC="zlacon2.o" && '+self.installSudo+'cp -f lib/*.'+self.setCompilers.AR_LIB_SUFFIX+' '+os.path.join(self.installDir,self.libdir,'')+' && '+self.installSudo+'cp -f SRC/*.h '+os.path.join(self.installDir,self.includedir,''), timeout=2500, log = self.log) 74 except RuntimeError, e: 75 raise RuntimeError('Error running make on SUPERLU: '+str(e)) 76 self.postInstall(output+err,'make.inc') 77 return self.installDir 78 79 def consistencyChecks(self): 80 config.package.Package.consistencyChecks(self) 81 if self.argDB['with-'+self.package]: 82 if not self.blasLapack.checkForRoutine('slamch'): 83 raise RuntimeError('SuperLU requires the LAPACK routine slamch()') 84 self.log.write('Found slamch() in Lapack library as needed by SuperLU\n') 85 86 if not self.blasLapack.checkForRoutine('dlamch'): 87 raise RuntimeError('SuperLU requires the LAPACK routine dlamch()') 88 self.log.write('Found dlamch() in Lapack library as needed by SuperLU\n') 89 90 if not self.blasLapack.checkForRoutine('xerbla'): 91 raise RuntimeError('SuperLU requires the BLAS routine xerbla()') 92 self.log.write('Found xerbla() in BLAS library as needed by SuperLU\n') 93 return 94