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 printSudoPasswordMessage(self,needsudo = 1): 33 '''Prints a message that sudo password will be needed for installs of packages''' 34 '''Packages like sowing and make that are never installed in an sudo location would pass 0 for needsudo''' 35 if needsudo and self.installSudoMessage: 36 self.logPrintBox(self.installSudoMessage) 37 self.installSudoMessage = '' 38 39 def setInstallDir(self): 40 ''' setup installDir to either prefix or if that is not set to PETSC_DIR/PETSC_ARCH''' 41 self.installSudo = '' 42 self.installSudoMessage = '' 43 if self.framework.argDB['prefix']: 44 self.isprefix = True 45 self.dir = os.path.abspath(os.path.expanduser(self.framework.argDB['prefix'])) 46 self.petscDir = self.dir 47 self.petscArch = '' 48 try: 49 os.makedirs(os.path.join(self.dir,'PETScTestDirectory')) 50 os.rmdir(os.path.join(self.dir,'PETScTestDirectory')) 51 except Exception as e: 52 self.logPrint('Error trying to to test write permissions on directory '+str(e)) 53 self.installSudoMessage = 'You do not have write permissions to the --prefix directory '+self.dir+'\nYou will be prompted for the sudo password for any external package installs' 54 self.installSudo = 'sudo ' 55 else: 56 self.dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 57 self.petscDir = self.petscdir.dir 58 self.petscArch = self.arch.arch 59 self.addMakeMacro('PREFIXDIR',self.dir) 60 self.confDir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 61 62 def configureInstallDir(self): 63 '''Makes installDir subdirectories if it does not exist for both prefix install location and PETSc work install location''' 64 dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 65 if not os.path.exists(dir): 66 os.makedirs(dir) 67 for i in ['include','lib','bin',os.path.join('lib','petsc','conf')]: 68 newdir = os.path.join(dir,i) 69 if not os.path.exists(newdir): 70 os.makedirs(newdir) 71 if os.path.isfile(self.framework.argDB.saveFilename): 72 os.remove(self.framework.argDB.saveFilename) 73 confdir = os.path.join(dir,'lib','petsc','conf') 74 self.framework.argDB.saveFilename = os.path.abspath(os.path.join(confdir, 'RDict.db')) 75 self.logPrint('Changed persistence directory to '+confdir) 76 return 77 78 def cleanConfDir(self): 79 import shutil 80 if self.framework.argDB['with-clean'] and os.path.isdir(self.confDir): 81 self.logPrintBox('Warning: "with-clean" is specified. Removing all build files from '+ self.confDir) 82 shutil.rmtree(self.confDir) 83 return 84 85 def saveReconfigure(self): 86 self.reconfigure_file = os.path.join(self.dir,'lib','petsc','conf','reconfigure-'+self.arch.arch+'.py') 87 self.save_reconfigure_file = None 88 if self.framework.argDB['with-clean'] and os.path.exists(self.reconfigure_file): 89 self.save_reconfigure_file = '.save.reconfigure-'+self.arch.arch+'.py' 90 try: 91 if os.path.exists(self.save_reconfigure_file): os.unlink(self.save_reconfigure_file) 92 os.rename(self.reconfigure_file,self.save_reconfigure_file) 93 except Exception as e: 94 self.save_reconfigure_file = None 95 self.logPrint('error in saveReconfigure(): '+ str(e)) 96 return 97 98 def restoreReconfigure(self): 99 if self.framework.argDB['with-clean'] and self.save_reconfigure_file: 100 try: 101 os.rename(self.save_reconfigure_file,self.reconfigure_file) 102 except Exception as e: 103 self.logPrint('error in restoreReconfigure(): '+ str(e)) 104 return 105 106 def configure(self): 107 self.executeTest(self.setInstallDir) 108 self.executeTest(self.saveReconfigure) 109 self.executeTest(self.cleanConfDir) 110 self.executeTest(self.configureInstallDir) 111 self.executeTest(self.restoreReconfigure) 112 return 113