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