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