xref: /petsc/setup.py (revision 1b0953335cf15d88cf752e3df40240fa6bfd0d76)
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