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