19d310bb7SBarry Smith#!/usr/bin/env python 29d310bb7SBarry Smithfrom __future__ import generators 39d310bb7SBarry Smithimport user 49d310bb7SBarry Smithimport config.base 59d310bb7SBarry Smithimport os 69d310bb7SBarry Smith 79d310bb7SBarry Smithclass Configure(config.base.Configure): 89d310bb7SBarry Smith def __init__(self, framework): 99d310bb7SBarry Smith config.base.Configure.__init__(self, framework) 109d310bb7SBarry Smith self.headerPrefix = '' 119d310bb7SBarry Smith self.substPrefix = '' 125188cb68SSatish Balay self.dir = '' 139d310bb7SBarry Smith return 149d310bb7SBarry Smith 159d310bb7SBarry Smith def __str__(self): 169d310bb7SBarry Smith return '' 179d310bb7SBarry Smith 189d310bb7SBarry Smith def setupHelp(self, help): 199d310bb7SBarry Smith import nargs 209d310bb7SBarry Smith help.addArgument('PETSc', '-with-clean=<bool>', nargs.ArgBool(None, 0, 'Delete prior build files including externalpackages')) 219d310bb7SBarry Smith return 229d310bb7SBarry Smith 239d310bb7SBarry Smith def setupDependencies(self, framework): 249d310bb7SBarry Smith config.base.Configure.setupDependencies(self, framework) 255bb5b263SMatthew G. Knepley self.petscdir = framework.require('PETSc.options.petscdir', self) 269d310bb7SBarry Smith self.arch = framework.require('PETSc.options.arch', self) 279d310bb7SBarry Smith return 289d310bb7SBarry Smith 299d310bb7SBarry Smith def printSudoPasswordMessage(self,needsudo = 1): 309d310bb7SBarry Smith '''Prints a message that sudo password will be needed for installs of packages''' 319d310bb7SBarry Smith '''Packages like sowing and make that are never installed in an sudo location would pass 0 for needsudo''' 329d310bb7SBarry Smith if needsudo and self.installSudoMessage: 339d310bb7SBarry Smith self.logPrintBox(self.installSudoMessage) 349d310bb7SBarry Smith self.installSudoMessage = '' 359d310bb7SBarry Smith 369d310bb7SBarry Smith def setInstallDir(self): 379d310bb7SBarry Smith ''' setup installDir to either prefix or if that is not set to PETSC_DIR/PETSC_ARCH''' 389d310bb7SBarry Smith self.installSudo = '' 399d310bb7SBarry Smith self.installSudoMessage = '' 409d310bb7SBarry Smith if self.framework.argDB['prefix']: 414a08bad0SBarry Smith self.dir = os.path.abspath(os.path.expanduser(self.framework.argDB['prefix'])) 425188cb68SSatish Balay self.petscDir = self.dir 435188cb68SSatish Balay self.petscArch = '' 449d310bb7SBarry Smith try: 459d310bb7SBarry Smith os.makedirs(os.path.join(self.dir,'PETScTestDirectory')) 469d310bb7SBarry Smith os.rmdir(os.path.join(self.dir,'PETScTestDirectory')) 479d310bb7SBarry Smith except: 489d310bb7SBarry 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' 499d310bb7SBarry Smith self.installSudo = 'sudo ' 509d310bb7SBarry Smith else: 515bb5b263SMatthew G. Knepley self.dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 525188cb68SSatish Balay self.petscDir = self.petscdir.dir 535188cb68SSatish Balay self.petscArch = self.arch.arch 54*8ca03633SSatish Balay self.addMakeMacro('PREFIXDIR',self.dir) 555bb5b263SMatthew G. Knepley self.confDir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 569d310bb7SBarry Smith 579d310bb7SBarry Smith def configureInstallDir(self): 589d310bb7SBarry Smith '''Makes installDir subdirectories if it does not exist for both prefix install location and PETSc work install location''' 595bb5b263SMatthew G. Knepley dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 609d310bb7SBarry Smith if not os.path.exists(dir): 619d310bb7SBarry Smith os.makedirs(dir) 62af0996ceSBarry Smith for i in ['include','lib','bin',os.path.join('lib','petsc','conf')]: 639d310bb7SBarry Smith newdir = os.path.join(dir,i) 649d310bb7SBarry Smith if not os.path.exists(newdir): 659d310bb7SBarry Smith os.makedirs(newdir) 669d310bb7SBarry Smith if os.path.isfile(self.framework.argDB.saveFilename): 679d310bb7SBarry Smith os.remove(self.framework.argDB.saveFilename) 68af0996ceSBarry Smith confdir = os.path.join(dir,'lib','petsc','conf') 699d310bb7SBarry Smith self.framework.argDB.saveFilename = os.path.abspath(os.path.join(confdir, 'RDict.db')) 707ad10985SMatthew G. Knepley self.logPrint('Changed persistence directory to '+confdir) 719d310bb7SBarry Smith return 729d310bb7SBarry Smith 739d310bb7SBarry Smith def cleanInstallDir(self): 749d310bb7SBarry Smith import shutil 759d310bb7SBarry Smith if self.framework.argDB['with-clean'] and os.path.isdir(self.dir): 769d310bb7SBarry Smith self.logPrintBox('Warning: "with-clean" is specified. Removing all build files from '+ self.dir) 779d310bb7SBarry Smith shutil.rmtree(self.dir) 789d310bb7SBarry Smith return 799d310bb7SBarry Smith 809d310bb7SBarry Smith def saveReconfigure(self): 81af0996ceSBarry Smith self.reconfigure_file = os.path.join(self.dir,'lib','petsc','conf','reconfigure-'+self.arch.arch+'.py') 829d310bb7SBarry Smith self.save_reconfigure_file = None 839d310bb7SBarry Smith if self.framework.argDB['with-clean'] and os.path.exists(self.reconfigure_file): 849d310bb7SBarry Smith self.save_reconfigure_file = '.save.reconfigure-'+self.arch.arch+'.py' 859d310bb7SBarry Smith try: 869d310bb7SBarry Smith if os.path.exists(self.save_reconfigure_file): os.unlink(self.save_reconfigure_file) 879d310bb7SBarry Smith os.rename(self.reconfigure_file,self.save_reconfigure_file) 889d310bb7SBarry Smith except Exception, e: 899d310bb7SBarry Smith self.save_reconfigure_file = None 907ad10985SMatthew G. Knepley self.logPrint('error in saveReconfigure(): '+ str(e)) 919d310bb7SBarry Smith return 929d310bb7SBarry Smith 939d310bb7SBarry Smith def restoreReconfigure(self): 949d310bb7SBarry Smith if self.framework.argDB['with-clean'] and self.save_reconfigure_file: 959d310bb7SBarry Smith try: 969d310bb7SBarry Smith os.rename(self.save_reconfigure_file,self.reconfigure_file) 979d310bb7SBarry Smith except Exception, e: 987ad10985SMatthew G. Knepley self.logPrint('error in restoreReconfigure(): '+ str(e)) 999d310bb7SBarry Smith return 1009d310bb7SBarry Smith 1019d310bb7SBarry Smith def configure(self): 1029d310bb7SBarry Smith self.executeTest(self.setInstallDir) 1039d310bb7SBarry Smith self.executeTest(self.saveReconfigure) 1049d310bb7SBarry Smith self.executeTest(self.cleanInstallDir) 1059d310bb7SBarry Smith self.executeTest(self.configureInstallDir) 1069d310bb7SBarry Smith self.executeTest(self.restoreReconfigure) 1079d310bb7SBarry Smith return 108