10ee81e68SLisandro Dalcin#!/usr/bin/env python 2e551db17SScott Krugerimport os, re, shutil, sys 30ee81e68SLisandro Dalcin 40ee81e68SLisandro Dalcinif os.environ.has_key('PETSC_DIR'): 50ee81e68SLisandro Dalcin PETSC_DIR = os.environ['PETSC_DIR'] 60ee81e68SLisandro Dalcinelse: 7af0996ceSBarry 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: 16af0996ceSBarry 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) 36af0996ceSBarry 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) 5532cabb2fSBarry Smith self.mpi = self.framework.require('config.packages.MPI', None) 560ee81e68SLisandro Dalcin return 570ee81e68SLisandro Dalcin 580ee81e68SLisandro Dalcin def setup(self): 590ee81e68SLisandro Dalcin script.Script.setup(self) 600ee81e68SLisandro Dalcin self.framework = self.loadConfigure() 610ee81e68SLisandro Dalcin self.setupModules() 620ee81e68SLisandro Dalcin return 630ee81e68SLisandro Dalcin 640ee81e68SLisandro Dalcin def setupDirectories(self): 650ee81e68SLisandro Dalcin self.rootDir = self.petscdir.dir 664a08bad0SBarry Smith self.installDir = os.path.abspath(os.path.expanduser(self.framework.argDB['prefix'])) 678727f567SSatish Balay self.destDir = os.path.abspath(self.argDB['destDir']+self.installDir) 680ee81e68SLisandro Dalcin self.arch = self.arch.arch 6902e047dfSSatish Balay self.archDir = os.path.join(self.rootDir, self.arch) 700ee81e68SLisandro Dalcin self.rootIncludeDir = os.path.join(self.rootDir, 'include') 710ee81e68SLisandro Dalcin self.archIncludeDir = os.path.join(self.rootDir, self.arch, 'include') 72af0996ceSBarry Smith self.rootConfDir = os.path.join(self.rootDir, 'lib','petsc','conf') 73af0996ceSBarry Smith self.archConfDir = os.path.join(self.rootDir, self.arch, 'lib','petsc','conf') 74c3a89c15SBarry Smith self.rootBinDir = os.path.join(self.rootDir, 'lib','petsc','bin') 750ee81e68SLisandro Dalcin self.archBinDir = os.path.join(self.rootDir, self.arch, 'bin') 760ee81e68SLisandro Dalcin self.archLibDir = os.path.join(self.rootDir, self.arch, 'lib') 770ee81e68SLisandro Dalcin self.destIncludeDir = os.path.join(self.destDir, 'include') 78af0996ceSBarry Smith self.destConfDir = os.path.join(self.destDir, 'lib','petsc','conf') 790ee81e68SLisandro Dalcin self.destLibDir = os.path.join(self.destDir, 'lib') 80c3a89c15SBarry Smith self.destBinDir = os.path.join(self.destDir, 'lib','petsc','bin') 810ee81e68SLisandro Dalcin self.installIncludeDir = os.path.join(self.installDir, 'include') 82c3a89c15SBarry Smith self.installBinDir = os.path.join(self.installDir, 'lib','petsc','bin') 830ee81e68SLisandro Dalcin self.rootShareDir = os.path.join(self.rootDir, 'share') 840ee81e68SLisandro Dalcin self.destShareDir = os.path.join(self.destDir, 'share') 8579eaf171SScott Kruger self.rootSrcDir = os.path.join(self.rootDir, 'src') 860ee81e68SLisandro Dalcin 870ee81e68SLisandro Dalcin self.ranlib = self.compilers.RANLIB 880ee81e68SLisandro Dalcin self.arLibSuffix = self.compilers.AR_LIB_SUFFIX 890ee81e68SLisandro Dalcin return 900ee81e68SLisandro Dalcin 910ee81e68SLisandro Dalcin def checkPrefix(self): 920ee81e68SLisandro Dalcin if not self.installDir: 930ee81e68SLisandro Dalcin print '********************************************************************' 940ee81e68SLisandro Dalcin print 'PETSc is built without prefix option. So "make install" is not appropriate.' 950ee81e68SLisandro Dalcin print 'If you need a prefix install of PETSc - rerun configure with --prefix option.' 960ee81e68SLisandro Dalcin print '********************************************************************' 970ee81e68SLisandro Dalcin sys.exit(1) 980ee81e68SLisandro Dalcin return 990ee81e68SLisandro Dalcin 1000ee81e68SLisandro Dalcin def checkDestdir(self): 1010ee81e68SLisandro Dalcin if os.path.exists(self.destDir): 1020ee81e68SLisandro Dalcin if os.path.samefile(self.destDir, self.rootDir): 1030ee81e68SLisandro Dalcin print '********************************************************************' 1040ee81e68SLisandro Dalcin print 'Incorrect prefix usage. Specified destDir same as current PETSC_DIR' 1050ee81e68SLisandro Dalcin print '********************************************************************' 1060ee81e68SLisandro Dalcin sys.exit(1) 1070ee81e68SLisandro Dalcin if os.path.samefile(self.destDir, os.path.join(self.rootDir,self.arch)): 1080ee81e68SLisandro Dalcin print '********************************************************************' 1090ee81e68SLisandro Dalcin print 'Incorrect prefix usage. Specified destDir same as current PETSC_DIR/PETSC_ARCH' 1100ee81e68SLisandro Dalcin print '********************************************************************' 1110ee81e68SLisandro Dalcin sys.exit(1) 1120ee81e68SLisandro Dalcin if not os.path.isdir(os.path.realpath(self.destDir)): 1130ee81e68SLisandro Dalcin print '********************************************************************' 1140ee81e68SLisandro Dalcin print 'Specified destDir', self.destDir, 'is not a directory. Cannot proceed!' 1150ee81e68SLisandro Dalcin print '********************************************************************' 1160ee81e68SLisandro Dalcin sys.exit(1) 1170ee81e68SLisandro Dalcin if not os.access(self.destDir, os.W_OK): 1180ee81e68SLisandro Dalcin print '********************************************************************' 1190ee81e68SLisandro Dalcin print 'Unable to write to ', self.destDir, 'Perhaps you need to do "sudo make install"' 1200ee81e68SLisandro Dalcin print '********************************************************************' 1210ee81e68SLisandro Dalcin sys.exit(1) 1220ee81e68SLisandro Dalcin return 1230ee81e68SLisandro Dalcin 1240ee81e68SLisandro Dalcin def copyfile(self, src, dst, symlinks = False, copyFunc = shutil.copy2): 1250ee81e68SLisandro Dalcin """Copies a single file """ 1260ee81e68SLisandro Dalcin copies = [] 1270ee81e68SLisandro Dalcin errors = [] 1280ee81e68SLisandro Dalcin if not os.path.exists(dst): 1290ee81e68SLisandro Dalcin os.makedirs(dst) 1300ee81e68SLisandro Dalcin elif not os.path.isdir(dst): 1310ee81e68SLisandro Dalcin raise shutil.Error, 'Destination is not a directory' 1320ee81e68SLisandro Dalcin srcname = src 1330ee81e68SLisandro Dalcin dstname = os.path.join(dst, os.path.basename(src)) 1340ee81e68SLisandro Dalcin try: 1350ee81e68SLisandro Dalcin if symlinks and os.path.islink(srcname): 1360ee81e68SLisandro Dalcin linkto = os.readlink(srcname) 1370ee81e68SLisandro Dalcin os.symlink(linkto, dstname) 1380ee81e68SLisandro Dalcin else: 1390ee81e68SLisandro Dalcin copyFunc(srcname, dstname) 1400ee81e68SLisandro Dalcin copies.append((srcname, dstname)) 1410ee81e68SLisandro Dalcin except (IOError, os.error), why: 1420ee81e68SLisandro Dalcin errors.append((srcname, dstname, str(why))) 1430ee81e68SLisandro Dalcin except shutil.Error, err: 1440ee81e68SLisandro Dalcin errors.extend((srcname,dstname,str(err.args[0]))) 1450ee81e68SLisandro Dalcin if errors: 1460ee81e68SLisandro Dalcin raise shutil.Error, errors 1470ee81e68SLisandro Dalcin return copies 1480ee81e68SLisandro Dalcin 14926e8aaceSBarry Smith def fixExamplesMakefile(self, src): 15026e8aaceSBarry Smith '''Change ././${PETSC_ARCH} in makefile in root petsc directory with ${PETSC_DIR}''' 15126e8aaceSBarry Smith lines = [] 15226e8aaceSBarry Smith oldFile = open(src, 'r') 153e551db17SScott Kruger alllines=oldFile.read() 15426e8aaceSBarry Smith oldFile.close() 155e551db17SScott Kruger newlines=alllines.split('\n')[0]+'\n' # Firstline 156e551db17SScott Kruger # Hardcode PETSC_DIR and PETSC_ARCH to avoid users doing the worng thing 157e551db17SScott Kruger newlines+='PETSC_DIR='+self.installDir+'\n' 158e551db17SScott Kruger newlines+='PETSC_ARCH=\n' 159e551db17SScott Kruger for line in alllines.split('\n')[1:]: 1604ff3c6a1SScott Kruger if line.startswith('TESTLOGFILE'): 161c173c275SScott Kruger newlines+='TESTLOGFILE = $(TESTDIR)/examples-install.log\n' 162e551db17SScott Kruger elif line.startswith('CONFIGDIR'): 163e551db17SScott Kruger newlines+='CONFIGDIR:=$(PETSC_DIR)/$(PETSC_ARCH)/share/petsc/examples/config\n' 1644ff3c6a1SScott Kruger elif line.startswith('EXAMPLESDIR'): 165e551db17SScott Kruger newlines+='EXAMPLESDIR:=$(PETSC_DIR)/$(PETSC_ARCH)/share/petsc/examples\n' 166fc46264cSScott Kruger elif line.startswith('$(generatedtest)') and 'petscvariables' in line: 167c173c275SScott Kruger newlines+='all: test\n\n'+line+'\n' 168e551db17SScott Kruger else: 1694ff3c6a1SScott Kruger newlines+=line+'\n' 17026e8aaceSBarry Smith newFile = open(src, 'w') 171e551db17SScott Kruger newFile.write(newlines) 17226e8aaceSBarry Smith newFile.close() 17326e8aaceSBarry Smith return 17426e8aaceSBarry Smith 175e551db17SScott Kruger def copyConfig(self, src, dst): 176e551db17SScott Kruger """Recursively copy the examples directories 177e551db17SScott Kruger """ 178e551db17SScott Kruger if not os.path.isdir(dst): 179e551db17SScott Kruger raise shutil.Error, 'Destination is not a directory' 180e551db17SScott Kruger 181adf35c6eSSatish Balay self.copies.extend(self.copyfile('gmakefile.test',dst)) 182e551db17SScott Kruger newConfigDir=os.path.join(dst,'config') # Am not renaming at present 183e551db17SScott Kruger if not os.path.isdir(newConfigDir): os.mkdir(newConfigDir) 184e551db17SScott Kruger testConfFiles="gmakegentest.py gmakegen.py testparse.py example_template.py".split() 185c173c275SScott Kruger testConfFiles+="petsc_harness.sh report_tests.py watchtime.sh".split() 186c173c275SScott Kruger testConfFiles+=["cmakegen.py"] 187e551db17SScott Kruger for tf in testConfFiles: 188adf35c6eSSatish Balay self.copies.extend(self.copyfile(os.path.join('config',tf),newConfigDir)) 189e551db17SScott Kruger return 190e551db17SScott Kruger 19126e8aaceSBarry Smith def copyExamples(self, src, dst): 1924ff3c6a1SScott Kruger """copy the examples directories 19326e8aaceSBarry Smith """ 1944ff3c6a1SScott Kruger top=os.path.relpath(src,os.path.abspath(os.curdir)) 1954ff3c6a1SScott Kruger for root, dirs, files in os.walk(top, topdown=False): 1964ff3c6a1SScott Kruger if not os.path.basename(root) == "examples": continue 197adf35c6eSSatish Balay self.copies.extend(self.copytree(root, os.path.join(dst,root),exclude_ext=['DSYM'])) 1984ff3c6a1SScott Kruger return 1990ee81e68SLisandro Dalcin 200adf35c6eSSatish Balay def copytree(self, src, dst, symlinks = False, copyFunc = shutil.copy2, exclude = [], exclude_ext= [], recurse = 1): 2010ee81e68SLisandro Dalcin """Recursively copy a directory tree using copyFunc, which defaults to shutil.copy2(). 2020ee81e68SLisandro Dalcin 2030ee81e68SLisandro Dalcin The copyFunc() you provide is only used on the top level, lower levels always use shutil.copy2 2040ee81e68SLisandro Dalcin 2050ee81e68SLisandro Dalcin The destination directory must not already exist. 2060ee81e68SLisandro Dalcin If exception(s) occur, an shutil.Error is raised with a list of reasons. 2070ee81e68SLisandro Dalcin 2080ee81e68SLisandro Dalcin If the optional symlinks flag is true, symbolic links in the 2090ee81e68SLisandro Dalcin source tree result in symbolic links in the destination tree; if 2100ee81e68SLisandro Dalcin it is false, the contents of the files pointed to by symbolic 2110ee81e68SLisandro Dalcin links are copied. 2120ee81e68SLisandro Dalcin """ 2130ee81e68SLisandro Dalcin copies = [] 2140ee81e68SLisandro Dalcin names = os.listdir(src) 2150ee81e68SLisandro Dalcin if not os.path.exists(dst): 2160ee81e68SLisandro Dalcin os.makedirs(dst) 2170ee81e68SLisandro Dalcin elif not os.path.isdir(dst): 2180ee81e68SLisandro Dalcin raise shutil.Error, 'Destination is not a directory' 2190ee81e68SLisandro Dalcin errors = [] 2200ee81e68SLisandro Dalcin for name in names: 2210ee81e68SLisandro Dalcin srcname = os.path.join(src, name) 2220ee81e68SLisandro Dalcin dstname = os.path.join(dst, name) 2230ee81e68SLisandro Dalcin try: 2240ee81e68SLisandro Dalcin if symlinks and os.path.islink(srcname): 2250ee81e68SLisandro Dalcin linkto = os.readlink(srcname) 2260ee81e68SLisandro Dalcin os.symlink(linkto, dstname) 22732cabb2fSBarry Smith elif os.path.isdir(srcname) and recurse and not os.path.basename(srcname) in exclude: 228adf35c6eSSatish Balay copies.extend(self.copytree(srcname, dstname, symlinks,exclude = exclude, exclude_ext = exclude_ext)) 229adf35c6eSSatish Balay elif os.path.isfile(srcname) and not os.path.basename(srcname) in exclude and os.path.splitext(name)[1] not in exclude_ext : 2300ee81e68SLisandro Dalcin copyFunc(srcname, dstname) 2310ee81e68SLisandro Dalcin copies.append((srcname, dstname)) 2320ee81e68SLisandro Dalcin # XXX What about devices, sockets etc.? 2330ee81e68SLisandro Dalcin except (IOError, os.error), why: 2340ee81e68SLisandro Dalcin errors.append((srcname, dstname, str(why))) 2350ee81e68SLisandro Dalcin # catch the Error from the recursive copytree so that we can 2360ee81e68SLisandro Dalcin # continue with other files 2370ee81e68SLisandro Dalcin except shutil.Error, err: 2380ee81e68SLisandro Dalcin errors.extend((srcname,dstname,str(err.args[0]))) 2390ee81e68SLisandro Dalcin try: 2400ee81e68SLisandro Dalcin shutil.copystat(src, dst) 2410ee81e68SLisandro Dalcin except OSError, e: 2420ee81e68SLisandro Dalcin if WindowsError is not None and isinstance(e, WindowsError): 2430ee81e68SLisandro Dalcin # Copying file access times may fail on Windows 2440ee81e68SLisandro Dalcin pass 2450ee81e68SLisandro Dalcin else: 2460ee81e68SLisandro Dalcin errors.extend((src, dst, str(e))) 2470ee81e68SLisandro Dalcin if errors: 2480ee81e68SLisandro Dalcin raise shutil.Error, errors 2490ee81e68SLisandro Dalcin return copies 2500ee81e68SLisandro Dalcin 2510ee81e68SLisandro Dalcin 2520ee81e68SLisandro Dalcin def fixConfFile(self, src): 2530ee81e68SLisandro Dalcin lines = [] 2540ee81e68SLisandro Dalcin oldFile = open(src, 'r') 2550ee81e68SLisandro Dalcin for line in oldFile.readlines(): 2560ee81e68SLisandro Dalcin # paths generated by configure could be different link-path than whats used by user, so fix both 2570ee81e68SLisandro Dalcin line = line.replace(os.path.join(self.rootDir, self.arch), self.installDir) 2580ee81e68SLisandro Dalcin line = line.replace(os.path.realpath(os.path.join(self.rootDir, self.arch)), self.installDir) 2590ee81e68SLisandro Dalcin line = line.replace(os.path.join(self.rootDir, 'bin'), self.installBinDir) 2600ee81e68SLisandro Dalcin line = line.replace(os.path.realpath(os.path.join(self.rootDir, 'bin')), self.installBinDir) 2610ee81e68SLisandro Dalcin line = line.replace(os.path.join(self.rootDir, 'include'), self.installIncludeDir) 2620ee81e68SLisandro Dalcin line = line.replace(os.path.realpath(os.path.join(self.rootDir, 'include')), self.installIncludeDir) 2630ee81e68SLisandro Dalcin # remove PETSC_DIR/PETSC_ARCH variables from conf-makefiles. They are no longer necessary 2640ee81e68SLisandro Dalcin line = line.replace('${PETSC_DIR}/${PETSC_ARCH}', self.installDir) 2650ee81e68SLisandro Dalcin line = line.replace('PETSC_ARCH=${PETSC_ARCH}', '') 2660ee81e68SLisandro Dalcin line = line.replace('${PETSC_DIR}', self.installDir) 2670ee81e68SLisandro Dalcin lines.append(line) 2680ee81e68SLisandro Dalcin oldFile.close() 2690ee81e68SLisandro Dalcin newFile = open(src, 'w') 2700ee81e68SLisandro Dalcin newFile.write(''.join(lines)) 2710ee81e68SLisandro Dalcin newFile.close() 2720ee81e68SLisandro Dalcin return 2730ee81e68SLisandro Dalcin 2740ee81e68SLisandro Dalcin def fixConf(self): 2750ee81e68SLisandro Dalcin import shutil 2760ee81e68SLisandro Dalcin for file in ['rules', 'variables','petscrules', 'petscvariables']: 2770ee81e68SLisandro Dalcin self.fixConfFile(os.path.join(self.destConfDir,file)) 2780ee81e68SLisandro Dalcin self.fixConfFile(os.path.join(self.destLibDir,'pkgconfig','PETSc.pc')) 2790ee81e68SLisandro Dalcin return 2800ee81e68SLisandro Dalcin 2810ee81e68SLisandro Dalcin def createUninstaller(self): 2820ee81e68SLisandro Dalcin uninstallscript = os.path.join(self.destConfDir, 'uninstall.py') 2830ee81e68SLisandro Dalcin f = open(uninstallscript, 'w') 2840ee81e68SLisandro Dalcin # Could use the Python AST to do this 2850ee81e68SLisandro Dalcin f.write('#!'+sys.executable+'\n') 2860ee81e68SLisandro Dalcin f.write('import os\n') 287d97f9ea1SSatish Balay f.write('prefixdir = "'+self.installDir+'"\n') 288d97f9ea1SSatish Balay files = [dst.replace(self.destDir,self.installDir) for src, dst in self.copies] 289d97f9ea1SSatish Balay files.append(uninstallscript.replace(self.destDir,self.installDir)) 290d97f9ea1SSatish Balay f.write('files = '+repr(files)) 2910ee81e68SLisandro Dalcin f.write(''' 292d97f9ea1SSatish Balayfor file in files: 293d97f9ea1SSatish Balay if os.path.exists(file) or os.path.islink(file): 294d97f9ea1SSatish Balay os.remove(file) 295d97f9ea1SSatish Balay dir = os.path.dirname(file) 296*2b39596bSSatish Balay while dir not in [os.path.dirname(prefixdir),'/']: 297*2b39596bSSatish Balay try: os.rmdir(dir) 298*2b39596bSSatish Balay except: break 299d97f9ea1SSatish Balay dir = os.path.dirname(dir) 3000ee81e68SLisandro Dalcin''') 3010ee81e68SLisandro Dalcin f.close() 3020ee81e68SLisandro Dalcin os.chmod(uninstallscript,0744) 3030ee81e68SLisandro Dalcin return 3040ee81e68SLisandro Dalcin 3050ee81e68SLisandro Dalcin def installIncludes(self): 30632cabb2fSBarry Smith exclude = ['makefile'] 30732cabb2fSBarry Smith if not hasattr(self.compilers.setCompilers, 'FC'): 30832cabb2fSBarry Smith exclude.append('finclude') 30932cabb2fSBarry Smith if not self.mpi.usingMPIUni: 31032cabb2fSBarry Smith exclude.append('mpiuni') 31132cabb2fSBarry Smith self.copies.extend(self.copytree(self.rootIncludeDir, self.destIncludeDir,exclude = exclude)) 3120ee81e68SLisandro Dalcin self.copies.extend(self.copytree(self.archIncludeDir, self.destIncludeDir)) 3130ee81e68SLisandro Dalcin return 3140ee81e68SLisandro Dalcin 3150ee81e68SLisandro Dalcin def installConf(self): 31632cabb2fSBarry Smith self.copies.extend(self.copytree(self.rootConfDir, self.destConfDir, exclude = ['uncrustify.cfg','bfort-base.txt','bfort-petsc.txt','bfort-mpi.txt','test.log'])) 31732cabb2fSBarry Smith self.copies.extend(self.copytree(self.archConfDir, self.destConfDir, exclude = ['sowing', 'configure.log.bkp','configure.log','make.log','gmake.log','test.log','error.log'])) 3180ee81e68SLisandro Dalcin return 3190ee81e68SLisandro Dalcin 3200ee81e68SLisandro Dalcin def installBin(self): 32132cabb2fSBarry Smith exclude = ['bfort','bib2html','doc2lt','doctext','mapnames', 'pstogif','pstoxbm','tohtml'] 32232cabb2fSBarry Smith self.copies.extend(self.copytree(self.archBinDir, self.destBinDir, exclude = exclude )) 32332cabb2fSBarry Smith exclude = ['maint'] 32432cabb2fSBarry Smith if not self.mpi.usingMPIUni: 32532cabb2fSBarry Smith exclude.append('petsc-mpiexec.uni') 32632cabb2fSBarry Smith self.setCompilers.pushLanguage('C') 32732cabb2fSBarry Smith if not self.setCompilers.isWindows(self.setCompilers.getCompiler(),self.log): 32832cabb2fSBarry Smith exclude.append('win32fe') 32932cabb2fSBarry Smith self.setCompilers.popLanguage() 33032cabb2fSBarry Smith self.copies.extend(self.copytree(self.rootBinDir, self.destBinDir, exclude = exclude )) 3310ee81e68SLisandro Dalcin return 3320ee81e68SLisandro Dalcin 3330ee81e68SLisandro Dalcin def installShare(self): 3340ee81e68SLisandro Dalcin self.copies.extend(self.copytree(self.rootShareDir, self.destShareDir)) 335c173c275SScott Kruger examplesdir=os.path.join(self.destShareDir,'petsc','examples') 336c173c275SScott Kruger if os.path.exists(examplesdir): 337c173c275SScott Kruger shutil.rmtree(examplesdir) 338c173c275SScott Kruger os.mkdir(examplesdir) 33979eaf171SScott Kruger os.mkdir(os.path.join(examplesdir,'src')) 3404ff3c6a1SScott Kruger self.copyExamples(self.rootSrcDir,examplesdir) 341c173c275SScott Kruger self.copyConfig(self.rootDir,examplesdir) 342c173c275SScott Kruger self.fixExamplesMakefile(os.path.join(examplesdir,'gmakefile.test')) 3430ee81e68SLisandro Dalcin return 3440ee81e68SLisandro Dalcin 3450ee81e68SLisandro Dalcin def copyLib(self, src, dst): 3460ee81e68SLisandro Dalcin '''Run ranlib on the destination library if it is an archive. Also run install_name_tool on dylib on Mac''' 3470ee81e68SLisandro Dalcin # Symlinks (assumed local) are recreated at dst 3480ee81e68SLisandro Dalcin if os.path.islink(src): 3490ee81e68SLisandro Dalcin linkto = os.readlink(src) 3500ee81e68SLisandro Dalcin try: 3510ee81e68SLisandro Dalcin os.remove(dst) # In case it already exists 3520ee81e68SLisandro Dalcin except OSError: 3530ee81e68SLisandro Dalcin pass 3540ee81e68SLisandro Dalcin os.symlink(linkto, dst) 3550ee81e68SLisandro Dalcin return 3560ee81e68SLisandro Dalcin # Do not install object files 3570ee81e68SLisandro Dalcin if not os.path.splitext(src)[1] == '.o': 3580ee81e68SLisandro Dalcin shutil.copy2(src, dst) 3590ee81e68SLisandro Dalcin if os.path.splitext(dst)[1] == '.'+self.arLibSuffix: 3600ee81e68SLisandro Dalcin self.executeShellCommand(self.ranlib+' '+dst) 3610ee81e68SLisandro Dalcin if os.path.splitext(dst)[1] == '.dylib' and os.path.isfile('/usr/bin/install_name_tool'): 362af2c601bSBarry Smith [output,err,flg] = self.executeShellCommand("otool -D "+src) 363af2c601bSBarry Smith oldname = output[output.find("\n")+1:] 36402e047dfSSatish Balay installName = oldname.replace(self.archDir, self.installDir) 3650ee81e68SLisandro Dalcin self.executeShellCommand('/usr/bin/install_name_tool -id ' + installName + ' ' + dst) 3660ee81e68SLisandro Dalcin # preserve the original timestamps - so that the .a vs .so time order is preserved 3670ee81e68SLisandro Dalcin shutil.copystat(src,dst) 3680ee81e68SLisandro Dalcin return 3690ee81e68SLisandro Dalcin 3700ee81e68SLisandro Dalcin def installLib(self): 37132cabb2fSBarry Smith self.copies.extend(self.copytree(self.archLibDir, self.destLibDir, copyFunc = self.copyLib, exclude = ['.DIR'],recurse = 0)) 37232cabb2fSBarry Smith self.copies.extend(self.copytree(os.path.join(self.archLibDir,'pkgconfig'), os.path.join(self.destLibDir,'pkgconfig'), copyFunc = self.copyLib, exclude = ['.DIR'],recurse = 0)) 3730ee81e68SLisandro Dalcin return 3740ee81e68SLisandro Dalcin 3750ee81e68SLisandro Dalcin 3760ee81e68SLisandro Dalcin def outputInstallDone(self): 3770ee81e68SLisandro Dalcin print '''\ 3780ee81e68SLisandro Dalcin==================================== 3790ee81e68SLisandro DalcinInstall complete. 3800ee81e68SLisandro DalcinNow to check if the libraries are working do (in current directory): 3810ee81e68SLisandro Dalcinmake PETSC_DIR=%s PETSC_ARCH="" test 3820ee81e68SLisandro Dalcin====================================\ 3830ee81e68SLisandro Dalcin''' % (self.installDir) 3840ee81e68SLisandro Dalcin return 3850ee81e68SLisandro Dalcin 3860ee81e68SLisandro Dalcin def outputDestDirDone(self): 3870ee81e68SLisandro Dalcin print '''\ 3880ee81e68SLisandro Dalcin==================================== 3890ee81e68SLisandro DalcinCopy to DESTDIR %s is now complete. 3900ee81e68SLisandro DalcinBefore use - please copy/install over to specified prefix: %s 3910ee81e68SLisandro Dalcin====================================\ 3920ee81e68SLisandro Dalcin''' % (self.destDir,self.installDir) 3930ee81e68SLisandro Dalcin return 3940ee81e68SLisandro Dalcin 3950ee81e68SLisandro Dalcin def runsetup(self): 3960ee81e68SLisandro Dalcin self.setup() 3970ee81e68SLisandro Dalcin self.setupDirectories() 3980ee81e68SLisandro Dalcin self.checkPrefix() 3990ee81e68SLisandro Dalcin self.checkDestdir() 4000ee81e68SLisandro Dalcin return 4010ee81e68SLisandro Dalcin 4020ee81e68SLisandro Dalcin def runcopy(self): 4030ee81e68SLisandro Dalcin if self.destDir == self.installDir: 4040ee81e68SLisandro Dalcin print '*** Installing PETSc at prefix location:',self.destDir, ' ***' 4050ee81e68SLisandro Dalcin else: 4060ee81e68SLisandro Dalcin print '*** Copying PETSc to DESTDIR location:',self.destDir, ' ***' 4070ee81e68SLisandro Dalcin if not os.path.exists(self.destDir): 4080ee81e68SLisandro Dalcin try: 4090ee81e68SLisandro Dalcin os.makedirs(self.destDir) 4100ee81e68SLisandro Dalcin except: 4110ee81e68SLisandro Dalcin print '********************************************************************' 4120ee81e68SLisandro Dalcin print 'Unable to create', self.destDir, 'Perhaps you need to do "sudo make install"' 4130ee81e68SLisandro Dalcin print '********************************************************************' 4140ee81e68SLisandro Dalcin sys.exit(1) 4150ee81e68SLisandro Dalcin self.installIncludes() 4160ee81e68SLisandro Dalcin self.installConf() 4170ee81e68SLisandro Dalcin self.installBin() 4180ee81e68SLisandro Dalcin self.installLib() 4190ee81e68SLisandro Dalcin self.installShare() 4200ee81e68SLisandro Dalcin return 4210ee81e68SLisandro Dalcin 4220ee81e68SLisandro Dalcin def runfix(self): 4230ee81e68SLisandro Dalcin self.fixConf() 4240ee81e68SLisandro Dalcin return 4250ee81e68SLisandro Dalcin 4260ee81e68SLisandro Dalcin def rundone(self): 4270ee81e68SLisandro Dalcin self.createUninstaller() 4280ee81e68SLisandro Dalcin if self.destDir == self.installDir: 4290ee81e68SLisandro Dalcin self.outputInstallDone() 4300ee81e68SLisandro Dalcin else: 4310ee81e68SLisandro Dalcin self.outputDestDirDone() 4320ee81e68SLisandro Dalcin return 4330ee81e68SLisandro Dalcin 4340ee81e68SLisandro Dalcin def run(self): 4350ee81e68SLisandro Dalcin self.runsetup() 4360ee81e68SLisandro Dalcin self.runcopy() 4370ee81e68SLisandro Dalcin self.runfix() 4380ee81e68SLisandro Dalcin self.rundone() 4390ee81e68SLisandro Dalcin return 4400ee81e68SLisandro Dalcin 4410ee81e68SLisandro Dalcinif __name__ == '__main__': 4420ee81e68SLisandro Dalcin Installer(sys.argv[1:]).run() 4430ee81e68SLisandro Dalcin # temporary hack - delete log files created by BuildSystem - when 'sudo make install' is invoked 44403e6d329SSatish Balay delfiles=['RDict.db','RDict.log','buildsystem.log','default.log','buildsystem.log.bkp','default.log.bkp'] 4450ee81e68SLisandro Dalcin for delfile in delfiles: 4460ee81e68SLisandro Dalcin if os.path.exists(delfile) and (os.stat(delfile).st_uid==0): 4470ee81e68SLisandro Dalcin os.remove(delfile) 448