1#!/usr/bin/env python 2from __future__ import generators 3import config.base 4import os 5 6class Configure(config.base.Configure): 7 def __init__(self, framework): 8 config.base.Configure.__init__(self, framework) 9 self.headerPrefix = '' 10 self.substPrefix = '' 11 self.isprefix = False 12 self.dir = '' 13 return 14 15 def __str1__(self): 16 if self.isprefix: 17 return ' Prefix: ' + self.dir + '\n' 18 else: 19 return ' Prefix: <inplace installation>\n' 20 21 def setupHelp(self, help): 22 import nargs 23 help.addArgument('PETSc', '-with-clean=<bool>', nargs.ArgBool(None, 0, 'Delete prior build files including externalpackages')) 24 return 25 26 def setupDependencies(self, framework): 27 config.base.Configure.setupDependencies(self, framework) 28 self.petscdir = framework.require('PETSc.options.petscdir', self) 29 self.arch = framework.require('PETSc.options.arch', self) 30 return 31 32 def setInstallDir(self): 33 ''' setup installDir to either prefix or if that is not set to PETSC_DIR/PETSC_ARCH''' 34 self.installSudo = '' 35 if self.framework.argDB['prefix']: 36 self.isprefix = True 37 self.dir = os.path.abspath(os.path.expanduser(self.framework.argDB['prefix'])) 38 self.petscDir = self.dir 39 self.petscArch = '' 40 try: 41 os.makedirs(os.path.join(self.dir,'PETScTestDirectory')) 42 os.rmdir(os.path.join(self.dir,'PETScTestDirectory')) 43 except Exception as e: 44 self.logPrint('Error trying to to test write permissions on directory '+str(e)) 45 self.installSudo = 'sudo ' 46 else: 47 self.dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 48 self.petscDir = self.petscdir.dir 49 self.petscArch = self.arch.arch 50 self.addMakeMacro('PREFIXDIR',self.dir) 51 self.confDir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 52 53 def configureInstallDir(self): 54 '''Makes installDir subdirectories if it does not exist for both prefix install location and PETSc work install location''' 55 dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 56 if not os.path.exists(dir): 57 os.makedirs(dir) 58 for i in ['include','lib','bin',os.path.join('lib','petsc','conf')]: 59 newdir = os.path.join(dir,i) 60 if not os.path.exists(newdir): 61 os.makedirs(newdir) 62 if os.path.isfile(self.framework.argDB.saveFilename): 63 os.remove(self.framework.argDB.saveFilename) 64 confdir = os.path.join(dir,'lib','petsc','conf') 65 self.framework.argDB.saveFilename = os.path.abspath(os.path.join(confdir, 'RDict.db')) 66 self.logPrint('Changed persistence directory to '+confdir) 67 return 68 69 def cleanConfDir(self): 70 import shutil 71 if self.framework.argDB['with-clean'] and os.path.isdir(self.confDir): 72 self.logPrintBox('Warning: "with-clean" is specified. Removing all build files from '+ self.confDir) 73 shutil.rmtree(self.confDir) 74 return 75 76 def saveReconfigure(self): 77 self.reconfigure_file = os.path.join(self.dir,'lib','petsc','conf','reconfigure-'+self.arch.arch+'.py') 78 self.save_reconfigure_file = None 79 if self.framework.argDB['with-clean'] and os.path.exists(self.reconfigure_file): 80 self.save_reconfigure_file = '.save.reconfigure-'+self.arch.arch+'.py' 81 try: 82 if os.path.exists(self.save_reconfigure_file): os.unlink(self.save_reconfigure_file) 83 os.rename(self.reconfigure_file,self.save_reconfigure_file) 84 except Exception as e: 85 self.save_reconfigure_file = None 86 self.logPrint('error in saveReconfigure(): '+ str(e)) 87 return 88 89 def restoreReconfigure(self): 90 if self.framework.argDB['with-clean'] and self.save_reconfigure_file: 91 try: 92 os.rename(self.save_reconfigure_file,self.reconfigure_file) 93 except Exception as e: 94 self.logPrint('error in restoreReconfigure(): '+ str(e)) 95 return 96 97 def configure(self): 98 self.executeTest(self.setInstallDir) 99 self.executeTest(self.saveReconfigure) 100 self.executeTest(self.cleanConfDir) 101 self.executeTest(self.configureInstallDir) 102 self.executeTest(self.restoreReconfigure) 103 return 104