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