1e68ebbecSBarry Smith#!/usr/bin/env python 2e68ebbecSBarry Smith 3e68ebbecSBarry Smith""" 4*65a891e7SLisandro DalcinPETSc: Portable, Extensible Toolkit for Scientific Computation 5*65a891e7SLisandro Dalcin============================================================== 6*65a891e7SLisandro Dalcin 7*65a891e7SLisandro DalcinThe Portable, Extensible Toolkit for Scientific Computation (PETSc), 8*65a891e7SLisandro Dalcinis a suite of data structures and routines for the scalable (parallel) 9*65a891e7SLisandro Dalcinsolution of scientific applications modeled by partial differential 10*65a891e7SLisandro Dalcinequations. It employs the Message Passing Interface (MPI) standard for 11*65a891e7SLisandro Dalcinall message-passing communication. 12e68ebbecSBarry Smith""" 13e68ebbecSBarry Smith 14*65a891e7SLisandro Dalcinimport sys, os 15*65a891e7SLisandro Dalcinfrom distutils.core import setup 16*65a891e7SLisandro Dalcinfrom distutils.util import get_platform 17*65a891e7SLisandro Dalcinfrom distutils.command.build import build as _build 18*65a891e7SLisandro Dalcinif 'setuptools' in sys.modules: 19*65a891e7SLisandro Dalcin from setuptools.command.install import install as _install 20*65a891e7SLisandro Dalcinelse: 21*65a891e7SLisandro Dalcin from distutils.command.install import install as _install 22*65a891e7SLisandro Dalcinfrom distutils import log 2312c1d45bSMatthew G Knepley 24*65a891e7SLisandro Dalcininit_py = """\ 25*65a891e7SLisandro Dalcin# Author: Lisandro Dalcin 26*65a891e7SLisandro Dalcin# Contact: dalcinl@gmail.com 27*65a891e7SLisandro Dalcin 28*65a891e7SLisandro Dalcindef get_petsc_dir(): 29*65a891e7SLisandro Dalcin import os 30*65a891e7SLisandro Dalcin return os.path.dirname(__file__) 31*65a891e7SLisandro Dalcin 32*65a891e7SLisandro Dalcindef get_petsc_arch(): 33*65a891e7SLisandro Dalcin return '' 34*65a891e7SLisandro Dalcin""" 35*65a891e7SLisandro Dalcin 36*65a891e7SLisandro Dalcindef bootstrap(): 37*65a891e7SLisandro Dalcin PETSC_DIR = os.path.abspath(os.getcwd()) 38*65a891e7SLisandro Dalcin PETSC_ARCH = get_platform() + '-python' 39*65a891e7SLisandro Dalcin os.environ['PETSC_DIR'] = PETSC_DIR 40*65a891e7SLisandro Dalcin os.environ['PETSC_ARCH'] = PETSC_ARCH 41*65a891e7SLisandro Dalcin sys.path.insert(0, os.path.join(PETSC_DIR, 'config')) 42*65a891e7SLisandro Dalcin try: 43*65a891e7SLisandro Dalcin if not os.path.exists(PETSC_ARCH): 44*65a891e7SLisandro Dalcin os.mkdir(PETSC_ARCH) 45*65a891e7SLisandro Dalcin pkgfile = os.path.join(PETSC_ARCH, '__init__.py') 46*65a891e7SLisandro Dalcin if not os.path.exists(pkgfile): 47*65a891e7SLisandro Dalcin open(pkgfile, 'wt').write(init_py) 48*65a891e7SLisandro Dalcin except: 49*65a891e7SLisandro Dalcin pass 50*65a891e7SLisandro Dalcin 51*65a891e7SLisandro Dalcindef config(dry_run=False): 52*65a891e7SLisandro Dalcin log.info('PETSc: configure') 53*65a891e7SLisandro Dalcin if dry_run: return 54*65a891e7SLisandro Dalcin options = [ 55*65a891e7SLisandro Dalcin 'PETSC_ARCH='+os.environ['PETSC_ARCH'], 56*65a891e7SLisandro Dalcin '--with-shared-libraries', 57*65a891e7SLisandro Dalcin '--with-fc=0', 58*65a891e7SLisandro Dalcin '--with-mpi=0', 59*65a891e7SLisandro Dalcin ] 60e68ebbecSBarry Smith import configure 61*65a891e7SLisandro Dalcin configure.petsc_configure(options) 62e68ebbecSBarry Smith import logger 63e68ebbecSBarry Smith logger.Logger.defaultLog = None 6412c1d45bSMatthew G Knepley 65*65a891e7SLisandro Dalcindef build(dry_run=False): 66*65a891e7SLisandro Dalcin log.info('PETSc: build') 67*65a891e7SLisandro Dalcin if dry_run: return 68e68ebbecSBarry Smith import builder 69e68ebbecSBarry Smith builder.PETScMaker().run() 70105e34d4SBarry Smith import logger 71105e34d4SBarry Smith logger.Logger.defaultLog = None 72e68ebbecSBarry Smith 73*65a891e7SLisandro Dalcindef install(dest_dir, prefix=None, dry_run=False): 74*65a891e7SLisandro Dalcin log.info('PETSc: install') 75*65a891e7SLisandro Dalcin if dry_run: return 76*65a891e7SLisandro Dalcin if prefix is None: 77*65a891e7SLisandro Dalcin prefix = dest_dir 78*65a891e7SLisandro Dalcin options = [ 79*65a891e7SLisandro Dalcin '--destDir=' + dest_dir, 80*65a891e7SLisandro Dalcin '--prefix=' + prefix 81*65a891e7SLisandro Dalcin ] 82105e34d4SBarry Smith import install 83*65a891e7SLisandro Dalcin install.Installer(options).run() 84*65a891e7SLisandro Dalcin import logger 85*65a891e7SLisandro Dalcin logger.Logger.defaultLog = None 86*65a891e7SLisandro Dalcin # temporary hack - delete log files created by BuildSystem 87*65a891e7SLisandro Dalcin delfiles=['RDict.db','RDict.log', 88*65a891e7SLisandro Dalcin 'build.log','default.log', 89*65a891e7SLisandro Dalcin 'build.log.bkp','default.log.bkp'] 90105e34d4SBarry Smith for delfile in delfiles: 91*65a891e7SLisandro Dalcin try: 92*65a891e7SLisandro Dalcin if (os.path.exists(delfile) and 93*65a891e7SLisandro Dalcin os.stat(delfile).st_uid==0): 94105e34d4SBarry Smith os.remove(delfile) 95*65a891e7SLisandro Dalcin except: 96*65a891e7SLisandro Dalcin pass 97105e34d4SBarry Smith 98*65a891e7SLisandro Dalcinclass cmd_build(_build): 99*65a891e7SLisandro Dalcin 100*65a891e7SLisandro Dalcin def finalize_options(self): 101*65a891e7SLisandro Dalcin if self.build_base is None: 102*65a891e7SLisandro Dalcin self.build_base= 'build' 103*65a891e7SLisandro Dalcin self.build_base = os.path.join( 104*65a891e7SLisandro Dalcin os.environ['PETSC_ARCH'], self.build_base) 105*65a891e7SLisandro Dalcin _build.finalize_options(self) 106*65a891e7SLisandro Dalcin 107*65a891e7SLisandro Dalcin def run(self): 108*65a891e7SLisandro Dalcin _build.run(self) 109*65a891e7SLisandro Dalcin wdir = os.getcwd() 110*65a891e7SLisandro Dalcin pdir = os.environ['PETSC_DIR'] 111*65a891e7SLisandro Dalcin try: 112*65a891e7SLisandro Dalcin os.chdir(pdir) 113*65a891e7SLisandro Dalcin config(self.dry_run) 114*65a891e7SLisandro Dalcin build(self.dry_run) 115*65a891e7SLisandro Dalcin finally: 116*65a891e7SLisandro Dalcin os.chdir(wdir) 117*65a891e7SLisandro Dalcin 118*65a891e7SLisandro Dalcinclass cmd_install(_install): 119*65a891e7SLisandro Dalcin 120*65a891e7SLisandro Dalcin def run(self): 121*65a891e7SLisandro Dalcin _install.run(self) 122*65a891e7SLisandro Dalcin root_dir = self.install_platlib 123*65a891e7SLisandro Dalcin dest_dir = os.path.join(root_dir, 'petsc') 124*65a891e7SLisandro Dalcin bdist_base = self.get_finalized_command('bdist').bdist_base 125*65a891e7SLisandro Dalcin if dest_dir.startswith(bdist_base): 126*65a891e7SLisandro Dalcin prefix = dest_dir[len(bdist_base)+1:] 127*65a891e7SLisandro Dalcin prefix = prefix[prefix.index(os.path.sep):] 128*65a891e7SLisandro Dalcin else: 129*65a891e7SLisandro Dalcin prefix = dest_dir 130*65a891e7SLisandro Dalcin dest_dir = os.path.abspath(dest_dir) 131*65a891e7SLisandro Dalcin prefix = os.path.abspath(prefix) 132*65a891e7SLisandro Dalcin wdir = os.getcwd() 133*65a891e7SLisandro Dalcin pdir = os.environ['PETSC_DIR'] 134*65a891e7SLisandro Dalcin try: 135*65a891e7SLisandro Dalcin os.chdir(pdir) 136*65a891e7SLisandro Dalcin install(dest_dir, prefix, self.dry_run) 137*65a891e7SLisandro Dalcin finally: 138*65a891e7SLisandro Dalcin os.chdir(wdir) 139*65a891e7SLisandro Dalcin 140*65a891e7SLisandro Dalcindef version(): 141*65a891e7SLisandro Dalcin return 'dev' 142*65a891e7SLisandro Dalcindef tarball(): 143*65a891e7SLisandro Dalcin return None 144*65a891e7SLisandro Dalcin 145*65a891e7SLisandro Dalcindescription = __doc__.split('\n')[1:-1]; del description[1:3] 146*65a891e7SLisandro Dalcinclassifiers = """ 147*65a891e7SLisandro DalcinLicense :: Public Domain 148*65a891e7SLisandro DalcinOperating System :: POSIX 149*65a891e7SLisandro DalcinIntended Audience :: Developers 150*65a891e7SLisandro DalcinIntended Audience :: Science/Research 151*65a891e7SLisandro DalcinProgramming Language :: C 152*65a891e7SLisandro DalcinProgramming Language :: C++ 153*65a891e7SLisandro DalcinProgramming Language :: Fortran 154*65a891e7SLisandro DalcinProgramming Language :: Python 155*65a891e7SLisandro DalcinTopic :: Scientific/Engineering 156*65a891e7SLisandro DalcinTopic :: Software Development :: Libraries 157*65a891e7SLisandro Dalcin""" 158*65a891e7SLisandro Dalcin 159*65a891e7SLisandro Dalcinbootstrap() 160*65a891e7SLisandro Dalcinsetup(name='petsc', 161*65a891e7SLisandro Dalcin version=version(), 162*65a891e7SLisandro Dalcin description=description.pop(0), 163*65a891e7SLisandro Dalcin long_description='\n'.join(description), 164*65a891e7SLisandro Dalcin classifiers= classifiers.split('\n')[1:-1], 165*65a891e7SLisandro Dalcin keywords = ['PETSc', 'MPI'], 166*65a891e7SLisandro Dalcin platforms=['POSIX'], 167*65a891e7SLisandro Dalcin license='PETSc', 168*65a891e7SLisandro Dalcin 169*65a891e7SLisandro Dalcin provides=['petsc'], 170*65a891e7SLisandro Dalcin requires=[], 171*65a891e7SLisandro Dalcin 172*65a891e7SLisandro Dalcin url='http://www.mcs.anl.gov/petsc/', 173*65a891e7SLisandro Dalcin download_url=tarball(), 174*65a891e7SLisandro Dalcin 175*65a891e7SLisandro Dalcin author='PETSc Team', 176*65a891e7SLisandro Dalcin author_email='petsc-users@mcs.anl.gov', 177*65a891e7SLisandro Dalcin maintainer='Lisandro Dalcin', 178*65a891e7SLisandro Dalcin maintainer_email='dalcinl@gmail.com', 179*65a891e7SLisandro Dalcin 180*65a891e7SLisandro Dalcin packages = ['petsc'], 181*65a891e7SLisandro Dalcin package_dir = {'petsc': os.environ['PETSC_ARCH']}, 182*65a891e7SLisandro Dalcin cmdclass={ 183*65a891e7SLisandro Dalcin 'build': cmd_build, 184*65a891e7SLisandro Dalcin 'install': cmd_install, 185*65a891e7SLisandro Dalcin }, 186*65a891e7SLisandro Dalcin ) 187