xref: /petsc/config/PETSc/options/installDir.py (revision 8ca03633f5b9a5a19b5e3a5e2fc208230c2fe2ef)
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