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 1765a891e7SLisandro Dalcinfrom distutils.command.build import build as _build 1865a891e7SLisandro Dalcinif 'setuptools' in sys.modules: 1965a891e7SLisandro Dalcin from setuptools.command.install import install as _install 2065a891e7SLisandro Dalcinelse: 2165a891e7SLisandro Dalcin from distutils.command.install import install as _install 22a32381aeSLisandro Dalcinfrom distutils.command.sdist import sdist as _sdist 2365a891e7SLisandro Dalcinfrom distutils import log 2412c1d45bSMatthew G Knepley 25*59e0f383SLisandro DalcinPETSC_DIR = None 26*59e0f383SLisandro DalcinPETSC_ARCH = None 27*59e0f383SLisandro Dalcin 2865a891e7SLisandro Dalcininit_py = """\ 29a32381aeSLisandro Dalcin# Author: PETSc Team 30a32381aeSLisandro Dalcin# Contact: petsc-users@mcs.anl.gov 3165a891e7SLisandro Dalcin 3265a891e7SLisandro Dalcindef get_petsc_dir(): 3365a891e7SLisandro Dalcin import os 3465a891e7SLisandro Dalcin return os.path.dirname(__file__) 3565a891e7SLisandro Dalcin 3665a891e7SLisandro Dalcindef get_petsc_arch(): 3765a891e7SLisandro Dalcin return '' 38a32381aeSLisandro Dalcin 39a32381aeSLisandro Dalcindef get_config(): 40a32381aeSLisandro Dalcin conf = {} 41a32381aeSLisandro Dalcin conf['petsc_dir'] = get_petsc_dir() 42a32381aeSLisandro Dalcin return conf 4365a891e7SLisandro Dalcin""" 4465a891e7SLisandro Dalcin 45*59e0f383SLisandro Dalcinmetadata = { 46*59e0f383SLisandro Dalcin 'provides' : ['petsc'], 47*59e0f383SLisandro Dalcin 'requires' : [], 48*59e0f383SLisandro Dalcin} 49*59e0f383SLisandro Dalcin 5065a891e7SLisandro Dalcindef bootstrap(): 51*59e0f383SLisandro Dalcin # Set PETSC_DIR and PETSC_ARCH, 52*59e0f383SLisandro Dalcin global PETSC_DIR, PETSC_ARCH 5365a891e7SLisandro Dalcin PETSC_DIR = os.path.abspath(os.getcwd()) 5465a891e7SLisandro Dalcin PETSC_ARCH = get_platform() + '-python' 5565a891e7SLisandro Dalcin os.environ['PETSC_DIR'] = PETSC_DIR 5665a891e7SLisandro Dalcin os.environ['PETSC_ARCH'] = PETSC_ARCH 5765a891e7SLisandro Dalcin sys.path.insert(0, os.path.join(PETSC_DIR, 'config')) 58*59e0f383SLisandro Dalcin # Generate package __init__.py file 5965a891e7SLisandro Dalcin try: 6065a891e7SLisandro Dalcin if not os.path.exists(PETSC_ARCH): 6165a891e7SLisandro Dalcin os.mkdir(PETSC_ARCH) 6265a891e7SLisandro Dalcin pkgfile = os.path.join(PETSC_ARCH, '__init__.py') 6365a891e7SLisandro Dalcin if not os.path.exists(pkgfile): 6465a891e7SLisandro Dalcin open(pkgfile, 'wt').write(init_py) 6565a891e7SLisandro Dalcin except: 6665a891e7SLisandro Dalcin pass 67*59e0f383SLisandro Dalcin # Simple-minded lookup for MPI and mpi4py 68*59e0f383SLisandro Dalcin from distutils.spawn import find_executable 69*59e0f383SLisandro Dalcin mpi4py = mpicc = None 70*59e0f383SLisandro Dalcin try: 71*59e0f383SLisandro Dalcin import mpi4py 72*59e0f383SLisandro Dalcin conf = mpi4py.get_config() 73*59e0f383SLisandro Dalcin mpicc = conf.get('mpicc') 74*59e0f383SLisandro Dalcin except ImportError: # mpi4py is not installed 75*59e0f383SLisandro Dalcin mpicc = os.environ.get('MPICC') or find_executable('mpicc') 76*59e0f383SLisandro Dalcin except AttributeError: # mpi4py too old 77*59e0f383SLisandro Dalcin pass 78*59e0f383SLisandro Dalcin if not mpi4py and mpicc: 79*59e0f383SLisandro Dalcin metadata['requires'].append('mpi4py') 8065a891e7SLisandro Dalcin 8165a891e7SLisandro Dalcindef config(dry_run=False): 8265a891e7SLisandro Dalcin log.info('PETSc: configure') 8365a891e7SLisandro Dalcin if dry_run: return 8465a891e7SLisandro Dalcin options = [ 8565a891e7SLisandro Dalcin 'PETSC_ARCH='+os.environ['PETSC_ARCH'], 8665a891e7SLisandro Dalcin '--with-shared-libraries', 87*59e0f383SLisandro Dalcin '--with-cmake=0', # not needed 8865a891e7SLisandro Dalcin ] 89*59e0f383SLisandro Dalcin # MPI 90*59e0f383SLisandro Dalcin try: 91*59e0f383SLisandro Dalcin import mpi4py 92*59e0f383SLisandro Dalcin conf = mpi4py.get_config() 93*59e0f383SLisandro Dalcin mpicc = conf.get('mpicc') 94*59e0f383SLisandro Dalcin except (ImportError, AttributeError): 95*59e0f383SLisandro Dalcin mpicc = os.environ.get('MPICC') or find_executable('mpicc') 96*59e0f383SLisandro Dalcin if mpicc: 97*59e0f383SLisandro Dalcin options.append('--with-cc='+mpicc) 98*59e0f383SLisandro Dalcin else: 99*59e0f383SLisandro Dalcin options.append('--with-mpi=0') 100*59e0f383SLisandro Dalcin options.extend([ 101*59e0f383SLisandro Dalcin '--with-fc=0', # XXX mpif90? 102*59e0f383SLisandro Dalcin '--with-cxx=0', # XXX mpicxx? 103*59e0f383SLisandro Dalcin ]) 104*59e0f383SLisandro Dalcin # Run PETSc configure 105e68ebbecSBarry Smith import configure 10665a891e7SLisandro Dalcin configure.petsc_configure(options) 107e68ebbecSBarry Smith import logger 108e68ebbecSBarry Smith logger.Logger.defaultLog = None 10912c1d45bSMatthew G Knepley 11065a891e7SLisandro Dalcindef build(dry_run=False): 11165a891e7SLisandro Dalcin log.info('PETSc: build') 11265a891e7SLisandro Dalcin if dry_run: return 113*59e0f383SLisandro Dalcin # Run PETSc builder 114e68ebbecSBarry Smith import builder 115e68ebbecSBarry Smith builder.PETScMaker().run() 116105e34d4SBarry Smith import logger 117105e34d4SBarry Smith logger.Logger.defaultLog = None 118e68ebbecSBarry Smith 11965a891e7SLisandro Dalcindef install(dest_dir, prefix=None, dry_run=False): 12065a891e7SLisandro Dalcin log.info('PETSc: install') 12165a891e7SLisandro Dalcin if dry_run: return 12265a891e7SLisandro Dalcin if prefix is None: 12365a891e7SLisandro Dalcin prefix = dest_dir 12465a891e7SLisandro Dalcin options = [ 12565a891e7SLisandro Dalcin '--destDir=' + dest_dir, 12665a891e7SLisandro Dalcin '--prefix=' + prefix 12765a891e7SLisandro Dalcin ] 128*59e0f383SLisandro Dalcin # Run PETSc installer 129105e34d4SBarry Smith import install 13065a891e7SLisandro Dalcin install.Installer(options).run() 13165a891e7SLisandro Dalcin import logger 13265a891e7SLisandro Dalcin logger.Logger.defaultLog = None 13365a891e7SLisandro Dalcin # temporary hack - delete log files created by BuildSystem 13465a891e7SLisandro Dalcin delfiles=['RDict.db','RDict.log', 13565a891e7SLisandro Dalcin 'build.log','default.log', 13665a891e7SLisandro Dalcin 'build.log.bkp','default.log.bkp'] 137105e34d4SBarry Smith for delfile in delfiles: 13865a891e7SLisandro Dalcin try: 13965a891e7SLisandro Dalcin if (os.path.exists(delfile) and 14065a891e7SLisandro Dalcin os.stat(delfile).st_uid==0): 141105e34d4SBarry Smith os.remove(delfile) 14265a891e7SLisandro Dalcin except: 14365a891e7SLisandro Dalcin pass 144105e34d4SBarry Smith 14565a891e7SLisandro Dalcinclass cmd_build(_build): 14665a891e7SLisandro Dalcin 14765a891e7SLisandro Dalcin def finalize_options(self): 14865a891e7SLisandro Dalcin if self.build_base is None: 14965a891e7SLisandro Dalcin self.build_base= 'build' 15065a891e7SLisandro Dalcin self.build_base = os.path.join( 15165a891e7SLisandro Dalcin os.environ['PETSC_ARCH'], self.build_base) 15265a891e7SLisandro Dalcin _build.finalize_options(self) 15365a891e7SLisandro Dalcin 15465a891e7SLisandro Dalcin def run(self): 15565a891e7SLisandro Dalcin _build.run(self) 15665a891e7SLisandro Dalcin wdir = os.getcwd() 15765a891e7SLisandro Dalcin pdir = os.environ['PETSC_DIR'] 15865a891e7SLisandro Dalcin try: 15965a891e7SLisandro Dalcin os.chdir(pdir) 16065a891e7SLisandro Dalcin config(self.dry_run) 16165a891e7SLisandro Dalcin build(self.dry_run) 16265a891e7SLisandro Dalcin finally: 16365a891e7SLisandro Dalcin os.chdir(wdir) 16465a891e7SLisandro Dalcin 16565a891e7SLisandro Dalcinclass cmd_install(_install): 16665a891e7SLisandro Dalcin 16765a891e7SLisandro Dalcin def run(self): 16865a891e7SLisandro Dalcin _install.run(self) 16965a891e7SLisandro Dalcin root_dir = self.install_platlib 17065a891e7SLisandro Dalcin dest_dir = os.path.join(root_dir, 'petsc') 17165a891e7SLisandro Dalcin bdist_base = self.get_finalized_command('bdist').bdist_base 17265a891e7SLisandro Dalcin if dest_dir.startswith(bdist_base): 17365a891e7SLisandro Dalcin prefix = dest_dir[len(bdist_base)+1:] 17465a891e7SLisandro Dalcin prefix = prefix[prefix.index(os.path.sep):] 17565a891e7SLisandro Dalcin else: 17665a891e7SLisandro Dalcin prefix = dest_dir 17765a891e7SLisandro Dalcin dest_dir = os.path.abspath(dest_dir) 17865a891e7SLisandro Dalcin prefix = os.path.abspath(prefix) 17965a891e7SLisandro Dalcin wdir = os.getcwd() 18065a891e7SLisandro Dalcin pdir = os.environ['PETSC_DIR'] 18165a891e7SLisandro Dalcin try: 18265a891e7SLisandro Dalcin os.chdir(pdir) 18365a891e7SLisandro Dalcin install(dest_dir, prefix, self.dry_run) 18465a891e7SLisandro Dalcin finally: 18565a891e7SLisandro Dalcin os.chdir(wdir) 18665a891e7SLisandro Dalcin 187a32381aeSLisandro Dalcinclass cmd_sdist(_sdist): 188a32381aeSLisandro Dalcin 189a32381aeSLisandro Dalcin def initialize_options(self): 190a32381aeSLisandro Dalcin _sdist.initialize_options(self) 191a32381aeSLisandro Dalcin self.force_manifest = 1 192a32381aeSLisandro Dalcin self.template = os.path.join('config', 'MANIFEST.in') 193a32381aeSLisandro Dalcin 194a32381aeSLisandro Dalcin def run(self): 195a32381aeSLisandro Dalcin _sdist.run(self) 196a32381aeSLisandro Dalcin try: 197a32381aeSLisandro Dalcin os.remove(self.manifest) 198a32381aeSLisandro Dalcin except Exception: 199a32381aeSLisandro Dalcin pass 200a32381aeSLisandro Dalcin 20165a891e7SLisandro Dalcindef version(): 202*59e0f383SLisandro Dalcin return '3.2.dev1' # XXX should parse include/petscversion.h 203*59e0f383SLisandro Dalcin 20465a891e7SLisandro Dalcindef tarball(): 205a32381aeSLisandro Dalcin return None 206f6b9c231SLisandro Dalcin return ('http://ftp.mcs.anl.gov/pub/petsc/<XXX>/' # XXX fix this line 207f6b9c231SLisandro Dalcin 'petsc-lite-%s.tar.gz' % version() ) 20865a891e7SLisandro Dalcin 20965a891e7SLisandro Dalcindescription = __doc__.split('\n')[1:-1]; del description[1:3] 21065a891e7SLisandro Dalcinclassifiers = """ 21165a891e7SLisandro DalcinLicense :: Public Domain 21265a891e7SLisandro DalcinOperating System :: POSIX 21365a891e7SLisandro DalcinIntended Audience :: Developers 21465a891e7SLisandro DalcinIntended Audience :: Science/Research 21565a891e7SLisandro DalcinProgramming Language :: C 21665a891e7SLisandro DalcinProgramming Language :: C++ 21765a891e7SLisandro DalcinProgramming Language :: Fortran 21865a891e7SLisandro DalcinProgramming Language :: Python 21965a891e7SLisandro DalcinTopic :: Scientific/Engineering 22065a891e7SLisandro DalcinTopic :: Software Development :: Libraries 22165a891e7SLisandro Dalcin""" 22265a891e7SLisandro Dalcin 22365a891e7SLisandro Dalcinbootstrap() 22465a891e7SLisandro Dalcinsetup(name='petsc', 22565a891e7SLisandro Dalcin version=version(), 22665a891e7SLisandro Dalcin description=description.pop(0), 22765a891e7SLisandro Dalcin long_description='\n'.join(description), 22865a891e7SLisandro Dalcin classifiers= classifiers.split('\n')[1:-1], 22965a891e7SLisandro Dalcin keywords = ['PETSc', 'MPI'], 23065a891e7SLisandro Dalcin platforms=['POSIX'], 23165a891e7SLisandro Dalcin license='PETSc', 23265a891e7SLisandro Dalcin 23365a891e7SLisandro Dalcin url='http://www.mcs.anl.gov/petsc/', 23465a891e7SLisandro Dalcin download_url=tarball(), 23565a891e7SLisandro Dalcin 23665a891e7SLisandro Dalcin author='PETSc Team', 23765a891e7SLisandro Dalcin author_email='petsc-users@mcs.anl.gov', 23865a891e7SLisandro Dalcin maintainer='Lisandro Dalcin', 23965a891e7SLisandro Dalcin maintainer_email='dalcinl@gmail.com', 24065a891e7SLisandro Dalcin 24165a891e7SLisandro Dalcin packages = ['petsc'], 24265a891e7SLisandro Dalcin package_dir = {'petsc': os.environ['PETSC_ARCH']}, 24365a891e7SLisandro Dalcin cmdclass={ 24465a891e7SLisandro Dalcin 'build': cmd_build, 24565a891e7SLisandro Dalcin 'install': cmd_install, 246a32381aeSLisandro Dalcin 'sdist': cmd_sdist, 24765a891e7SLisandro Dalcin }, 248*59e0f383SLisandro Dalcin **metadata) 249