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