xref: /petsc/config/PETSc/options/installDir.py (revision 7ad1098541f8a490cd032a2f4153a5aee266e4b3)
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  = ''
129d310bb7SBarry Smith    return
139d310bb7SBarry Smith
149d310bb7SBarry Smith  def __str__(self):
159d310bb7SBarry Smith    return ''
169d310bb7SBarry Smith
179d310bb7SBarry Smith  def setupHelp(self, help):
189d310bb7SBarry Smith    import nargs
199d310bb7SBarry Smith    help.addArgument('PETSc', '-with-clean=<bool>',         nargs.ArgBool(None, 0, 'Delete prior build files including externalpackages'))
209d310bb7SBarry Smith    return
219d310bb7SBarry Smith
229d310bb7SBarry Smith  def setupDependencies(self, framework):
239d310bb7SBarry Smith    config.base.Configure.setupDependencies(self, framework)
245bb5b263SMatthew G. Knepley    self.petscdir = framework.require('PETSc.options.petscdir', self)
259d310bb7SBarry Smith    self.arch     = framework.require('PETSc.options.arch', self)
269d310bb7SBarry Smith    return
279d310bb7SBarry Smith
289d310bb7SBarry Smith  def printSudoPasswordMessage(self,needsudo = 1):
299d310bb7SBarry Smith    '''Prints a message that sudo password will be needed for installs of packages'''
309d310bb7SBarry Smith    '''Packages like sowing and make that are never installed in an sudo location would pass 0 for needsudo'''
319d310bb7SBarry Smith    if needsudo and self.installSudoMessage:
329d310bb7SBarry Smith      self.logPrintBox(self.installSudoMessage)
339d310bb7SBarry Smith      self.installSudoMessage = ''
349d310bb7SBarry Smith
359d310bb7SBarry Smith  def setInstallDir(self):
369d310bb7SBarry Smith    ''' setup installDir to either prefix or if that is not set to PETSC_DIR/PETSC_ARCH'''
379d310bb7SBarry Smith    self.installSudo        = ''
389d310bb7SBarry Smith    self.installSudoMessage = ''
399d310bb7SBarry Smith    if self.framework.argDB['prefix']:
409d310bb7SBarry Smith      self.dir = self.framework.argDB['prefix']
419d310bb7SBarry Smith      try:
429d310bb7SBarry Smith        os.makedirs(os.path.join(self.dir,'PETScTestDirectory'))
439d310bb7SBarry Smith        os.rmdir(os.path.join(self.dir,'PETScTestDirectory'))
449d310bb7SBarry Smith      except:
459d310bb7SBarry 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'
469d310bb7SBarry Smith        self.installSudo = 'sudo '
479d310bb7SBarry Smith    else:
485bb5b263SMatthew G. Knepley      self.dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch))
495bb5b263SMatthew G. Knepley    self.confDir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch))
509d310bb7SBarry Smith
519d310bb7SBarry Smith  def configureInstallDir(self):
529d310bb7SBarry Smith    '''Makes  installDir subdirectories if it does not exist for both prefix install location and PETSc work install location'''
535bb5b263SMatthew G. Knepley    dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch))
549d310bb7SBarry Smith    if not os.path.exists(dir):
559d310bb7SBarry Smith      os.makedirs(dir)
56af0996ceSBarry Smith    for i in ['include','lib','bin',os.path.join('lib','petsc','conf')]:
579d310bb7SBarry Smith      newdir = os.path.join(dir,i)
589d310bb7SBarry Smith      if not os.path.exists(newdir):
599d310bb7SBarry Smith        os.makedirs(newdir)
609d310bb7SBarry Smith    if os.path.isfile(self.framework.argDB.saveFilename):
619d310bb7SBarry Smith      os.remove(self.framework.argDB.saveFilename)
62af0996ceSBarry Smith    confdir = os.path.join(dir,'lib','petsc','conf')
639d310bb7SBarry Smith    self.framework.argDB.saveFilename = os.path.abspath(os.path.join(confdir, 'RDict.db'))
64*7ad10985SMatthew G. Knepley    self.logPrint('Changed persistence directory to '+confdir)
659d310bb7SBarry Smith    return
669d310bb7SBarry Smith
679d310bb7SBarry Smith  def cleanInstallDir(self):
689d310bb7SBarry Smith    import shutil
699d310bb7SBarry Smith    if self.framework.argDB['with-clean'] and os.path.isdir(self.dir):
709d310bb7SBarry Smith      self.logPrintBox('Warning: "with-clean" is specified. Removing all build files from '+ self.dir)
719d310bb7SBarry Smith      shutil.rmtree(self.dir)
729d310bb7SBarry Smith    return
739d310bb7SBarry Smith
749d310bb7SBarry Smith  def saveReconfigure(self):
75af0996ceSBarry Smith    self.reconfigure_file = os.path.join(self.dir,'lib','petsc','conf','reconfigure-'+self.arch.arch+'.py')
769d310bb7SBarry Smith    self.save_reconfigure_file = None
779d310bb7SBarry Smith    if self.framework.argDB['with-clean'] and os.path.exists(self.reconfigure_file):
789d310bb7SBarry Smith      self.save_reconfigure_file = '.save.reconfigure-'+self.arch.arch+'.py'
799d310bb7SBarry Smith      try:
809d310bb7SBarry Smith        if os.path.exists(self.save_reconfigure_file): os.unlink(self.save_reconfigure_file)
819d310bb7SBarry Smith        os.rename(self.reconfigure_file,self.save_reconfigure_file)
829d310bb7SBarry Smith      except Exception, e:
839d310bb7SBarry Smith        self.save_reconfigure_file = None
84*7ad10985SMatthew G. Knepley        self.logPrint('error in saveReconfigure(): '+ str(e))
859d310bb7SBarry Smith    return
869d310bb7SBarry Smith
879d310bb7SBarry Smith  def restoreReconfigure(self):
889d310bb7SBarry Smith    if self.framework.argDB['with-clean'] and self.save_reconfigure_file:
899d310bb7SBarry Smith      try:
909d310bb7SBarry Smith        os.rename(self.save_reconfigure_file,self.reconfigure_file)
919d310bb7SBarry Smith      except Exception, e:
92*7ad10985SMatthew G. Knepley        self.logPrint('error in restoreReconfigure(): '+ str(e))
939d310bb7SBarry Smith    return
949d310bb7SBarry Smith
959d310bb7SBarry Smith  def configure(self):
969d310bb7SBarry Smith    self.executeTest(self.setInstallDir)
979d310bb7SBarry Smith    self.executeTest(self.saveReconfigure)
989d310bb7SBarry Smith    self.executeTest(self.cleanInstallDir)
999d310bb7SBarry Smith    self.executeTest(self.configureInstallDir)
1009d310bb7SBarry Smith    self.executeTest(self.restoreReconfigure)
1019d310bb7SBarry Smith    return
102