1e68ebbecSBarry Smith#!/usr/bin/env python 2e68ebbecSBarry Smith 3e68ebbecSBarry Smith""" 465a891e7SLisandro DalcinPETSc: Portable, Extensible Toolkit for Scientific Computation 565a891e7SLisandro Dalcin============================================================== 665a891e7SLisandro Dalcin 765a891e7SLisandro DalcinThe Portable, Extensible Toolkit for Scientific Computation (PETSc), 865a891e7SLisandro Dalcinis a suite of data structures and routines for the scalable (parallel) 965a891e7SLisandro Dalcinsolution of scientific applications modeled by partial differential 1065a891e7SLisandro Dalcinequations. It employs the Message Passing Interface (MPI) standard for 1165a891e7SLisandro Dalcinall message-passing communication. 12e68ebbecSBarry Smith""" 13e68ebbecSBarry Smith 1465a891e7SLisandro Dalcinimport sys, os 1565a891e7SLisandro Dalcinfrom distutils.core import setup 1665a891e7SLisandro Dalcinfrom distutils.util import get_platform 17b88f8b63SLisandro Dalcinfrom distutils.spawn import find_executable 1865a891e7SLisandro Dalcinfrom distutils.command.build import build as _build 1965a891e7SLisandro Dalcinif 'setuptools' in sys.modules: 2065a891e7SLisandro Dalcin from setuptools.command.install import install as _install 2165a891e7SLisandro Dalcinelse: 2265a891e7SLisandro Dalcin from distutils.command.install import install as _install 23a32381aeSLisandro Dalcinfrom distutils.command.sdist import sdist as _sdist 2465a891e7SLisandro Dalcinfrom distutils import log 2512c1d45bSMatthew G Knepley 2659e0f383SLisandro DalcinPETSC_DIR = None 2759e0f383SLisandro DalcinPETSC_ARCH = None 2859e0f383SLisandro Dalcin 2965a891e7SLisandro Dalcininit_py = """\ 30a32381aeSLisandro Dalcin# Author: PETSc Team 31a32381aeSLisandro Dalcin# Contact: petsc-users@mcs.anl.gov 3265a891e7SLisandro Dalcin 3365a891e7SLisandro Dalcindef get_petsc_dir(): 3465a891e7SLisandro Dalcin import os 3565a891e7SLisandro Dalcin return os.path.dirname(__file__) 3665a891e7SLisandro Dalcin 3765a891e7SLisandro Dalcindef get_petsc_arch(): 3865a891e7SLisandro Dalcin return '' 39a32381aeSLisandro Dalcin 40a32381aeSLisandro Dalcindef get_config(): 41a32381aeSLisandro Dalcin conf = {} 42a32381aeSLisandro Dalcin conf['petsc_dir'] = get_petsc_dir() 43a32381aeSLisandro Dalcin return conf 4465a891e7SLisandro Dalcin""" 4565a891e7SLisandro Dalcin 4659e0f383SLisandro Dalcinmetadata = { 4759e0f383SLisandro Dalcin 'provides' : ['petsc'], 4859e0f383SLisandro Dalcin 'requires' : [], 4959e0f383SLisandro Dalcin} 5059e0f383SLisandro Dalcin 5165a891e7SLisandro Dalcindef bootstrap(): 5259e0f383SLisandro Dalcin # Set PETSC_DIR and PETSC_ARCH, 5359e0f383SLisandro Dalcin global PETSC_DIR, PETSC_ARCH 5465a891e7SLisandro Dalcin PETSC_DIR = os.path.abspath(os.getcwd()) 5565a891e7SLisandro Dalcin PETSC_ARCH = get_platform() + '-python' 5665a891e7SLisandro Dalcin os.environ['PETSC_DIR'] = PETSC_DIR 5765a891e7SLisandro Dalcin os.environ['PETSC_ARCH'] = PETSC_ARCH 5865a891e7SLisandro Dalcin sys.path.insert(0, os.path.join(PETSC_DIR, 'config')) 5959e0f383SLisandro Dalcin # Generate package __init__.py file 6065a891e7SLisandro Dalcin try: 6165a891e7SLisandro Dalcin if not os.path.exists(PETSC_ARCH): 6265a891e7SLisandro Dalcin os.mkdir(PETSC_ARCH) 6365a891e7SLisandro Dalcin pkgfile = os.path.join(PETSC_ARCH, '__init__.py') 6465a891e7SLisandro Dalcin if not os.path.exists(pkgfile): 6565a891e7SLisandro Dalcin open(pkgfile, 'wt').write(init_py) 6665a891e7SLisandro Dalcin except: 6765a891e7SLisandro Dalcin pass 6859e0f383SLisandro Dalcin # Simple-minded lookup for MPI and mpi4py 6959e0f383SLisandro Dalcin mpi4py = mpicc = None 7059e0f383SLisandro Dalcin try: 7159e0f383SLisandro Dalcin import mpi4py 7259e0f383SLisandro Dalcin conf = mpi4py.get_config() 7359e0f383SLisandro Dalcin mpicc = conf.get('mpicc') 7459e0f383SLisandro Dalcin except ImportError: # mpi4py is not installed 7559e0f383SLisandro Dalcin mpicc = os.environ.get('MPICC') or find_executable('mpicc') 76*1b095333SLisandro Dalcin except AttributeError: # mpi4py is too old 7759e0f383SLisandro Dalcin pass 7859e0f383SLisandro Dalcin if not mpi4py and mpicc: 79*1b095333SLisandro Dalcin if (('distribute' in sys.modules) or 80*1b095333SLisandro Dalcin ('setuptools' in sys.modules)): 81*1b095333SLisandro Dalcin metadata['install_requires']= ['mpi4py>=1.2.2'] 8265a891e7SLisandro Dalcin 8365a891e7SLisandro Dalcindef config(dry_run=False): 8465a891e7SLisandro Dalcin log.info('PETSc: configure') 8565a891e7SLisandro Dalcin if dry_run: return 8665a891e7SLisandro Dalcin options = [ 8765a891e7SLisandro Dalcin 'PETSC_ARCH='+os.environ['PETSC_ARCH'], 8865a891e7SLisandro Dalcin '--with-shared-libraries', 8959e0f383SLisandro Dalcin '--with-cmake=0', # not needed 9065a891e7SLisandro Dalcin ] 9159e0f383SLisandro Dalcin # MPI 9259e0f383SLisandro Dalcin try: 9359e0f383SLisandro Dalcin import mpi4py 9459e0f383SLisandro Dalcin conf = mpi4py.get_config() 9559e0f383SLisandro Dalcin mpicc = conf.get('mpicc') 9659e0f383SLisandro Dalcin except (ImportError, AttributeError): 9759e0f383SLisandro Dalcin mpicc = os.environ.get('MPICC') or find_executable('mpicc') 9859e0f383SLisandro Dalcin if mpicc: 9959e0f383SLisandro Dalcin options.append('--with-cc='+mpicc) 10059e0f383SLisandro Dalcin else: 10159e0f383SLisandro Dalcin options.append('--with-mpi=0') 10259e0f383SLisandro Dalcin options.extend([ 10359e0f383SLisandro Dalcin '--with-fc=0', # XXX mpif90? 10459e0f383SLisandro Dalcin '--with-cxx=0', # XXX mpicxx? 10559e0f383SLisandro Dalcin ]) 10659e0f383SLisandro Dalcin # Run PETSc configure 107e68ebbecSBarry Smith import configure 10865a891e7SLisandro Dalcin configure.petsc_configure(options) 109e68ebbecSBarry Smith import logger 110e68ebbecSBarry Smith logger.Logger.defaultLog = None 11112c1d45bSMatthew G Knepley 11265a891e7SLisandro Dalcindef build(dry_run=False): 11365a891e7SLisandro Dalcin log.info('PETSc: build') 11465a891e7SLisandro Dalcin if dry_run: return 11559e0f383SLisandro Dalcin # Run PETSc builder 116e68ebbecSBarry Smith import builder 117e68ebbecSBarry Smith builder.PETScMaker().run() 118105e34d4SBarry Smith import logger 119105e34d4SBarry Smith logger.Logger.defaultLog = None 120e68ebbecSBarry Smith 12165a891e7SLisandro Dalcindef install(dest_dir, prefix=None, dry_run=False): 12265a891e7SLisandro Dalcin log.info('PETSc: install') 12365a891e7SLisandro Dalcin if dry_run: return 12465a891e7SLisandro Dalcin if prefix is None: 12565a891e7SLisandro Dalcin prefix = dest_dir 12665a891e7SLisandro Dalcin options = [ 12765a891e7SLisandro Dalcin '--destDir=' + dest_dir, 12865a891e7SLisandro Dalcin '--prefix=' + prefix 12965a891e7SLisandro Dalcin ] 13059e0f383SLisandro Dalcin # Run PETSc installer 131105e34d4SBarry Smith import install 13265a891e7SLisandro Dalcin install.Installer(options).run() 13365a891e7SLisandro Dalcin import logger 13465a891e7SLisandro Dalcin logger.Logger.defaultLog = None 13565a891e7SLisandro Dalcin # temporary hack - delete log files created by BuildSystem 13665a891e7SLisandro Dalcin delfiles=['RDict.db','RDict.log', 13765a891e7SLisandro Dalcin 'build.log','default.log', 13865a891e7SLisandro Dalcin 'build.log.bkp','default.log.bkp'] 139105e34d4SBarry Smith for delfile in delfiles: 14065a891e7SLisandro Dalcin try: 14165a891e7SLisandro Dalcin if (os.path.exists(delfile) and 14265a891e7SLisandro Dalcin os.stat(delfile).st_uid==0): 143105e34d4SBarry Smith os.remove(delfile) 14465a891e7SLisandro Dalcin except: 14565a891e7SLisandro Dalcin pass 146105e34d4SBarry Smith 14765a891e7SLisandro Dalcinclass cmd_build(_build): 14865a891e7SLisandro Dalcin 14965a891e7SLisandro Dalcin def finalize_options(self): 15065a891e7SLisandro Dalcin if self.build_base is None: 15165a891e7SLisandro Dalcin self.build_base= 'build' 15265a891e7SLisandro Dalcin self.build_base = os.path.join( 15365a891e7SLisandro Dalcin os.environ['PETSC_ARCH'], self.build_base) 15465a891e7SLisandro Dalcin _build.finalize_options(self) 15565a891e7SLisandro Dalcin 15665a891e7SLisandro Dalcin def run(self): 15765a891e7SLisandro Dalcin _build.run(self) 15865a891e7SLisandro Dalcin wdir = os.getcwd() 15965a891e7SLisandro Dalcin pdir = os.environ['PETSC_DIR'] 16065a891e7SLisandro Dalcin try: 16165a891e7SLisandro Dalcin os.chdir(pdir) 16265a891e7SLisandro Dalcin config(self.dry_run) 16365a891e7SLisandro Dalcin build(self.dry_run) 16465a891e7SLisandro Dalcin finally: 16565a891e7SLisandro Dalcin os.chdir(wdir) 16665a891e7SLisandro Dalcin 16765a891e7SLisandro Dalcinclass cmd_install(_install): 16865a891e7SLisandro Dalcin 16965a891e7SLisandro Dalcin def run(self): 17065a891e7SLisandro Dalcin _install.run(self) 17165a891e7SLisandro Dalcin root_dir = self.install_platlib 17265a891e7SLisandro Dalcin dest_dir = os.path.join(root_dir, 'petsc') 17365a891e7SLisandro Dalcin bdist_base = self.get_finalized_command('bdist').bdist_base 17465a891e7SLisandro Dalcin if dest_dir.startswith(bdist_base): 17565a891e7SLisandro Dalcin prefix = dest_dir[len(bdist_base)+1:] 17665a891e7SLisandro Dalcin prefix = prefix[prefix.index(os.path.sep):] 17765a891e7SLisandro Dalcin else: 17865a891e7SLisandro Dalcin prefix = dest_dir 17965a891e7SLisandro Dalcin dest_dir = os.path.abspath(dest_dir) 18065a891e7SLisandro Dalcin prefix = os.path.abspath(prefix) 18165a891e7SLisandro Dalcin wdir = os.getcwd() 18265a891e7SLisandro Dalcin pdir = os.environ['PETSC_DIR'] 18365a891e7SLisandro Dalcin try: 18465a891e7SLisandro Dalcin os.chdir(pdir) 18565a891e7SLisandro Dalcin install(dest_dir, prefix, self.dry_run) 18665a891e7SLisandro Dalcin finally: 18765a891e7SLisandro Dalcin os.chdir(wdir) 18865a891e7SLisandro Dalcin 189a32381aeSLisandro Dalcinclass cmd_sdist(_sdist): 190a32381aeSLisandro Dalcin 191a32381aeSLisandro Dalcin def initialize_options(self): 192a32381aeSLisandro Dalcin _sdist.initialize_options(self) 193a32381aeSLisandro Dalcin self.force_manifest = 1 194a32381aeSLisandro Dalcin self.template = os.path.join('config', 'MANIFEST.in') 195a32381aeSLisandro Dalcin 196a32381aeSLisandro Dalcin def run(self): 197a32381aeSLisandro Dalcin _sdist.run(self) 198a32381aeSLisandro Dalcin try: 199a32381aeSLisandro Dalcin os.remove(self.manifest) 200a32381aeSLisandro Dalcin except Exception: 201a32381aeSLisandro Dalcin pass 202a32381aeSLisandro Dalcin 20365a891e7SLisandro Dalcindef version(): 20459e0f383SLisandro Dalcin return '3.2.dev1' # XXX should parse include/petscversion.h 20559e0f383SLisandro Dalcin 20665a891e7SLisandro Dalcindef tarball(): 207a32381aeSLisandro Dalcin return None 208f6b9c231SLisandro Dalcin return ('http://ftp.mcs.anl.gov/pub/petsc/<XXX>/' # XXX fix this line 209f6b9c231SLisandro Dalcin 'petsc-lite-%s.tar.gz' % version() ) 21065a891e7SLisandro Dalcin 21165a891e7SLisandro Dalcindescription = __doc__.split('\n')[1:-1]; del description[1:3] 21265a891e7SLisandro Dalcinclassifiers = """ 21365a891e7SLisandro DalcinLicense :: Public Domain 21465a891e7SLisandro DalcinOperating System :: POSIX 21565a891e7SLisandro DalcinIntended Audience :: Developers 21665a891e7SLisandro DalcinIntended Audience :: Science/Research 21765a891e7SLisandro DalcinProgramming Language :: C 21865a891e7SLisandro DalcinProgramming Language :: C++ 21965a891e7SLisandro DalcinProgramming Language :: Fortran 22065a891e7SLisandro DalcinProgramming Language :: Python 22165a891e7SLisandro DalcinTopic :: Scientific/Engineering 22265a891e7SLisandro DalcinTopic :: Software Development :: Libraries 22365a891e7SLisandro Dalcin""" 22465a891e7SLisandro Dalcin 22565a891e7SLisandro Dalcinbootstrap() 22665a891e7SLisandro Dalcinsetup(name='petsc', 22765a891e7SLisandro Dalcin version=version(), 22865a891e7SLisandro Dalcin description=description.pop(0), 22965a891e7SLisandro Dalcin long_description='\n'.join(description), 23065a891e7SLisandro Dalcin classifiers= classifiers.split('\n')[1:-1], 23165a891e7SLisandro Dalcin keywords = ['PETSc', 'MPI'], 23265a891e7SLisandro Dalcin platforms=['POSIX'], 23365a891e7SLisandro Dalcin license='PETSc', 23465a891e7SLisandro Dalcin 23565a891e7SLisandro Dalcin url='http://www.mcs.anl.gov/petsc/', 23665a891e7SLisandro Dalcin download_url=tarball(), 23765a891e7SLisandro Dalcin 23865a891e7SLisandro Dalcin author='PETSc Team', 23965a891e7SLisandro Dalcin author_email='petsc-users@mcs.anl.gov', 24065a891e7SLisandro Dalcin maintainer='Lisandro Dalcin', 24165a891e7SLisandro Dalcin maintainer_email='dalcinl@gmail.com', 24265a891e7SLisandro Dalcin 24365a891e7SLisandro Dalcin packages = ['petsc'], 24465a891e7SLisandro Dalcin package_dir = {'petsc': os.environ['PETSC_ARCH']}, 24565a891e7SLisandro Dalcin cmdclass={ 24665a891e7SLisandro Dalcin 'build': cmd_build, 24765a891e7SLisandro Dalcin 'install': cmd_install, 248a32381aeSLisandro Dalcin 'sdist': cmd_sdist, 24965a891e7SLisandro Dalcin }, 25059e0f383SLisandro Dalcin **metadata) 251