xref: /petsc/setup.py (revision f6b9c231114d31e4d199ea0ca6847c5adc24e5c2)
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
2265a891e7SLisandro Dalcinfrom distutils import log
2312c1d45bSMatthew G Knepley
2465a891e7SLisandro Dalcininit_py = """\
2565a891e7SLisandro Dalcin# Author:  Lisandro Dalcin
2665a891e7SLisandro Dalcin# Contact: dalcinl@gmail.com
2765a891e7SLisandro Dalcin
2865a891e7SLisandro Dalcindef get_petsc_dir():
2965a891e7SLisandro Dalcin    import os
3065a891e7SLisandro Dalcin    return os.path.dirname(__file__)
3165a891e7SLisandro Dalcin
3265a891e7SLisandro Dalcindef get_petsc_arch():
3365a891e7SLisandro Dalcin    return ''
3465a891e7SLisandro Dalcin"""
3565a891e7SLisandro Dalcin
3665a891e7SLisandro Dalcindef bootstrap():
3765a891e7SLisandro Dalcin    PETSC_DIR  = os.path.abspath(os.getcwd())
3865a891e7SLisandro Dalcin    PETSC_ARCH = get_platform() + '-python'
3965a891e7SLisandro Dalcin    os.environ['PETSC_DIR']  = PETSC_DIR
4065a891e7SLisandro Dalcin    os.environ['PETSC_ARCH'] = PETSC_ARCH
4165a891e7SLisandro Dalcin    sys.path.insert(0, os.path.join(PETSC_DIR, 'config'))
4265a891e7SLisandro Dalcin    try:
4365a891e7SLisandro Dalcin        if not os.path.exists(PETSC_ARCH):
4465a891e7SLisandro Dalcin            os.mkdir(PETSC_ARCH)
4565a891e7SLisandro Dalcin        pkgfile = os.path.join(PETSC_ARCH, '__init__.py')
4665a891e7SLisandro Dalcin        if not os.path.exists(pkgfile):
4765a891e7SLisandro Dalcin            open(pkgfile, 'wt').write(init_py)
4865a891e7SLisandro Dalcin    except:
4965a891e7SLisandro Dalcin        pass
5065a891e7SLisandro Dalcin
5165a891e7SLisandro Dalcindef config(dry_run=False):
5265a891e7SLisandro Dalcin    log.info('PETSc: configure')
5365a891e7SLisandro Dalcin    if dry_run: return
5465a891e7SLisandro Dalcin    options = [
5565a891e7SLisandro Dalcin        'PETSC_ARCH='+os.environ['PETSC_ARCH'],
5665a891e7SLisandro Dalcin        '--with-shared-libraries',
5765a891e7SLisandro Dalcin        '--with-fc=0',
5865a891e7SLisandro Dalcin        '--with-mpi=0',
5965a891e7SLisandro Dalcin        ]
60e68ebbecSBarry Smith    import configure
6165a891e7SLisandro Dalcin    configure.petsc_configure(options)
62e68ebbecSBarry Smith    import logger
63e68ebbecSBarry Smith    logger.Logger.defaultLog = None
6412c1d45bSMatthew G Knepley
6565a891e7SLisandro Dalcindef build(dry_run=False):
6665a891e7SLisandro Dalcin    log.info('PETSc: build')
6765a891e7SLisandro 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
7365a891e7SLisandro Dalcindef install(dest_dir, prefix=None, dry_run=False):
7465a891e7SLisandro Dalcin    log.info('PETSc: install')
7565a891e7SLisandro Dalcin    if dry_run: return
7665a891e7SLisandro Dalcin    if prefix is None:
7765a891e7SLisandro Dalcin        prefix = dest_dir
7865a891e7SLisandro Dalcin    options = [
7965a891e7SLisandro Dalcin        '--destDir=' + dest_dir,
8065a891e7SLisandro Dalcin        '--prefix='  + prefix
8165a891e7SLisandro Dalcin        ]
82105e34d4SBarry Smith    import install
8365a891e7SLisandro Dalcin    install.Installer(options).run()
8465a891e7SLisandro Dalcin    import logger
8565a891e7SLisandro Dalcin    logger.Logger.defaultLog = None
8665a891e7SLisandro Dalcin    # temporary hack - delete log files created by BuildSystem
8765a891e7SLisandro Dalcin    delfiles=['RDict.db','RDict.log',
8865a891e7SLisandro Dalcin              'build.log','default.log',
8965a891e7SLisandro Dalcin              'build.log.bkp','default.log.bkp']
90105e34d4SBarry Smith    for delfile in delfiles:
9165a891e7SLisandro Dalcin        try:
9265a891e7SLisandro Dalcin            if (os.path.exists(delfile) and
9365a891e7SLisandro Dalcin                os.stat(delfile).st_uid==0):
94105e34d4SBarry Smith                os.remove(delfile)
9565a891e7SLisandro Dalcin        except:
9665a891e7SLisandro Dalcin            pass
97105e34d4SBarry Smith
9865a891e7SLisandro Dalcinclass cmd_build(_build):
9965a891e7SLisandro Dalcin
10065a891e7SLisandro Dalcin    def finalize_options(self):
10165a891e7SLisandro Dalcin        if self.build_base is None:
10265a891e7SLisandro Dalcin            self.build_base= 'build'
10365a891e7SLisandro Dalcin        self.build_base = os.path.join(
10465a891e7SLisandro Dalcin            os.environ['PETSC_ARCH'], self.build_base)
10565a891e7SLisandro Dalcin        _build.finalize_options(self)
10665a891e7SLisandro Dalcin
10765a891e7SLisandro Dalcin    def run(self):
10865a891e7SLisandro Dalcin        _build.run(self)
10965a891e7SLisandro Dalcin        wdir = os.getcwd()
11065a891e7SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
11165a891e7SLisandro Dalcin        try:
11265a891e7SLisandro Dalcin            os.chdir(pdir)
11365a891e7SLisandro Dalcin            config(self.dry_run)
11465a891e7SLisandro Dalcin            build(self.dry_run)
11565a891e7SLisandro Dalcin        finally:
11665a891e7SLisandro Dalcin            os.chdir(wdir)
11765a891e7SLisandro Dalcin
11865a891e7SLisandro Dalcinclass cmd_install(_install):
11965a891e7SLisandro Dalcin
12065a891e7SLisandro Dalcin    def run(self):
12165a891e7SLisandro Dalcin        _install.run(self)
12265a891e7SLisandro Dalcin        root_dir = self.install_platlib
12365a891e7SLisandro Dalcin        dest_dir = os.path.join(root_dir, 'petsc')
12465a891e7SLisandro Dalcin        bdist_base = self.get_finalized_command('bdist').bdist_base
12565a891e7SLisandro Dalcin        if dest_dir.startswith(bdist_base):
12665a891e7SLisandro Dalcin            prefix = dest_dir[len(bdist_base)+1:]
12765a891e7SLisandro Dalcin            prefix = prefix[prefix.index(os.path.sep):]
12865a891e7SLisandro Dalcin        else:
12965a891e7SLisandro Dalcin            prefix = dest_dir
13065a891e7SLisandro Dalcin        dest_dir = os.path.abspath(dest_dir)
13165a891e7SLisandro Dalcin        prefix = os.path.abspath(prefix)
13265a891e7SLisandro Dalcin        wdir = os.getcwd()
13365a891e7SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
13465a891e7SLisandro Dalcin        try:
13565a891e7SLisandro Dalcin            os.chdir(pdir)
13665a891e7SLisandro Dalcin            install(dest_dir, prefix, self.dry_run)
13765a891e7SLisandro Dalcin        finally:
13865a891e7SLisandro Dalcin            os.chdir(wdir)
13965a891e7SLisandro Dalcin
14065a891e7SLisandro Dalcindef version():
141*f6b9c231SLisandro Dalcin    return '3.2.dev1'
14265a891e7SLisandro Dalcindef tarball():
143*f6b9c231SLisandro Dalcin    return None # XXX remove this line
144*f6b9c231SLisandro Dalcin    return ('http://ftp.mcs.anl.gov/pub/petsc/<XXX>/' # XXX fix this line
145*f6b9c231SLisandro Dalcin            'petsc-lite-%s.tar.gz' % version() )
14665a891e7SLisandro Dalcin
14765a891e7SLisandro Dalcindescription = __doc__.split('\n')[1:-1]; del description[1:3]
14865a891e7SLisandro Dalcinclassifiers = """
14965a891e7SLisandro DalcinLicense :: Public Domain
15065a891e7SLisandro DalcinOperating System :: POSIX
15165a891e7SLisandro DalcinIntended Audience :: Developers
15265a891e7SLisandro DalcinIntended Audience :: Science/Research
15365a891e7SLisandro DalcinProgramming Language :: C
15465a891e7SLisandro DalcinProgramming Language :: C++
15565a891e7SLisandro DalcinProgramming Language :: Fortran
15665a891e7SLisandro DalcinProgramming Language :: Python
15765a891e7SLisandro DalcinTopic :: Scientific/Engineering
15865a891e7SLisandro DalcinTopic :: Software Development :: Libraries
15965a891e7SLisandro Dalcin"""
16065a891e7SLisandro Dalcin
16165a891e7SLisandro Dalcinbootstrap()
16265a891e7SLisandro Dalcinsetup(name='petsc',
16365a891e7SLisandro Dalcin      version=version(),
16465a891e7SLisandro Dalcin      description=description.pop(0),
16565a891e7SLisandro Dalcin      long_description='\n'.join(description),
16665a891e7SLisandro Dalcin      classifiers= classifiers.split('\n')[1:-1],
16765a891e7SLisandro Dalcin      keywords = ['PETSc', 'MPI'],
16865a891e7SLisandro Dalcin      platforms=['POSIX'],
16965a891e7SLisandro Dalcin      license='PETSc',
17065a891e7SLisandro Dalcin
17165a891e7SLisandro Dalcin      provides=['petsc'],
17265a891e7SLisandro Dalcin      requires=[],
17365a891e7SLisandro Dalcin
17465a891e7SLisandro Dalcin      url='http://www.mcs.anl.gov/petsc/',
17565a891e7SLisandro Dalcin      download_url=tarball(),
17665a891e7SLisandro Dalcin
17765a891e7SLisandro Dalcin      author='PETSc Team',
17865a891e7SLisandro Dalcin      author_email='petsc-users@mcs.anl.gov',
17965a891e7SLisandro Dalcin      maintainer='Lisandro Dalcin',
18065a891e7SLisandro Dalcin      maintainer_email='dalcinl@gmail.com',
18165a891e7SLisandro Dalcin
18265a891e7SLisandro Dalcin      packages = ['petsc'],
18365a891e7SLisandro Dalcin      package_dir = {'petsc': os.environ['PETSC_ARCH']},
18465a891e7SLisandro Dalcin      cmdclass={
18565a891e7SLisandro Dalcin        'build': cmd_build,
18665a891e7SLisandro Dalcin        'install': cmd_install,
18765a891e7SLisandro Dalcin        },
18865a891e7SLisandro Dalcin      )
189