xref: /petsc/config/install.py (revision af0996ce37bc06907c37d8d91773840993d61e62)
10ee81e68SLisandro Dalcin#!/usr/bin/env python
20ee81e68SLisandro Dalcinimport os, sys, shutil
30ee81e68SLisandro Dalcin
40ee81e68SLisandro Dalcinif os.environ.has_key('PETSC_DIR'):
50ee81e68SLisandro Dalcin  PETSC_DIR = os.environ['PETSC_DIR']
60ee81e68SLisandro Dalcinelse:
7*af0996ceSBarry Smith  fd = file(os.path.join('lib','petsc','conf','petscvariables'))
80ee81e68SLisandro Dalcin  a = fd.readline()
90ee81e68SLisandro Dalcin  a = fd.readline()
100ee81e68SLisandro Dalcin  PETSC_DIR = a.split('=')[1][0:-1]
110ee81e68SLisandro Dalcin  fd.close()
120ee81e68SLisandro Dalcin
130ee81e68SLisandro Dalcinif os.environ.has_key('PETSC_ARCH'):
140ee81e68SLisandro Dalcin  PETSC_ARCH = os.environ['PETSC_ARCH']
150ee81e68SLisandro Dalcinelse:
16*af0996ceSBarry Smith  fd = file(os.path.join('lib','petsc','conf','petscvariables'))
170ee81e68SLisandro Dalcin  a = fd.readline()
180ee81e68SLisandro Dalcin  PETSC_ARCH = a.split('=')[1][0:-1]
190ee81e68SLisandro Dalcin  fd.close()
200ee81e68SLisandro Dalcin
210ee81e68SLisandro Dalcinprint '*** Using PETSC_DIR='+PETSC_DIR+' PETSC_ARCH='+PETSC_ARCH+' ***'
220ee81e68SLisandro Dalcinsys.path.insert(0, os.path.join(PETSC_DIR, 'config'))
230ee81e68SLisandro Dalcinsys.path.insert(0, os.path.join(PETSC_DIR, 'config', 'BuildSystem'))
240ee81e68SLisandro Dalcin
250ee81e68SLisandro Dalcinimport script
260ee81e68SLisandro Dalcin
270ee81e68SLisandro Dalcintry:
280ee81e68SLisandro Dalcin  WindowsError
290ee81e68SLisandro Dalcinexcept NameError:
300ee81e68SLisandro Dalcin  WindowsError = None
310ee81e68SLisandro Dalcin
320ee81e68SLisandro Dalcinclass Installer(script.Script):
330ee81e68SLisandro Dalcin  def __init__(self, clArgs = None):
340ee81e68SLisandro Dalcin    import RDict
350ee81e68SLisandro Dalcin    argDB = RDict.RDict(None, None, 0, 0, readonly = True)
36*af0996ceSBarry Smith    argDB.saveFilename = os.path.join(PETSC_DIR, PETSC_ARCH, 'lib','petsc','conf', 'RDict.db')
370ee81e68SLisandro Dalcin    argDB.load()
380ee81e68SLisandro Dalcin    script.Script.__init__(self, argDB = argDB)
390ee81e68SLisandro Dalcin    if not clArgs is None: self.clArgs = clArgs
400ee81e68SLisandro Dalcin    self.copies = []
410ee81e68SLisandro Dalcin    return
420ee81e68SLisandro Dalcin
430ee81e68SLisandro Dalcin  def setupHelp(self, help):
440ee81e68SLisandro Dalcin    import nargs
450ee81e68SLisandro Dalcin    script.Script.setupHelp(self, help)
460ee81e68SLisandro Dalcin    help.addArgument('Installer', '-destDir=<path>', nargs.Arg(None, None, 'Destination Directory for install'))
470ee81e68SLisandro Dalcin    return
480ee81e68SLisandro Dalcin
490ee81e68SLisandro Dalcin
500ee81e68SLisandro Dalcin  def setupModules(self):
510ee81e68SLisandro Dalcin    self.setCompilers  = self.framework.require('config.setCompilers',         None)
520ee81e68SLisandro Dalcin    self.arch          = self.framework.require('PETSc.options.arch',        None)
530ee81e68SLisandro Dalcin    self.petscdir      = self.framework.require('PETSc.options.petscdir',    None)
540ee81e68SLisandro Dalcin    self.compilers     = self.framework.require('config.compilers',            None)
550ee81e68SLisandro Dalcin    return
560ee81e68SLisandro Dalcin
570ee81e68SLisandro Dalcin  def setup(self):
580ee81e68SLisandro Dalcin    script.Script.setup(self)
590ee81e68SLisandro Dalcin    self.framework = self.loadConfigure()
600ee81e68SLisandro Dalcin    self.setupModules()
610ee81e68SLisandro Dalcin    return
620ee81e68SLisandro Dalcin
630ee81e68SLisandro Dalcin  def setupDirectories(self):
640ee81e68SLisandro Dalcin    self.rootDir    = self.petscdir.dir
650ee81e68SLisandro Dalcin    self.destDir    = os.path.abspath(self.argDB['destDir'])
660ee81e68SLisandro Dalcin    self.installDir = self.framework.argDB['prefix']
670ee81e68SLisandro Dalcin    self.arch       = self.arch.arch
680ee81e68SLisandro Dalcin    self.rootIncludeDir    = os.path.join(self.rootDir, 'include')
690ee81e68SLisandro Dalcin    self.archIncludeDir    = os.path.join(self.rootDir, self.arch, 'include')
70*af0996ceSBarry Smith    self.rootConfDir       = os.path.join(self.rootDir, 'lib','petsc','conf')
71*af0996ceSBarry Smith    self.archConfDir       = os.path.join(self.rootDir, self.arch, 'lib','petsc','conf')
720ee81e68SLisandro Dalcin    self.rootBinDir        = os.path.join(self.rootDir, 'bin')
730ee81e68SLisandro Dalcin    self.archBinDir        = os.path.join(self.rootDir, self.arch, 'bin')
740ee81e68SLisandro Dalcin    self.archLibDir        = os.path.join(self.rootDir, self.arch, 'lib')
750ee81e68SLisandro Dalcin    self.destIncludeDir    = os.path.join(self.destDir, 'include')
76*af0996ceSBarry Smith    self.destConfDir       = os.path.join(self.destDir, 'lib','petsc','conf')
770ee81e68SLisandro Dalcin    self.destLibDir        = os.path.join(self.destDir, 'lib')
780ee81e68SLisandro Dalcin    self.destBinDir        = os.path.join(self.destDir, 'bin')
790ee81e68SLisandro Dalcin    self.installIncludeDir = os.path.join(self.installDir, 'include')
800ee81e68SLisandro Dalcin    self.installBinDir     = os.path.join(self.installDir, 'bin')
810ee81e68SLisandro Dalcin    self.rootShareDir      = os.path.join(self.rootDir, 'share')
820ee81e68SLisandro Dalcin    self.destShareDir      = os.path.join(self.destDir, 'share')
830ee81e68SLisandro Dalcin
840ee81e68SLisandro Dalcin    self.ranlib      = self.compilers.RANLIB
850ee81e68SLisandro Dalcin    self.arLibSuffix = self.compilers.AR_LIB_SUFFIX
860ee81e68SLisandro Dalcin    return
870ee81e68SLisandro Dalcin
880ee81e68SLisandro Dalcin  def checkPrefix(self):
890ee81e68SLisandro Dalcin    if not self.installDir:
900ee81e68SLisandro Dalcin      print '********************************************************************'
910ee81e68SLisandro Dalcin      print 'PETSc is built without prefix option. So "make install" is not appropriate.'
920ee81e68SLisandro Dalcin      print 'If you need a prefix install of PETSc - rerun configure with --prefix option.'
930ee81e68SLisandro Dalcin      print '********************************************************************'
940ee81e68SLisandro Dalcin      sys.exit(1)
950ee81e68SLisandro Dalcin    return
960ee81e68SLisandro Dalcin
970ee81e68SLisandro Dalcin  def checkDestdir(self):
980ee81e68SLisandro Dalcin    if os.path.exists(self.destDir):
990ee81e68SLisandro Dalcin      if os.path.samefile(self.destDir, self.rootDir):
1000ee81e68SLisandro Dalcin        print '********************************************************************'
1010ee81e68SLisandro Dalcin        print 'Incorrect prefix usage. Specified destDir same as current PETSC_DIR'
1020ee81e68SLisandro Dalcin        print '********************************************************************'
1030ee81e68SLisandro Dalcin        sys.exit(1)
1040ee81e68SLisandro Dalcin      if os.path.samefile(self.destDir, os.path.join(self.rootDir,self.arch)):
1050ee81e68SLisandro Dalcin        print '********************************************************************'
1060ee81e68SLisandro Dalcin        print 'Incorrect prefix usage. Specified destDir same as current PETSC_DIR/PETSC_ARCH'
1070ee81e68SLisandro Dalcin        print '********************************************************************'
1080ee81e68SLisandro Dalcin        sys.exit(1)
1090ee81e68SLisandro Dalcin      if not os.path.isdir(os.path.realpath(self.destDir)):
1100ee81e68SLisandro Dalcin        print '********************************************************************'
1110ee81e68SLisandro Dalcin        print 'Specified destDir', self.destDir, 'is not a directory. Cannot proceed!'
1120ee81e68SLisandro Dalcin        print '********************************************************************'
1130ee81e68SLisandro Dalcin        sys.exit(1)
1140ee81e68SLisandro Dalcin      if not os.access(self.destDir, os.W_OK):
1150ee81e68SLisandro Dalcin        print '********************************************************************'
1160ee81e68SLisandro Dalcin        print 'Unable to write to ', self.destDir, 'Perhaps you need to do "sudo make install"'
1170ee81e68SLisandro Dalcin        print '********************************************************************'
1180ee81e68SLisandro Dalcin        sys.exit(1)
1190ee81e68SLisandro Dalcin    return
1200ee81e68SLisandro Dalcin
1210ee81e68SLisandro Dalcin  def copyfile(self, src, dst, symlinks = False, copyFunc = shutil.copy2):
1220ee81e68SLisandro Dalcin    """Copies a single file    """
1230ee81e68SLisandro Dalcin    copies = []
1240ee81e68SLisandro Dalcin    errors = []
1250ee81e68SLisandro Dalcin    if not os.path.exists(dst):
1260ee81e68SLisandro Dalcin      os.makedirs(dst)
1270ee81e68SLisandro Dalcin    elif not os.path.isdir(dst):
1280ee81e68SLisandro Dalcin      raise shutil.Error, 'Destination is not a directory'
1290ee81e68SLisandro Dalcin    srcname = src
1300ee81e68SLisandro Dalcin    dstname = os.path.join(dst, os.path.basename(src))
1310ee81e68SLisandro Dalcin    try:
1320ee81e68SLisandro Dalcin      if symlinks and os.path.islink(srcname):
1330ee81e68SLisandro Dalcin        linkto = os.readlink(srcname)
1340ee81e68SLisandro Dalcin        os.symlink(linkto, dstname)
1350ee81e68SLisandro Dalcin      else:
1360ee81e68SLisandro Dalcin        copyFunc(srcname, dstname)
1370ee81e68SLisandro Dalcin        copies.append((srcname, dstname))
1380ee81e68SLisandro Dalcin    except (IOError, os.error), why:
1390ee81e68SLisandro Dalcin      errors.append((srcname, dstname, str(why)))
1400ee81e68SLisandro Dalcin    except shutil.Error, err:
1410ee81e68SLisandro Dalcin      errors.extend((srcname,dstname,str(err.args[0])))
1420ee81e68SLisandro Dalcin    if errors:
1430ee81e68SLisandro Dalcin      raise shutil.Error, errors
1440ee81e68SLisandro Dalcin    return copies
1450ee81e68SLisandro Dalcin
1460ee81e68SLisandro Dalcin
1470ee81e68SLisandro Dalcin  def copytree(self, src, dst, symlinks = False, copyFunc = shutil.copy2, exclude = []):
1480ee81e68SLisandro Dalcin    """Recursively copy a directory tree using copyFunc, which defaults to shutil.copy2().
1490ee81e68SLisandro Dalcin
1500ee81e68SLisandro Dalcin       The copyFunc() you provide is only used on the top level, lower levels always use shutil.copy2
1510ee81e68SLisandro Dalcin
1520ee81e68SLisandro Dalcin    The destination directory must not already exist.
1530ee81e68SLisandro Dalcin    If exception(s) occur, an shutil.Error is raised with a list of reasons.
1540ee81e68SLisandro Dalcin
1550ee81e68SLisandro Dalcin    If the optional symlinks flag is true, symbolic links in the
1560ee81e68SLisandro Dalcin    source tree result in symbolic links in the destination tree; if
1570ee81e68SLisandro Dalcin    it is false, the contents of the files pointed to by symbolic
1580ee81e68SLisandro Dalcin    links are copied.
1590ee81e68SLisandro Dalcin    """
1600ee81e68SLisandro Dalcin    copies = []
1610ee81e68SLisandro Dalcin    names  = os.listdir(src)
1620ee81e68SLisandro Dalcin    if not os.path.exists(dst):
1630ee81e68SLisandro Dalcin      os.makedirs(dst)
1640ee81e68SLisandro Dalcin    elif not os.path.isdir(dst):
1650ee81e68SLisandro Dalcin      raise shutil.Error, 'Destination is not a directory'
1660ee81e68SLisandro Dalcin    errors = []
1670ee81e68SLisandro Dalcin    for name in names:
1680ee81e68SLisandro Dalcin      srcname = os.path.join(src, name)
1690ee81e68SLisandro Dalcin      dstname = os.path.join(dst, name)
1700ee81e68SLisandro Dalcin      try:
1710ee81e68SLisandro Dalcin        if symlinks and os.path.islink(srcname):
1720ee81e68SLisandro Dalcin          linkto = os.readlink(srcname)
1730ee81e68SLisandro Dalcin          os.symlink(linkto, dstname)
1740ee81e68SLisandro Dalcin        elif os.path.isdir(srcname):
1750ee81e68SLisandro Dalcin          copies.extend(self.copytree(srcname, dstname, symlinks,exclude = exclude))
1760ee81e68SLisandro Dalcin        elif not os.path.basename(srcname) in exclude:
1770ee81e68SLisandro Dalcin          copyFunc(srcname, dstname)
1780ee81e68SLisandro Dalcin          copies.append((srcname, dstname))
1790ee81e68SLisandro Dalcin        # XXX What about devices, sockets etc.?
1800ee81e68SLisandro Dalcin      except (IOError, os.error), why:
1810ee81e68SLisandro Dalcin        errors.append((srcname, dstname, str(why)))
1820ee81e68SLisandro Dalcin      # catch the Error from the recursive copytree so that we can
1830ee81e68SLisandro Dalcin      # continue with other files
1840ee81e68SLisandro Dalcin      except shutil.Error, err:
1850ee81e68SLisandro Dalcin        errors.extend((srcname,dstname,str(err.args[0])))
1860ee81e68SLisandro Dalcin    try:
1870ee81e68SLisandro Dalcin      shutil.copystat(src, dst)
1880ee81e68SLisandro Dalcin    except OSError, e:
1890ee81e68SLisandro Dalcin      if WindowsError is not None and isinstance(e, WindowsError):
1900ee81e68SLisandro Dalcin        # Copying file access times may fail on Windows
1910ee81e68SLisandro Dalcin        pass
1920ee81e68SLisandro Dalcin      else:
1930ee81e68SLisandro Dalcin        errors.extend((src, dst, str(e)))
1940ee81e68SLisandro Dalcin    if errors:
1950ee81e68SLisandro Dalcin      raise shutil.Error, errors
1960ee81e68SLisandro Dalcin    return copies
1970ee81e68SLisandro Dalcin
1980ee81e68SLisandro Dalcin
1990ee81e68SLisandro Dalcin  def fixConfFile(self, src):
2000ee81e68SLisandro Dalcin    lines   = []
2010ee81e68SLisandro Dalcin    oldFile = open(src, 'r')
2020ee81e68SLisandro Dalcin    for line in oldFile.readlines():
2030ee81e68SLisandro Dalcin      # paths generated by configure could be different link-path than whats used by user, so fix both
2040ee81e68SLisandro Dalcin      line = line.replace(os.path.join(self.rootDir, self.arch), self.installDir)
2050ee81e68SLisandro Dalcin      line = line.replace(os.path.realpath(os.path.join(self.rootDir, self.arch)), self.installDir)
2060ee81e68SLisandro Dalcin      line = line.replace(os.path.join(self.rootDir, 'bin'), self.installBinDir)
2070ee81e68SLisandro Dalcin      line = line.replace(os.path.realpath(os.path.join(self.rootDir, 'bin')), self.installBinDir)
2080ee81e68SLisandro Dalcin      line = line.replace(os.path.join(self.rootDir, 'include'), self.installIncludeDir)
2090ee81e68SLisandro Dalcin      line = line.replace(os.path.realpath(os.path.join(self.rootDir, 'include')), self.installIncludeDir)
2100ee81e68SLisandro Dalcin      # remove PETSC_DIR/PETSC_ARCH variables from conf-makefiles. They are no longer necessary
2110ee81e68SLisandro Dalcin      line = line.replace('${PETSC_DIR}/${PETSC_ARCH}', self.installDir)
2120ee81e68SLisandro Dalcin      line = line.replace('PETSC_ARCH=${PETSC_ARCH}', '')
2130ee81e68SLisandro Dalcin      line = line.replace('${PETSC_DIR}', self.installDir)
2140ee81e68SLisandro Dalcin      lines.append(line)
2150ee81e68SLisandro Dalcin    oldFile.close()
2160ee81e68SLisandro Dalcin    newFile = open(src, 'w')
2170ee81e68SLisandro Dalcin    newFile.write(''.join(lines))
2180ee81e68SLisandro Dalcin    newFile.close()
2190ee81e68SLisandro Dalcin    return
2200ee81e68SLisandro Dalcin
2210ee81e68SLisandro Dalcin  def fixConf(self):
2220ee81e68SLisandro Dalcin    import shutil
2230ee81e68SLisandro Dalcin    for file in ['rules', 'variables','petscrules', 'petscvariables']:
2240ee81e68SLisandro Dalcin      self.fixConfFile(os.path.join(self.destConfDir,file))
2250ee81e68SLisandro Dalcin    self.fixConfFile(os.path.join(self.destLibDir,'pkgconfig','PETSc.pc'))
2260ee81e68SLisandro Dalcin    return
2270ee81e68SLisandro Dalcin
2280ee81e68SLisandro Dalcin  def createUninstaller(self):
2290ee81e68SLisandro Dalcin    uninstallscript = os.path.join(self.destConfDir, 'uninstall.py')
2300ee81e68SLisandro Dalcin    f = open(uninstallscript, 'w')
2310ee81e68SLisandro Dalcin    # Could use the Python AST to do this
2320ee81e68SLisandro Dalcin    f.write('#!'+sys.executable+'\n')
2330ee81e68SLisandro Dalcin    f.write('import os\n')
2340ee81e68SLisandro Dalcin
2350ee81e68SLisandro Dalcin    f.write('copies = '+repr(self.copies).replace(self.destDir,self.installDir))
2360ee81e68SLisandro Dalcin    f.write('''
2370ee81e68SLisandro Dalcinfor src, dst in copies:
2380ee81e68SLisandro Dalcin  try:
2390ee81e68SLisandro Dalcin    os.remove(dst)
2400ee81e68SLisandro Dalcin  except:
2410ee81e68SLisandro Dalcin    pass
2420ee81e68SLisandro Dalcin''')
2430ee81e68SLisandro Dalcin    #TODO: need to delete libXXX.YYY.dylib.dSYM directory on Mac
244*af0996ceSBarry Smith    dirs = [os.path.join('include','petsc','finclude'),os.path.join('include','petsc','mpiuni'),os.path.join('include','petsc','private'),os.path.join('bin'),os.path.join('lib','petsc','conf')]
2450ee81e68SLisandro Dalcin    newdirs = []
2460ee81e68SLisandro Dalcin    for dir in dirs: newdirs.append(os.path.join(self.installDir,dir))
2470ee81e68SLisandro Dalcin    f.write('dirs = '+str(newdirs))
2480ee81e68SLisandro Dalcin    f.write('''
2490ee81e68SLisandro Dalcinfor dir in dirs:
2500ee81e68SLisandro Dalcin  import shutil
2510ee81e68SLisandro Dalcin  try:
2520ee81e68SLisandro Dalcin    shutil.rmtree(dir)
2530ee81e68SLisandro Dalcin  except:
2540ee81e68SLisandro Dalcin    pass
2550ee81e68SLisandro Dalcin''')
2560ee81e68SLisandro Dalcin    f.close()
2570ee81e68SLisandro Dalcin    os.chmod(uninstallscript,0744)
2580ee81e68SLisandro Dalcin    return
2590ee81e68SLisandro Dalcin
2600ee81e68SLisandro Dalcin  def installIncludes(self):
2610ee81e68SLisandro Dalcin    # TODO: should exclude petsc-mpi.uni except for uni builds
262*af0996ceSBarry Smith    # TODO: should exclude petsc/finclude except for fortran builds
2630ee81e68SLisandro Dalcin    self.copies.extend(self.copytree(self.rootIncludeDir, self.destIncludeDir,exclude = ['makefile']))
2640ee81e68SLisandro Dalcin    self.copies.extend(self.copytree(self.archIncludeDir, self.destIncludeDir))
2650ee81e68SLisandro Dalcin    return
2660ee81e68SLisandro Dalcin
2670ee81e68SLisandro Dalcin  def installConf(self):
2680ee81e68SLisandro Dalcin    self.copies.extend(self.copytree(self.rootConfDir, self.destConfDir))
2690ee81e68SLisandro Dalcin    self.copies.extend(self.copytree(self.archConfDir, self.destConfDir, exclude = ['sowing', 'configure.log.bkp']))
2700ee81e68SLisandro Dalcin    return
2710ee81e68SLisandro Dalcin
2720ee81e68SLisandro Dalcin  def installBin(self):
273*af0996ceSBarry Smith    self.copies.extend(self.copytree(os.path.join(self.rootBinDir), os.path.join(self.destBinDir)))
2740ee81e68SLisandro Dalcin    # TODO: should copy over petsc-mpiexec.uni only for uni builds
2750ee81e68SLisandro Dalcin    self.copies.extend(self.copyfile(os.path.join(self.rootBinDir,'petsc-mpiexec.uni'), self.destBinDir))
2760ee81e68SLisandro Dalcin    self.copies.extend(self.copytree(self.archBinDir, self.destBinDir, exclude = ['bfort','bib2html','doc2lt','doctext','mapnames', 'pstogif','pstoxbm','tohtml']))
2770ee81e68SLisandro Dalcin    return
2780ee81e68SLisandro Dalcin
2790ee81e68SLisandro Dalcin  def installShare(self):
2800ee81e68SLisandro Dalcin    self.copies.extend(self.copytree(self.rootShareDir, self.destShareDir))
2810ee81e68SLisandro Dalcin    return
2820ee81e68SLisandro Dalcin
2830ee81e68SLisandro Dalcin  def copyLib(self, src, dst):
2840ee81e68SLisandro Dalcin    '''Run ranlib on the destination library if it is an archive. Also run install_name_tool on dylib on Mac'''
2850ee81e68SLisandro Dalcin    # Symlinks (assumed local) are recreated at dst
2860ee81e68SLisandro Dalcin    if os.path.islink(src):
2870ee81e68SLisandro Dalcin      linkto = os.readlink(src)
2880ee81e68SLisandro Dalcin      try:
2890ee81e68SLisandro Dalcin        os.remove(dst)            # In case it already exists
2900ee81e68SLisandro Dalcin      except OSError:
2910ee81e68SLisandro Dalcin        pass
2920ee81e68SLisandro Dalcin      os.symlink(linkto, dst)
2930ee81e68SLisandro Dalcin      return
2940ee81e68SLisandro Dalcin    # Do not install object files
2950ee81e68SLisandro Dalcin    if not os.path.splitext(src)[1] == '.o':
2960ee81e68SLisandro Dalcin      shutil.copy2(src, dst)
2970ee81e68SLisandro Dalcin    if os.path.splitext(dst)[1] == '.'+self.arLibSuffix:
2980ee81e68SLisandro Dalcin      self.executeShellCommand(self.ranlib+' '+dst)
2990ee81e68SLisandro Dalcin    if os.path.splitext(dst)[1] == '.dylib' and os.path.isfile('/usr/bin/install_name_tool'):
3000ee81e68SLisandro Dalcin      installName = dst.replace(self.destDir, self.installDir)
3010ee81e68SLisandro Dalcin      self.executeShellCommand('/usr/bin/install_name_tool -id ' + installName + ' ' + dst)
3020ee81e68SLisandro Dalcin    # preserve the original timestamps - so that the .a vs .so time order is preserved
3030ee81e68SLisandro Dalcin    shutil.copystat(src,dst)
3040ee81e68SLisandro Dalcin    return
3050ee81e68SLisandro Dalcin
3060ee81e68SLisandro Dalcin  def installLib(self):
307696e41a9SLisandro Dalcin    self.copies.extend(self.copytree(self.archLibDir, self.destLibDir, copyFunc = self.copyLib, exclude = ['.DIR', 'sowing']))
3080ee81e68SLisandro Dalcin    return
3090ee81e68SLisandro Dalcin
3100ee81e68SLisandro Dalcin
3110ee81e68SLisandro Dalcin  def outputInstallDone(self):
3120ee81e68SLisandro Dalcin    print '''\
3130ee81e68SLisandro Dalcin====================================
3140ee81e68SLisandro DalcinInstall complete.
3150ee81e68SLisandro DalcinNow to check if the libraries are working do (in current directory):
3160ee81e68SLisandro Dalcinmake PETSC_DIR=%s PETSC_ARCH="" test
3170ee81e68SLisandro Dalcin====================================\
3180ee81e68SLisandro Dalcin''' % (self.installDir)
3190ee81e68SLisandro Dalcin    return
3200ee81e68SLisandro Dalcin
3210ee81e68SLisandro Dalcin  def outputDestDirDone(self):
3220ee81e68SLisandro Dalcin    print '''\
3230ee81e68SLisandro Dalcin====================================
3240ee81e68SLisandro DalcinCopy to DESTDIR %s is now complete.
3250ee81e68SLisandro DalcinBefore use - please copy/install over to specified prefix: %s
3260ee81e68SLisandro Dalcin====================================\
3270ee81e68SLisandro Dalcin''' % (self.destDir,self.installDir)
3280ee81e68SLisandro Dalcin    return
3290ee81e68SLisandro Dalcin
3300ee81e68SLisandro Dalcin  def runsetup(self):
3310ee81e68SLisandro Dalcin    self.setup()
3320ee81e68SLisandro Dalcin    self.setupDirectories()
3330ee81e68SLisandro Dalcin    self.checkPrefix()
3340ee81e68SLisandro Dalcin    self.checkDestdir()
3350ee81e68SLisandro Dalcin    return
3360ee81e68SLisandro Dalcin
3370ee81e68SLisandro Dalcin  def runcopy(self):
3380ee81e68SLisandro Dalcin    if self.destDir == self.installDir:
3390ee81e68SLisandro Dalcin      print '*** Installing PETSc at prefix location:',self.destDir, ' ***'
3400ee81e68SLisandro Dalcin    else:
3410ee81e68SLisandro Dalcin      print '*** Copying PETSc to DESTDIR location:',self.destDir, ' ***'
3420ee81e68SLisandro Dalcin    if not os.path.exists(self.destDir):
3430ee81e68SLisandro Dalcin      try:
3440ee81e68SLisandro Dalcin        os.makedirs(self.destDir)
3450ee81e68SLisandro Dalcin      except:
3460ee81e68SLisandro Dalcin        print '********************************************************************'
3470ee81e68SLisandro Dalcin        print 'Unable to create', self.destDir, 'Perhaps you need to do "sudo make install"'
3480ee81e68SLisandro Dalcin        print '********************************************************************'
3490ee81e68SLisandro Dalcin        sys.exit(1)
3500ee81e68SLisandro Dalcin    self.installIncludes()
3510ee81e68SLisandro Dalcin    self.installConf()
3520ee81e68SLisandro Dalcin    self.installBin()
3530ee81e68SLisandro Dalcin    self.installLib()
3540ee81e68SLisandro Dalcin    self.installShare()
3550ee81e68SLisandro Dalcin    return
3560ee81e68SLisandro Dalcin
3570ee81e68SLisandro Dalcin  def runfix(self):
3580ee81e68SLisandro Dalcin    self.fixConf()
3590ee81e68SLisandro Dalcin    return
3600ee81e68SLisandro Dalcin
3610ee81e68SLisandro Dalcin  def rundone(self):
3620ee81e68SLisandro Dalcin    self.createUninstaller()
3630ee81e68SLisandro Dalcin    if self.destDir == self.installDir:
3640ee81e68SLisandro Dalcin      self.outputInstallDone()
3650ee81e68SLisandro Dalcin    else:
3660ee81e68SLisandro Dalcin      self.outputDestDirDone()
3670ee81e68SLisandro Dalcin    return
3680ee81e68SLisandro Dalcin
3690ee81e68SLisandro Dalcin  def run(self):
3700ee81e68SLisandro Dalcin    self.runsetup()
3710ee81e68SLisandro Dalcin    self.runcopy()
3720ee81e68SLisandro Dalcin    self.runfix()
3730ee81e68SLisandro Dalcin    self.rundone()
3740ee81e68SLisandro Dalcin    return
3750ee81e68SLisandro Dalcin
3760ee81e68SLisandro Dalcinif __name__ == '__main__':
3770ee81e68SLisandro Dalcin  Installer(sys.argv[1:]).run()
3780ee81e68SLisandro Dalcin  # temporary hack - delete log files created by BuildSystem - when 'sudo make install' is invoked
3790ee81e68SLisandro Dalcin  delfiles=['RDict.db','RDict.log','build.log','default.log','build.log.bkp','default.log.bkp']
3800ee81e68SLisandro Dalcin  for delfile in delfiles:
3810ee81e68SLisandro Dalcin    if os.path.exists(delfile) and (os.stat(delfile).st_uid==0):
3820ee81e68SLisandro Dalcin      os.remove(delfile)
383