1#!/usr/bin/env python 2from __future__ import generators 3import user 4import config.base 5import os 6 7class Configure(config.base.Configure): 8 def __init__(self, framework): 9 config.base.Configure.__init__(self, framework) 10 self.headerPrefix = '' 11 self.substPrefix = '' 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.arch = framework.require('PETSc.options.arch', self) 25 return 26 27 def printSudoPasswordMessage(self,needsudo = 1): 28 '''Prints a message that sudo password will be needed for installs of packages''' 29 '''Packages like sowing and make that are never installed in an sudo location would pass 0 for needsudo''' 30 if needsudo and self.installSudoMessage: 31 self.logPrintBox(self.installSudoMessage) 32 self.installSudoMessage = '' 33 34 def setInstallDir(self): 35 ''' setup installDir to either prefix or if that is not set to PETSC_DIR/PETSC_ARCH''' 36 self.installSudo = '' 37 self.installSudoMessage = '' 38 if self.framework.argDB['prefix']: 39 self.dir = self.framework.argDB['prefix'] 40 try: 41 os.makedirs(os.path.join(self.dir,'PETScTestDirectory')) 42 os.rmdir(os.path.join(self.dir,'PETScTestDirectory')) 43 except: 44 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' 45 self.installSudo = 'sudo ' 46 else: 47 self.dir = os.path.abspath(os.path.join(self.arch.arch)) 48 self.confDir = os.path.abspath(os.path.join(self.arch.arch)) 49 50 def configureInstallDir(self): 51 '''Makes installDir subdirectories if it does not exist for both prefix install location and PETSc work install location''' 52 dir = os.path.abspath(os.path.join(self.arch.arch)) 53 if not os.path.exists(dir): 54 os.makedirs(dir) 55 for i in ['include','lib','bin','conf']: 56 newdir = os.path.join(dir,i) 57 if not os.path.exists(newdir): 58 os.makedirs(newdir) 59 if os.path.isfile(self.framework.argDB.saveFilename): 60 os.remove(self.framework.argDB.saveFilename) 61 confdir = os.path.join(dir,'conf') 62 self.framework.argDB.saveFilename = os.path.abspath(os.path.join(confdir, 'RDict.db')) 63 self.framework.logPrint('Changed persistence directory to '+confdir) 64 return 65 66 def cleanInstallDir(self): 67 import shutil 68 if self.framework.argDB['with-clean'] and os.path.isdir(self.dir): 69 self.logPrintBox('Warning: "with-clean" is specified. Removing all build files from '+ self.dir) 70 shutil.rmtree(self.dir) 71 return 72 73 def saveReconfigure(self): 74 self.reconfigure_file = os.path.join(self.dir,'conf','reconfigure-'+self.arch.arch+'.py') 75 self.save_reconfigure_file = None 76 if self.framework.argDB['with-clean'] and os.path.exists(self.reconfigure_file): 77 self.save_reconfigure_file = '.save.reconfigure-'+self.arch.arch+'.py' 78 try: 79 if os.path.exists(self.save_reconfigure_file): os.unlink(self.save_reconfigure_file) 80 os.rename(self.reconfigure_file,self.save_reconfigure_file) 81 except Exception, e: 82 self.save_reconfigure_file = None 83 self.framework.logPrint('error in saveReconfigure(): '+ str(e)) 84 return 85 86 def restoreReconfigure(self): 87 if self.framework.argDB['with-clean'] and self.save_reconfigure_file: 88 try: 89 os.rename(self.save_reconfigure_file,self.reconfigure_file) 90 except Exception, e: 91 self.framework.logPrint('error in restoreReconfigure(): '+ str(e)) 92 return 93 94 def configure(self): 95 self.executeTest(self.setInstallDir) 96 self.executeTest(self.saveReconfigure) 97 self.executeTest(self.cleanInstallDir) 98 self.executeTest(self.configureInstallDir) 99 self.executeTest(self.restoreReconfigure) 100 return 101