1df3bd252SSatish Balay#!/usr/bin/env python3 25b6bfdb9SJed Brownfrom __future__ import print_function 3e551db17SScott Krugerimport os, re, shutil, sys 40ee81e68SLisandro Dalcin 55b6bfdb9SJed Brownif 'PETSC_DIR' in os.environ: 60ee81e68SLisandro Dalcin PETSC_DIR = os.environ['PETSC_DIR'] 70ee81e68SLisandro Dalcinelse: 8c6ef1b5bSJed Brown fd = open(os.path.join('lib','petsc','conf','petscvariables')) 90ee81e68SLisandro Dalcin a = fd.readline() 100ee81e68SLisandro Dalcin a = fd.readline() 110ee81e68SLisandro Dalcin PETSC_DIR = a.split('=')[1][0:-1] 120ee81e68SLisandro Dalcin fd.close() 130ee81e68SLisandro Dalcin 145b6bfdb9SJed Brownif 'PETSC_ARCH' in os.environ: 150ee81e68SLisandro Dalcin PETSC_ARCH = os.environ['PETSC_ARCH'] 160ee81e68SLisandro Dalcinelse: 17c6ef1b5bSJed Brown fd = open(os.path.join('lib','petsc','conf','petscvariables')) 180ee81e68SLisandro Dalcin a = fd.readline() 190ee81e68SLisandro Dalcin PETSC_ARCH = a.split('=')[1][0:-1] 200ee81e68SLisandro Dalcin fd.close() 210ee81e68SLisandro Dalcin 225b6bfdb9SJed Brownprint('*** Using PETSC_DIR='+PETSC_DIR+' PETSC_ARCH='+PETSC_ARCH+' ***') 230ee81e68SLisandro Dalcinsys.path.insert(0, os.path.join(PETSC_DIR, 'config')) 240ee81e68SLisandro Dalcinsys.path.insert(0, os.path.join(PETSC_DIR, 'config', 'BuildSystem')) 250ee81e68SLisandro Dalcin 260ee81e68SLisandro Dalcinimport script 270ee81e68SLisandro Dalcin 280ee81e68SLisandro Dalcintry: 290ee81e68SLisandro Dalcin WindowsError 300ee81e68SLisandro Dalcinexcept NameError: 310ee81e68SLisandro Dalcin WindowsError = None 320ee81e68SLisandro Dalcin 330ee81e68SLisandro Dalcinclass Installer(script.Script): 340ee81e68SLisandro Dalcin def __init__(self, clArgs = None): 350ee81e68SLisandro Dalcin import RDict 360ee81e68SLisandro Dalcin argDB = RDict.RDict(None, None, 0, 0, readonly = True) 37af0996ceSBarry Smith argDB.saveFilename = os.path.join(PETSC_DIR, PETSC_ARCH, 'lib','petsc','conf', 'RDict.db') 380ee81e68SLisandro Dalcin argDB.load() 390ee81e68SLisandro Dalcin script.Script.__init__(self, argDB = argDB) 400ee81e68SLisandro Dalcin if not clArgs is None: self.clArgs = clArgs 410ee81e68SLisandro Dalcin self.copies = [] 420ee81e68SLisandro Dalcin return 430ee81e68SLisandro Dalcin 440ee81e68SLisandro Dalcin def setupHelp(self, help): 450ee81e68SLisandro Dalcin import nargs 460ee81e68SLisandro Dalcin script.Script.setupHelp(self, help) 47a26d7103SSatish Balay help.addArgument('Installer', '-destDir=<path>', nargs.Arg(None, '', 'Destination Directory for install')) 480ee81e68SLisandro Dalcin return 490ee81e68SLisandro Dalcin 500ee81e68SLisandro Dalcin 510ee81e68SLisandro Dalcin def setupModules(self): 520ee81e68SLisandro Dalcin self.setCompilers = self.framework.require('config.setCompilers', None) 530ee81e68SLisandro Dalcin self.arch = self.framework.require('PETSc.options.arch', None) 540ee81e68SLisandro Dalcin self.petscdir = self.framework.require('PETSc.options.petscdir', None) 550ee81e68SLisandro Dalcin self.compilers = self.framework.require('config.compilers', None) 5632cabb2fSBarry Smith self.mpi = self.framework.require('config.packages.MPI', None) 570ee81e68SLisandro Dalcin return 580ee81e68SLisandro Dalcin 590ee81e68SLisandro Dalcin def setup(self): 600ee81e68SLisandro Dalcin script.Script.setup(self) 610ee81e68SLisandro Dalcin self.framework = self.loadConfigure() 620ee81e68SLisandro Dalcin self.setupModules() 630ee81e68SLisandro Dalcin return 640ee81e68SLisandro Dalcin 650ee81e68SLisandro Dalcin def setupDirectories(self): 660ee81e68SLisandro Dalcin self.rootDir = self.petscdir.dir 674a08bad0SBarry Smith self.installDir = os.path.abspath(os.path.expanduser(self.framework.argDB['prefix'])) 688727f567SSatish Balay self.destDir = os.path.abspath(self.argDB['destDir']+self.installDir) 690ee81e68SLisandro Dalcin self.arch = self.arch.arch 7002e047dfSSatish Balay self.archDir = os.path.join(self.rootDir, self.arch) 710ee81e68SLisandro Dalcin self.rootIncludeDir = os.path.join(self.rootDir, 'include') 720ee81e68SLisandro Dalcin self.archIncludeDir = os.path.join(self.rootDir, self.arch, 'include') 73af0996ceSBarry Smith self.rootConfDir = os.path.join(self.rootDir, 'lib','petsc','conf') 74af0996ceSBarry Smith self.archConfDir = os.path.join(self.rootDir, self.arch, 'lib','petsc','conf') 75c3a89c15SBarry Smith self.rootBinDir = os.path.join(self.rootDir, 'lib','petsc','bin') 760ee81e68SLisandro Dalcin self.archBinDir = os.path.join(self.rootDir, self.arch, 'bin') 770ee81e68SLisandro Dalcin self.archLibDir = os.path.join(self.rootDir, self.arch, 'lib') 780ee81e68SLisandro Dalcin self.destIncludeDir = os.path.join(self.destDir, 'include') 79af0996ceSBarry Smith self.destConfDir = os.path.join(self.destDir, 'lib','petsc','conf') 800ee81e68SLisandro Dalcin self.destLibDir = os.path.join(self.destDir, 'lib') 81c3a89c15SBarry Smith self.destBinDir = os.path.join(self.destDir, 'lib','petsc','bin') 820ee81e68SLisandro Dalcin self.installIncludeDir = os.path.join(self.installDir, 'include') 83c3a89c15SBarry Smith self.installBinDir = os.path.join(self.installDir, 'lib','petsc','bin') 840ee81e68SLisandro Dalcin self.rootShareDir = os.path.join(self.rootDir, 'share') 850ee81e68SLisandro Dalcin self.destShareDir = os.path.join(self.destDir, 'share') 8679eaf171SScott Kruger self.rootSrcDir = os.path.join(self.rootDir, 'src') 870ee81e68SLisandro Dalcin 880ee81e68SLisandro Dalcin self.ranlib = self.compilers.RANLIB 890ee81e68SLisandro Dalcin self.arLibSuffix = self.compilers.AR_LIB_SUFFIX 900ee81e68SLisandro Dalcin return 910ee81e68SLisandro Dalcin 920ee81e68SLisandro Dalcin def checkPrefix(self): 930ee81e68SLisandro Dalcin if not self.installDir: 945b6bfdb9SJed Brown print('********************************************************************') 955b6bfdb9SJed Brown print('PETSc is built without prefix option. So "make install" is not appropriate.') 965b6bfdb9SJed Brown print('If you need a prefix install of PETSc - rerun configure with --prefix option.') 975b6bfdb9SJed Brown print('********************************************************************') 980ee81e68SLisandro Dalcin sys.exit(1) 990ee81e68SLisandro Dalcin return 1000ee81e68SLisandro Dalcin 1010ee81e68SLisandro Dalcin def checkDestdir(self): 1020ee81e68SLisandro Dalcin if os.path.exists(self.destDir): 1030ee81e68SLisandro Dalcin if os.path.samefile(self.destDir, self.rootDir): 1045b6bfdb9SJed Brown print('********************************************************************') 1055b6bfdb9SJed Brown print('Incorrect prefix usage. Specified destDir same as current PETSC_DIR') 1065b6bfdb9SJed Brown print('********************************************************************') 1070ee81e68SLisandro Dalcin sys.exit(1) 1080ee81e68SLisandro Dalcin if os.path.samefile(self.destDir, os.path.join(self.rootDir,self.arch)): 1095b6bfdb9SJed Brown print('********************************************************************') 1105b6bfdb9SJed Brown print('Incorrect prefix usage. Specified destDir same as current PETSC_DIR/PETSC_ARCH') 1115b6bfdb9SJed Brown print('********************************************************************') 1120ee81e68SLisandro Dalcin sys.exit(1) 1130ee81e68SLisandro Dalcin if not os.path.isdir(os.path.realpath(self.destDir)): 1145b6bfdb9SJed Brown print('********************************************************************') 1155b6bfdb9SJed Brown print('Specified destDir', self.destDir, 'is not a directory. Cannot proceed!') 1165b6bfdb9SJed Brown print('********************************************************************') 1170ee81e68SLisandro Dalcin sys.exit(1) 1180ee81e68SLisandro Dalcin if not os.access(self.destDir, os.W_OK): 1195b6bfdb9SJed Brown print('********************************************************************') 1205b6bfdb9SJed Brown print('Unable to write to ', self.destDir, 'Perhaps you need to do "sudo make install"') 1215b6bfdb9SJed Brown print('********************************************************************') 1220ee81e68SLisandro Dalcin sys.exit(1) 1230ee81e68SLisandro Dalcin return 1240ee81e68SLisandro Dalcin 1250ee81e68SLisandro Dalcin def copyfile(self, src, dst, symlinks = False, copyFunc = shutil.copy2): 1260ee81e68SLisandro Dalcin """Copies a single file """ 1270ee81e68SLisandro Dalcin copies = [] 1280ee81e68SLisandro Dalcin errors = [] 1290ee81e68SLisandro Dalcin if not os.path.exists(dst): 1300ee81e68SLisandro Dalcin os.makedirs(dst) 1310ee81e68SLisandro Dalcin elif not os.path.isdir(dst): 1325b6bfdb9SJed Brown raise shutil.Error('Destination is not a directory') 1330ee81e68SLisandro Dalcin srcname = src 1340ee81e68SLisandro Dalcin dstname = os.path.join(dst, os.path.basename(src)) 1350ee81e68SLisandro Dalcin try: 1360ee81e68SLisandro Dalcin if symlinks and os.path.islink(srcname): 1370ee81e68SLisandro Dalcin linkto = os.readlink(srcname) 1380ee81e68SLisandro Dalcin os.symlink(linkto, dstname) 1390ee81e68SLisandro Dalcin else: 1400ee81e68SLisandro Dalcin copyFunc(srcname, dstname) 1410ee81e68SLisandro Dalcin copies.append((srcname, dstname)) 1425b6bfdb9SJed Brown except (IOError, os.error) as why: 1430ee81e68SLisandro Dalcin errors.append((srcname, dstname, str(why))) 1445b6bfdb9SJed Brown except shutil.Error as err: 1452c852529SBarry Smith errors.append((srcname,dstname,str(err.args[0]))) 1460ee81e68SLisandro Dalcin if errors: 1475b6bfdb9SJed Brown raise shutil.Error(errors) 1480ee81e68SLisandro Dalcin return copies 1490ee81e68SLisandro Dalcin 15026e8aaceSBarry Smith def fixExamplesMakefile(self, src): 15126e8aaceSBarry Smith '''Change ././${PETSC_ARCH} in makefile in root petsc directory with ${PETSC_DIR}''' 15226e8aaceSBarry Smith lines = [] 15326e8aaceSBarry Smith oldFile = open(src, 'r') 154e551db17SScott Kruger alllines=oldFile.read() 15526e8aaceSBarry Smith oldFile.close() 156e551db17SScott Kruger newlines=alllines.split('\n')[0]+'\n' # Firstline 157d5b43468SJose E. Roman # Hardcode PETSC_DIR and PETSC_ARCH to avoid users doing the wrong thing 158e551db17SScott Kruger newlines+='PETSC_DIR='+self.installDir+'\n' 159e551db17SScott Kruger newlines+='PETSC_ARCH=\n' 160e551db17SScott Kruger for line in alllines.split('\n')[1:]: 1614ff3c6a1SScott Kruger if line.startswith('TESTLOGFILE'): 162c173c275SScott Kruger newlines+='TESTLOGFILE = $(TESTDIR)/examples-install.log\n' 163e551db17SScott Kruger elif line.startswith('CONFIGDIR'): 164e551db17SScott Kruger newlines+='CONFIGDIR:=$(PETSC_DIR)/$(PETSC_ARCH)/share/petsc/examples/config\n' 165fc46264cSScott Kruger elif line.startswith('$(generatedtest)') and 'petscvariables' in line: 166c173c275SScott Kruger newlines+='all: test\n\n'+line+'\n' 167e551db17SScott Kruger else: 1684ff3c6a1SScott Kruger newlines+=line+'\n' 16926e8aaceSBarry Smith newFile = open(src, 'w') 170e551db17SScott Kruger newFile.write(newlines) 17126e8aaceSBarry Smith newFile.close() 17226e8aaceSBarry Smith return 17326e8aaceSBarry Smith 174e551db17SScott Kruger def copyConfig(self, src, dst): 1752f21b5d8SJed Brown """Copy configuration/testing files 176e551db17SScott Kruger """ 177e551db17SScott Kruger if not os.path.isdir(dst): 1785b6bfdb9SJed Brown raise shutil.Error('Destination is not a directory') 179e551db17SScott Kruger 180adf35c6eSSatish Balay self.copies.extend(self.copyfile('gmakefile.test',dst)) 181e551db17SScott Kruger newConfigDir=os.path.join(dst,'config') # Am not renaming at present 182e551db17SScott Kruger if not os.path.isdir(newConfigDir): os.mkdir(newConfigDir) 183e551db17SScott Kruger testConfFiles="gmakegentest.py gmakegen.py testparse.py example_template.py".split() 18458780e5dSStefano Zampini testConfFiles+="petsc_harness.sh report_tests.py query_tests.py".split() 185e551db17SScott Kruger for tf in testConfFiles: 186adf35c6eSSatish Balay self.copies.extend(self.copyfile(os.path.join('config',tf),newConfigDir)) 187e551db17SScott Kruger return 188e551db17SScott Kruger 18926e8aaceSBarry Smith def copyExamples(self, src, dst): 1904ff3c6a1SScott Kruger """copy the examples directories 19126e8aaceSBarry Smith """ 192ad246c4dSSatish Balay for root, dirs, files in os.walk(src, topdown=False): 1932f21b5d8SJed Brown if os.path.basename(root) not in ("tests", "tutorials"): continue 194ad246c4dSSatish Balay self.copies.extend(self.copytree(root, root.replace(src,dst))) 1954ff3c6a1SScott Kruger return 1960ee81e68SLisandro Dalcin 1970080bb28SSatish Balay def copytree(self, src, dst, symlinks = False, copyFunc = shutil.copy2, exclude = [], exclude_ext= ['.DSYM','.o','.pyc'], recurse = 1): 1980ee81e68SLisandro Dalcin """Recursively copy a directory tree using copyFunc, which defaults to shutil.copy2(). 1990ee81e68SLisandro Dalcin 2000ee81e68SLisandro Dalcin The copyFunc() you provide is only used on the top level, lower levels always use shutil.copy2 2010ee81e68SLisandro Dalcin 2020ee81e68SLisandro Dalcin The destination directory must not already exist. 2030ee81e68SLisandro Dalcin If exception(s) occur, an shutil.Error is raised with a list of reasons. 2040ee81e68SLisandro Dalcin 2050ee81e68SLisandro Dalcin If the optional symlinks flag is true, symbolic links in the 2060ee81e68SLisandro Dalcin source tree result in symbolic links in the destination tree; if 2070ee81e68SLisandro Dalcin it is false, the contents of the files pointed to by symbolic 2080ee81e68SLisandro Dalcin links are copied. 2090ee81e68SLisandro Dalcin """ 2100ee81e68SLisandro Dalcin copies = [] 2110ee81e68SLisandro Dalcin names = os.listdir(src) 2120ee81e68SLisandro Dalcin if not os.path.exists(dst): 2130ee81e68SLisandro Dalcin os.makedirs(dst) 2140ee81e68SLisandro Dalcin elif not os.path.isdir(dst): 2155b6bfdb9SJed Brown raise shutil.Error('Destination is not a directory') 2160ee81e68SLisandro Dalcin errors = [] 2172c72da00SPierre Jolivet srclinks = [] 2182c72da00SPierre Jolivet dstlinks = [] 2190ee81e68SLisandro Dalcin for name in names: 2200ee81e68SLisandro Dalcin srcname = os.path.join(src, name) 2210ee81e68SLisandro Dalcin dstname = os.path.join(dst, name) 2220ee81e68SLisandro Dalcin try: 2230ee81e68SLisandro Dalcin if symlinks and os.path.islink(srcname): 2240ee81e68SLisandro Dalcin linkto = os.readlink(srcname) 2250ee81e68SLisandro Dalcin os.symlink(linkto, dstname) 22632cabb2fSBarry Smith elif os.path.isdir(srcname) and recurse and not os.path.basename(srcname) in exclude: 227adf35c6eSSatish Balay copies.extend(self.copytree(srcname, dstname, symlinks,exclude = exclude, exclude_ext = exclude_ext)) 228adf35c6eSSatish Balay elif os.path.isfile(srcname) and not os.path.basename(srcname) in exclude and os.path.splitext(name)[1] not in exclude_ext : 2292c72da00SPierre Jolivet if os.path.islink(srcname): 2302c72da00SPierre Jolivet srclinks.append(srcname) 2312c72da00SPierre Jolivet dstlinks.append(dstname) 2322c72da00SPierre Jolivet else: 2330ee81e68SLisandro Dalcin copyFunc(srcname, dstname) 2340ee81e68SLisandro Dalcin copies.append((srcname, dstname)) 2350ee81e68SLisandro Dalcin # XXX What about devices, sockets etc.? 2365b6bfdb9SJed Brown except (IOError, os.error) as why: 2370ee81e68SLisandro Dalcin errors.append((srcname, dstname, str(why))) 2380ee81e68SLisandro Dalcin # catch the Error from the recursive copytree so that we can 2390ee81e68SLisandro Dalcin # continue with other files 2405b6bfdb9SJed Brown except shutil.Error as err: 2412c852529SBarry Smith errors.append((srcname,dstname,str(err.args[0]))) 2422c72da00SPierre Jolivet for srcname, dstname in zip(srclinks, dstlinks): 2432c72da00SPierre Jolivet try: 2442c72da00SPierre Jolivet copyFunc(srcname, dstname) 2452c72da00SPierre Jolivet copies.append((srcname, dstname)) 2462c72da00SPierre Jolivet except (IOError, os.error) as why: 2472c72da00SPierre Jolivet errors.append((srcname, dstname, str(why))) 2482c72da00SPierre Jolivet # catch the Error from the recursive copytree so that we can 2492c72da00SPierre Jolivet # continue with other files 2502c72da00SPierre Jolivet except shutil.Error as err: 2512c852529SBarry Smith errors.append((srcname,dstname,str(err.args[0]))) 2520ee81e68SLisandro Dalcin try: 2530ee81e68SLisandro Dalcin shutil.copystat(src, dst) 2545b6bfdb9SJed Brown except OSError as e: 2550ee81e68SLisandro Dalcin if WindowsError is not None and isinstance(e, WindowsError): 2560ee81e68SLisandro Dalcin # Copying file access times may fail on Windows 2570ee81e68SLisandro Dalcin pass 2580ee81e68SLisandro Dalcin else: 2592c852529SBarry Smith errors.append((src, dst, str(e))) 2600ee81e68SLisandro Dalcin if errors: 2615b6bfdb9SJed Brown raise shutil.Error(errors) 2620ee81e68SLisandro Dalcin return copies 2630ee81e68SLisandro Dalcin 2640ee81e68SLisandro Dalcin 2650ee81e68SLisandro Dalcin def fixConfFile(self, src): 2660ee81e68SLisandro Dalcin lines = [] 2670ee81e68SLisandro Dalcin oldFile = open(src, 'r') 2680ee81e68SLisandro Dalcin for line in oldFile.readlines(): 2695a21677cSJed Brown if line.startswith('PETSC_CC_INCLUDES =') or line.startswith('PETSC_FC_INCLUDES ='): 2705a21677cSJed Brown continue 2715a21677cSJed Brown line = line.replace('PETSC_CC_INCLUDES_INSTALL', 'PETSC_CC_INCLUDES') 2725a21677cSJed Brown line = line.replace('PETSC_FC_INCLUDES_INSTALL', 'PETSC_FC_INCLUDES') 2730ee81e68SLisandro Dalcin # remove PETSC_DIR/PETSC_ARCH variables from conf-makefiles. They are no longer necessary 2740ee81e68SLisandro Dalcin line = line.replace('${PETSC_DIR}/${PETSC_ARCH}', self.installDir) 2750ee81e68SLisandro Dalcin line = line.replace('PETSC_ARCH=${PETSC_ARCH}', '') 2760ee81e68SLisandro Dalcin line = line.replace('${PETSC_DIR}', self.installDir) 277011f288aSSatish Balay # replace PETSC_DIR/lib/petsc/bin with prefix/lib/petsc/bin 278011f288aSSatish Balay line = line.replace(self.rootBinDir,self.destBinDir) 2790ee81e68SLisandro Dalcin lines.append(line) 2800ee81e68SLisandro Dalcin oldFile.close() 2810ee81e68SLisandro Dalcin newFile = open(src, 'w') 2820ee81e68SLisandro Dalcin newFile.write(''.join(lines)) 2830ee81e68SLisandro Dalcin newFile.close() 2840ee81e68SLisandro Dalcin return 2850ee81e68SLisandro Dalcin 2860ee81e68SLisandro Dalcin def fixConf(self): 2870ee81e68SLisandro Dalcin import shutil 2880ee81e68SLisandro Dalcin for file in ['rules', 'variables','petscrules', 'petscvariables']: 2890ee81e68SLisandro Dalcin self.fixConfFile(os.path.join(self.destConfDir,file)) 2900ee81e68SLisandro Dalcin return 2910ee81e68SLisandro Dalcin 2920ee81e68SLisandro Dalcin def createUninstaller(self): 2930ee81e68SLisandro Dalcin uninstallscript = os.path.join(self.destConfDir, 'uninstall.py') 2940ee81e68SLisandro Dalcin f = open(uninstallscript, 'w') 2950ee81e68SLisandro Dalcin # Could use the Python AST to do this 2960ee81e68SLisandro Dalcin f.write('#!'+sys.executable+'\n') 2970ee81e68SLisandro Dalcin f.write('import os\n') 298d97f9ea1SSatish Balay f.write('prefixdir = "'+self.installDir+'"\n') 299d97f9ea1SSatish Balay files = [dst.replace(self.destDir,self.installDir) for src, dst in self.copies] 300d97f9ea1SSatish Balay files.append(uninstallscript.replace(self.destDir,self.installDir)) 301d97f9ea1SSatish Balay f.write('files = '+repr(files)) 3020ee81e68SLisandro Dalcin f.write(''' 303d97f9ea1SSatish Balayfor file in files: 304d97f9ea1SSatish Balay if os.path.exists(file) or os.path.islink(file): 305d97f9ea1SSatish Balay os.remove(file) 306d97f9ea1SSatish Balay dir = os.path.dirname(file) 3072b39596bSSatish Balay while dir not in [os.path.dirname(prefixdir),'/']: 3082b39596bSSatish Balay try: os.rmdir(dir) 3092b39596bSSatish Balay except: break 310d97f9ea1SSatish Balay dir = os.path.dirname(dir) 3110ee81e68SLisandro Dalcin''') 3120ee81e68SLisandro Dalcin f.close() 3135b6bfdb9SJed Brown os.chmod(uninstallscript,0o744) 3140ee81e68SLisandro Dalcin return 3150ee81e68SLisandro Dalcin 3160ee81e68SLisandro Dalcin def installIncludes(self): 31732cabb2fSBarry Smith exclude = ['makefile'] 31832cabb2fSBarry Smith if not hasattr(self.compilers.setCompilers, 'FC'): 31932cabb2fSBarry Smith exclude.append('finclude') 32032cabb2fSBarry Smith if not self.mpi.usingMPIUni: 32132cabb2fSBarry Smith exclude.append('mpiuni') 32232cabb2fSBarry Smith self.copies.extend(self.copytree(self.rootIncludeDir, self.destIncludeDir,exclude = exclude)) 3230ee81e68SLisandro Dalcin self.copies.extend(self.copytree(self.archIncludeDir, self.destIncludeDir)) 3240ee81e68SLisandro Dalcin return 3250ee81e68SLisandro Dalcin 3260ee81e68SLisandro Dalcin def installConf(self): 32732cabb2fSBarry Smith self.copies.extend(self.copytree(self.rootConfDir, self.destConfDir, exclude = ['uncrustify.cfg','bfort-base.txt','bfort-petsc.txt','bfort-mpi.txt','test.log'])) 328*a035e9faSPierre Jolivet self.copies.extend(self.copytree(self.archConfDir, self.destConfDir, exclude = ['sowing', 'configure.log.bkp','configure.log','make.log','gmake.log','test.log','error.log','memoryerror.log','files','testfiles','RDict.db'])) 3290ee81e68SLisandro Dalcin return 3300ee81e68SLisandro Dalcin 3310ee81e68SLisandro Dalcin def installBin(self): 33232cabb2fSBarry Smith exclude = ['bfort','bib2html','doc2lt','doctext','mapnames', 'pstogif','pstoxbm','tohtml'] 33332cabb2fSBarry Smith self.copies.extend(self.copytree(self.archBinDir, self.destBinDir, exclude = exclude )) 33432cabb2fSBarry Smith exclude = ['maint'] 33532cabb2fSBarry Smith if not self.mpi.usingMPIUni: 33632cabb2fSBarry Smith exclude.append('petsc-mpiexec.uni') 33732cabb2fSBarry Smith self.setCompilers.pushLanguage('C') 338011f288aSSatish Balay if self.setCompilers.getCompiler().find('win32fe') < 0: 33932cabb2fSBarry Smith exclude.append('win32fe') 34032cabb2fSBarry Smith self.setCompilers.popLanguage() 34132cabb2fSBarry Smith self.copies.extend(self.copytree(self.rootBinDir, self.destBinDir, exclude = exclude )) 3420ee81e68SLisandro Dalcin return 3430ee81e68SLisandro Dalcin 3440ee81e68SLisandro Dalcin def installShare(self): 3450ee81e68SLisandro Dalcin self.copies.extend(self.copytree(self.rootShareDir, self.destShareDir)) 346c173c275SScott Kruger examplesdir=os.path.join(self.destShareDir,'petsc','examples') 347c173c275SScott Kruger if os.path.exists(examplesdir): 348c173c275SScott Kruger shutil.rmtree(examplesdir) 349c173c275SScott Kruger os.mkdir(examplesdir) 35079eaf171SScott Kruger os.mkdir(os.path.join(examplesdir,'src')) 351dccaceceSSatish Balay self.copyExamples(self.rootSrcDir,os.path.join(examplesdir,'src')) 352c173c275SScott Kruger self.copyConfig(self.rootDir,examplesdir) 353c173c275SScott Kruger self.fixExamplesMakefile(os.path.join(examplesdir,'gmakefile.test')) 3540ee81e68SLisandro Dalcin return 3550ee81e68SLisandro Dalcin 3560ee81e68SLisandro Dalcin def copyLib(self, src, dst): 3570ee81e68SLisandro Dalcin '''Run ranlib on the destination library if it is an archive. Also run install_name_tool on dylib on Mac''' 3580ee81e68SLisandro Dalcin # Symlinks (assumed local) are recreated at dst 3590ee81e68SLisandro Dalcin if os.path.islink(src): 3600ee81e68SLisandro Dalcin linkto = os.readlink(src) 3610ee81e68SLisandro Dalcin try: 3620ee81e68SLisandro Dalcin os.remove(dst) # In case it already exists 3630ee81e68SLisandro Dalcin except OSError: 3640ee81e68SLisandro Dalcin pass 3650ee81e68SLisandro Dalcin os.symlink(linkto, dst) 3660ee81e68SLisandro Dalcin return 3670ee81e68SLisandro Dalcin shutil.copy2(src, dst) 368011f288aSSatish Balay if self.setCompilers.getCompiler().find('win32fe') < 0 and os.path.splitext(dst)[1] == '.'+self.arLibSuffix: 3690ee81e68SLisandro Dalcin self.executeShellCommand(self.ranlib+' '+dst) 3700ee81e68SLisandro Dalcin if os.path.splitext(dst)[1] == '.dylib' and os.path.isfile('/usr/bin/install_name_tool'): 371af2c601bSBarry Smith [output,err,flg] = self.executeShellCommand("otool -D "+src) 372af2c601bSBarry Smith oldname = output[output.find("\n")+1:] 373d4c3e6c5SSatish Balay installName = oldname.replace(os.path.realpath(self.archDir), self.installDir) 3740ee81e68SLisandro Dalcin self.executeShellCommand('/usr/bin/install_name_tool -id ' + installName + ' ' + dst) 3750ee81e68SLisandro Dalcin # preserve the original timestamps - so that the .a vs .so time order is preserved 3760ee81e68SLisandro Dalcin shutil.copystat(src,dst) 3770ee81e68SLisandro Dalcin return 3780ee81e68SLisandro Dalcin 3790ee81e68SLisandro Dalcin def installLib(self): 38032cabb2fSBarry Smith self.copies.extend(self.copytree(self.archLibDir, self.destLibDir, copyFunc = self.copyLib, exclude = ['.DIR'],recurse = 0)) 38132cabb2fSBarry 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)) 3820ee81e68SLisandro Dalcin return 3830ee81e68SLisandro Dalcin 3840ee81e68SLisandro Dalcin 3850ee81e68SLisandro Dalcin def outputInstallDone(self): 3865b4fc442SVaclav Hapla from config.packages.make import getMakeUserPath 3875b6bfdb9SJed Brown print('''\ 3880ee81e68SLisandro Dalcin==================================== 3890ee81e68SLisandro DalcinInstall complete. 3900ee81e68SLisandro DalcinNow to check if the libraries are working do (in current directory): 3915b4fc442SVaclav Hapla%s PETSC_DIR=%s PETSC_ARCH="" check 3920ee81e68SLisandro Dalcin====================================\ 3935b4fc442SVaclav Hapla''' % (getMakeUserPath(self.arch), self.installDir)) 3940ee81e68SLisandro Dalcin return 3950ee81e68SLisandro Dalcin 3960ee81e68SLisandro Dalcin def outputDestDirDone(self): 3975b6bfdb9SJed Brown print('''\ 3980ee81e68SLisandro Dalcin==================================== 3990ee81e68SLisandro DalcinCopy to DESTDIR %s is now complete. 4000ee81e68SLisandro DalcinBefore use - please copy/install over to specified prefix: %s 4010ee81e68SLisandro Dalcin====================================\ 4025b6bfdb9SJed Brown''' % (self.destDir,self.installDir)) 4030ee81e68SLisandro Dalcin return 4040ee81e68SLisandro Dalcin 4050ee81e68SLisandro Dalcin def runsetup(self): 4060ee81e68SLisandro Dalcin self.setup() 4070ee81e68SLisandro Dalcin self.setupDirectories() 4080ee81e68SLisandro Dalcin self.checkPrefix() 4090ee81e68SLisandro Dalcin self.checkDestdir() 4100ee81e68SLisandro Dalcin return 4110ee81e68SLisandro Dalcin 4120ee81e68SLisandro Dalcin def runcopy(self): 4130ee81e68SLisandro Dalcin if self.destDir == self.installDir: 4145b6bfdb9SJed Brown print('*** Installing PETSc at prefix location:',self.destDir, ' ***') 4150ee81e68SLisandro Dalcin else: 4165b6bfdb9SJed Brown print('*** Copying PETSc to DESTDIR location:',self.destDir, ' ***') 4170ee81e68SLisandro Dalcin if not os.path.exists(self.destDir): 4180ee81e68SLisandro Dalcin try: 4190ee81e68SLisandro Dalcin os.makedirs(self.destDir) 4200ee81e68SLisandro Dalcin except: 4215b6bfdb9SJed Brown print('********************************************************************') 4225b6bfdb9SJed Brown print('Unable to create', self.destDir, 'Perhaps you need to do "sudo make install"') 4235b6bfdb9SJed Brown print('********************************************************************') 4240ee81e68SLisandro Dalcin sys.exit(1) 4250ee81e68SLisandro Dalcin self.installIncludes() 4260ee81e68SLisandro Dalcin self.installConf() 4270ee81e68SLisandro Dalcin self.installBin() 4280ee81e68SLisandro Dalcin self.installLib() 4290ee81e68SLisandro Dalcin self.installShare() 4300ee81e68SLisandro Dalcin return 4310ee81e68SLisandro Dalcin 4320ee81e68SLisandro Dalcin def runfix(self): 4330ee81e68SLisandro Dalcin self.fixConf() 4340ee81e68SLisandro Dalcin return 4350ee81e68SLisandro Dalcin 4360ee81e68SLisandro Dalcin def rundone(self): 4370ee81e68SLisandro Dalcin self.createUninstaller() 4380ee81e68SLisandro Dalcin if self.destDir == self.installDir: 4390ee81e68SLisandro Dalcin self.outputInstallDone() 4400ee81e68SLisandro Dalcin else: 4410ee81e68SLisandro Dalcin self.outputDestDirDone() 4420ee81e68SLisandro Dalcin return 4430ee81e68SLisandro Dalcin 4440ee81e68SLisandro Dalcin def run(self): 4450ee81e68SLisandro Dalcin self.runsetup() 4460ee81e68SLisandro Dalcin self.runcopy() 4470ee81e68SLisandro Dalcin self.runfix() 4480ee81e68SLisandro Dalcin self.rundone() 4490ee81e68SLisandro Dalcin return 4500ee81e68SLisandro Dalcin 4510ee81e68SLisandro Dalcinif __name__ == '__main__': 4520ee81e68SLisandro Dalcin Installer(sys.argv[1:]).run() 4530ee81e68SLisandro Dalcin # temporary hack - delete log files created by BuildSystem - when 'sudo make install' is invoked 45403e6d329SSatish Balay delfiles=['RDict.db','RDict.log','buildsystem.log','default.log','buildsystem.log.bkp','default.log.bkp'] 4550ee81e68SLisandro Dalcin for delfile in delfiles: 4560ee81e68SLisandro Dalcin if os.path.exists(delfile) and (os.stat(delfile).st_uid==0): 4570ee81e68SLisandro Dalcin os.remove(delfile) 458