xref: /petsc/setup.py (revision 65a891e713130eb242d09a225ca12d6830e292b3)
1e68ebbecSBarry Smith#!/usr/bin/env python
2e68ebbecSBarry Smith
3e68ebbecSBarry Smith"""
4*65a891e7SLisandro DalcinPETSc: Portable, Extensible Toolkit for Scientific Computation
5*65a891e7SLisandro Dalcin==============================================================
6*65a891e7SLisandro Dalcin
7*65a891e7SLisandro DalcinThe Portable, Extensible Toolkit for Scientific Computation (PETSc),
8*65a891e7SLisandro Dalcinis a suite of data structures and routines for the scalable (parallel)
9*65a891e7SLisandro Dalcinsolution of scientific applications modeled by partial differential
10*65a891e7SLisandro Dalcinequations. It employs the Message Passing Interface (MPI) standard for
11*65a891e7SLisandro Dalcinall message-passing communication.
12e68ebbecSBarry Smith"""
13e68ebbecSBarry Smith
14*65a891e7SLisandro Dalcinimport sys, os
15*65a891e7SLisandro Dalcinfrom distutils.core import setup
16*65a891e7SLisandro Dalcinfrom distutils.util import get_platform
17*65a891e7SLisandro Dalcinfrom distutils.command.build import build as _build
18*65a891e7SLisandro Dalcinif 'setuptools' in sys.modules:
19*65a891e7SLisandro Dalcin    from setuptools.command.install import install as _install
20*65a891e7SLisandro Dalcinelse:
21*65a891e7SLisandro Dalcin    from distutils.command.install import install as _install
22*65a891e7SLisandro Dalcinfrom distutils import log
2312c1d45bSMatthew G Knepley
24*65a891e7SLisandro Dalcininit_py = """\
25*65a891e7SLisandro Dalcin# Author:  Lisandro Dalcin
26*65a891e7SLisandro Dalcin# Contact: dalcinl@gmail.com
27*65a891e7SLisandro Dalcin
28*65a891e7SLisandro Dalcindef get_petsc_dir():
29*65a891e7SLisandro Dalcin    import os
30*65a891e7SLisandro Dalcin    return os.path.dirname(__file__)
31*65a891e7SLisandro Dalcin
32*65a891e7SLisandro Dalcindef get_petsc_arch():
33*65a891e7SLisandro Dalcin    return ''
34*65a891e7SLisandro Dalcin"""
35*65a891e7SLisandro Dalcin
36*65a891e7SLisandro Dalcindef bootstrap():
37*65a891e7SLisandro Dalcin    PETSC_DIR  = os.path.abspath(os.getcwd())
38*65a891e7SLisandro Dalcin    PETSC_ARCH = get_platform() + '-python'
39*65a891e7SLisandro Dalcin    os.environ['PETSC_DIR']  = PETSC_DIR
40*65a891e7SLisandro Dalcin    os.environ['PETSC_ARCH'] = PETSC_ARCH
41*65a891e7SLisandro Dalcin    sys.path.insert(0, os.path.join(PETSC_DIR, 'config'))
42*65a891e7SLisandro Dalcin    try:
43*65a891e7SLisandro Dalcin        if not os.path.exists(PETSC_ARCH):
44*65a891e7SLisandro Dalcin            os.mkdir(PETSC_ARCH)
45*65a891e7SLisandro Dalcin        pkgfile = os.path.join(PETSC_ARCH, '__init__.py')
46*65a891e7SLisandro Dalcin        if not os.path.exists(pkgfile):
47*65a891e7SLisandro Dalcin            open(pkgfile, 'wt').write(init_py)
48*65a891e7SLisandro Dalcin    except:
49*65a891e7SLisandro Dalcin        pass
50*65a891e7SLisandro Dalcin
51*65a891e7SLisandro Dalcindef config(dry_run=False):
52*65a891e7SLisandro Dalcin    log.info('PETSc: configure')
53*65a891e7SLisandro Dalcin    if dry_run: return
54*65a891e7SLisandro Dalcin    options = [
55*65a891e7SLisandro Dalcin        'PETSC_ARCH='+os.environ['PETSC_ARCH'],
56*65a891e7SLisandro Dalcin        '--with-shared-libraries',
57*65a891e7SLisandro Dalcin        '--with-fc=0',
58*65a891e7SLisandro Dalcin        '--with-mpi=0',
59*65a891e7SLisandro Dalcin        ]
60e68ebbecSBarry Smith    import configure
61*65a891e7SLisandro Dalcin    configure.petsc_configure(options)
62e68ebbecSBarry Smith    import logger
63e68ebbecSBarry Smith    logger.Logger.defaultLog = None
6412c1d45bSMatthew G Knepley
65*65a891e7SLisandro Dalcindef build(dry_run=False):
66*65a891e7SLisandro Dalcin    log.info('PETSc: build')
67*65a891e7SLisandro 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
73*65a891e7SLisandro Dalcindef install(dest_dir, prefix=None, dry_run=False):
74*65a891e7SLisandro Dalcin    log.info('PETSc: install')
75*65a891e7SLisandro Dalcin    if dry_run: return
76*65a891e7SLisandro Dalcin    if prefix is None:
77*65a891e7SLisandro Dalcin        prefix = dest_dir
78*65a891e7SLisandro Dalcin    options = [
79*65a891e7SLisandro Dalcin        '--destDir=' + dest_dir,
80*65a891e7SLisandro Dalcin        '--prefix='  + prefix
81*65a891e7SLisandro Dalcin        ]
82105e34d4SBarry Smith    import install
83*65a891e7SLisandro Dalcin    install.Installer(options).run()
84*65a891e7SLisandro Dalcin    import logger
85*65a891e7SLisandro Dalcin    logger.Logger.defaultLog = None
86*65a891e7SLisandro Dalcin    # temporary hack - delete log files created by BuildSystem
87*65a891e7SLisandro Dalcin    delfiles=['RDict.db','RDict.log',
88*65a891e7SLisandro Dalcin              'build.log','default.log',
89*65a891e7SLisandro Dalcin              'build.log.bkp','default.log.bkp']
90105e34d4SBarry Smith    for delfile in delfiles:
91*65a891e7SLisandro Dalcin        try:
92*65a891e7SLisandro Dalcin            if (os.path.exists(delfile) and
93*65a891e7SLisandro Dalcin                os.stat(delfile).st_uid==0):
94105e34d4SBarry Smith                os.remove(delfile)
95*65a891e7SLisandro Dalcin        except:
96*65a891e7SLisandro Dalcin            pass
97105e34d4SBarry Smith
98*65a891e7SLisandro Dalcinclass cmd_build(_build):
99*65a891e7SLisandro Dalcin
100*65a891e7SLisandro Dalcin    def finalize_options(self):
101*65a891e7SLisandro Dalcin        if self.build_base is None:
102*65a891e7SLisandro Dalcin            self.build_base= 'build'
103*65a891e7SLisandro Dalcin        self.build_base = os.path.join(
104*65a891e7SLisandro Dalcin            os.environ['PETSC_ARCH'], self.build_base)
105*65a891e7SLisandro Dalcin        _build.finalize_options(self)
106*65a891e7SLisandro Dalcin
107*65a891e7SLisandro Dalcin    def run(self):
108*65a891e7SLisandro Dalcin        _build.run(self)
109*65a891e7SLisandro Dalcin        wdir = os.getcwd()
110*65a891e7SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
111*65a891e7SLisandro Dalcin        try:
112*65a891e7SLisandro Dalcin            os.chdir(pdir)
113*65a891e7SLisandro Dalcin            config(self.dry_run)
114*65a891e7SLisandro Dalcin            build(self.dry_run)
115*65a891e7SLisandro Dalcin        finally:
116*65a891e7SLisandro Dalcin            os.chdir(wdir)
117*65a891e7SLisandro Dalcin
118*65a891e7SLisandro Dalcinclass cmd_install(_install):
119*65a891e7SLisandro Dalcin
120*65a891e7SLisandro Dalcin    def run(self):
121*65a891e7SLisandro Dalcin        _install.run(self)
122*65a891e7SLisandro Dalcin        root_dir = self.install_platlib
123*65a891e7SLisandro Dalcin        dest_dir = os.path.join(root_dir, 'petsc')
124*65a891e7SLisandro Dalcin        bdist_base = self.get_finalized_command('bdist').bdist_base
125*65a891e7SLisandro Dalcin        if dest_dir.startswith(bdist_base):
126*65a891e7SLisandro Dalcin            prefix = dest_dir[len(bdist_base)+1:]
127*65a891e7SLisandro Dalcin            prefix = prefix[prefix.index(os.path.sep):]
128*65a891e7SLisandro Dalcin        else:
129*65a891e7SLisandro Dalcin            prefix = dest_dir
130*65a891e7SLisandro Dalcin        dest_dir = os.path.abspath(dest_dir)
131*65a891e7SLisandro Dalcin        prefix = os.path.abspath(prefix)
132*65a891e7SLisandro Dalcin        wdir = os.getcwd()
133*65a891e7SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
134*65a891e7SLisandro Dalcin        try:
135*65a891e7SLisandro Dalcin            os.chdir(pdir)
136*65a891e7SLisandro Dalcin            install(dest_dir, prefix, self.dry_run)
137*65a891e7SLisandro Dalcin        finally:
138*65a891e7SLisandro Dalcin            os.chdir(wdir)
139*65a891e7SLisandro Dalcin
140*65a891e7SLisandro Dalcindef version():
141*65a891e7SLisandro Dalcin    return 'dev'
142*65a891e7SLisandro Dalcindef tarball():
143*65a891e7SLisandro Dalcin    return None
144*65a891e7SLisandro Dalcin
145*65a891e7SLisandro Dalcindescription = __doc__.split('\n')[1:-1]; del description[1:3]
146*65a891e7SLisandro Dalcinclassifiers = """
147*65a891e7SLisandro DalcinLicense :: Public Domain
148*65a891e7SLisandro DalcinOperating System :: POSIX
149*65a891e7SLisandro DalcinIntended Audience :: Developers
150*65a891e7SLisandro DalcinIntended Audience :: Science/Research
151*65a891e7SLisandro DalcinProgramming Language :: C
152*65a891e7SLisandro DalcinProgramming Language :: C++
153*65a891e7SLisandro DalcinProgramming Language :: Fortran
154*65a891e7SLisandro DalcinProgramming Language :: Python
155*65a891e7SLisandro DalcinTopic :: Scientific/Engineering
156*65a891e7SLisandro DalcinTopic :: Software Development :: Libraries
157*65a891e7SLisandro Dalcin"""
158*65a891e7SLisandro Dalcin
159*65a891e7SLisandro Dalcinbootstrap()
160*65a891e7SLisandro Dalcinsetup(name='petsc',
161*65a891e7SLisandro Dalcin      version=version(),
162*65a891e7SLisandro Dalcin      description=description.pop(0),
163*65a891e7SLisandro Dalcin      long_description='\n'.join(description),
164*65a891e7SLisandro Dalcin      classifiers= classifiers.split('\n')[1:-1],
165*65a891e7SLisandro Dalcin      keywords = ['PETSc', 'MPI'],
166*65a891e7SLisandro Dalcin      platforms=['POSIX'],
167*65a891e7SLisandro Dalcin      license='PETSc',
168*65a891e7SLisandro Dalcin
169*65a891e7SLisandro Dalcin      provides=['petsc'],
170*65a891e7SLisandro Dalcin      requires=[],
171*65a891e7SLisandro Dalcin
172*65a891e7SLisandro Dalcin      url='http://www.mcs.anl.gov/petsc/',
173*65a891e7SLisandro Dalcin      download_url=tarball(),
174*65a891e7SLisandro Dalcin
175*65a891e7SLisandro Dalcin      author='PETSc Team',
176*65a891e7SLisandro Dalcin      author_email='petsc-users@mcs.anl.gov',
177*65a891e7SLisandro Dalcin      maintainer='Lisandro Dalcin',
178*65a891e7SLisandro Dalcin      maintainer_email='dalcinl@gmail.com',
179*65a891e7SLisandro Dalcin
180*65a891e7SLisandro Dalcin      packages = ['petsc'],
181*65a891e7SLisandro Dalcin      package_dir = {'petsc': os.environ['PETSC_ARCH']},
182*65a891e7SLisandro Dalcin      cmdclass={
183*65a891e7SLisandro Dalcin        'build': cmd_build,
184*65a891e7SLisandro Dalcin        'install': cmd_install,
185*65a891e7SLisandro Dalcin        },
186*65a891e7SLisandro Dalcin      )
187