xref: /petsc/setup.py (revision 5ee53db2299ec483123346965f05fffc8e6cbc9f)
11b37a2a7SPierre Jolivet#!/usr/bin/env python3
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.
12922ada92SLisandro Dalcin
1393b33a5aSLisandro Dalcin.. note::
1493b33a5aSLisandro Dalcin
15*5ee53db2SLisandro Dalcin   To install the ``PETSc`` and ``petsc4py`` packages
16*5ee53db2SLisandro Dalcin   (``mpi4py`` is optional but highly recommended) use::
1793b33a5aSLisandro Dalcin
18*5ee53db2SLisandro Dalcin     $ python -m pip install numpy mpi4py
19*5ee53db2SLisandro Dalcin     $ python -m pip install petsc petsc4py
2093b33a5aSLisandro Dalcin
21922ada92SLisandro Dalcin.. tip::
22922ada92SLisandro Dalcin
2393b33a5aSLisandro Dalcin  You can also install the in-development versions with::
24922ada92SLisandro Dalcin
25eaf87d4bSBarry Smith    $ python -m pip install Cython numpy mpi4py
269dddd249SSatish Balay    $ python -m pip install --no-deps https://gitlab.com/petsc/petsc/-/archive/main/petsc-main.tar.gz
27ca62002aSBarry Smith
28007ce00dSBarry Smith  Provide any ``PETSc`` ./configure options using the environmental variable ``PETSC_CONFIGURE_OPTIONS``.
29007ce00dSBarry Smith
30007ce00dSBarry Smith  Do not use the ``PETSc`` ``./configure`` options ``--with-cc``, ``--with-cxx``, ``--with-fc``, or ``--with-mpi-dir``.
31*5ee53db2SLisandro Dalcin  To set the MPI compilers use the environmental variables ``MPICC``, ``MPICXX``, ``MPIFORT``.
32*5ee53db2SLisandro Dalcin  If ``mpi4py`` is installed the compilers will be obtained from that installation and ``MPICC``, ``MPICXX``, ``MPIFORT`` will be ignored.
33007ce00dSBarry Smith
34e68ebbecSBarry Smith"""
35e68ebbecSBarry Smith
36*5ee53db2SLisandro Dalcinimport re
37*5ee53db2SLisandro Dalcinimport os
38*5ee53db2SLisandro Dalcinimport sys
39*5ee53db2SLisandro Dalcinimport shlex
40*5ee53db2SLisandro Dalcinimport shutil
4196fd8cd7SLisandro Dalcinfrom setuptools import setup
42*5ee53db2SLisandro Dalcinfrom wheel.bdist_wheel import bdist_wheel as _bdist_wheel
4396fd8cd7SLisandro Dalcinfrom setuptools.command.install import install as _install
4465a891e7SLisandro Dalcinfrom distutils import log
4512c1d45bSMatthew G Knepley
4665a891e7SLisandro Dalcininit_py = """\
47a32381aeSLisandro Dalcin# Author:  PETSc Team
48a597b971SLisandro Dalcin# Contact: petsc-maint@mcs.anl.gov
4965a891e7SLisandro Dalcin
5065a891e7SLisandro Dalcindef get_petsc_dir():
5165a891e7SLisandro Dalcin    import os
5265a891e7SLisandro Dalcin    return os.path.dirname(__file__)
5365a891e7SLisandro Dalcin
54*5ee53db2SLisandro Dalcin
55a32381aeSLisandro Dalcindef get_config():
56a32381aeSLisandro Dalcin    conf = {}
579fb7a39fSLisandro Dalcin    conf['PETSC_DIR'] = get_petsc_dir()
58a32381aeSLisandro Dalcin    return conf
5965a891e7SLisandro Dalcin"""
6065a891e7SLisandro Dalcin
61*5ee53db2SLisandro Dalcinmain_py = """\
62*5ee53db2SLisandro Dalcin# Author:  PETSc Team
63*5ee53db2SLisandro Dalcin# Contact: petsc-maint@mcs.anl.gov
64*5ee53db2SLisandro Dalcin
65*5ee53db2SLisandro Dalcinif __name__ == "__main__":
66*5ee53db2SLisandro Dalcin    import sys
67*5ee53db2SLisandro Dalcin    if "--prefix" in sys.argv:
68*5ee53db2SLisandro Dalcin        from . import get_petsc_dir
69*5ee53db2SLisandro Dalcin        print(get_petsc_dir())
70*5ee53db2SLisandro Dalcin        del get_petsc_dir
71*5ee53db2SLisandro Dalcin    del sys
72*5ee53db2SLisandro Dalcin"""
73*5ee53db2SLisandro Dalcin
7459e0f383SLisandro Dalcinmetadata = {
7559e0f383SLisandro Dalcin    'provides' : ['petsc'],
7696fd8cd7SLisandro Dalcin    'zip_safe' : False,
7759e0f383SLisandro Dalcin}
7859e0f383SLisandro Dalcin
7915075023SLisandro DalcinCONFIGURE_OPTIONS = []
8015075023SLisandro Dalcin
81*5ee53db2SLisandro Dalcin
8265a891e7SLisandro Dalcindef bootstrap():
83cb58ab5bSLisandro Dalcin    # Set PETSC_DIR and PETSC_ARCH
8465a891e7SLisandro Dalcin    PETSC_DIR  = os.path.abspath(os.getcwd())
85*5ee53db2SLisandro Dalcin    PETSC_ARCH = 'arch-python'
8665a891e7SLisandro Dalcin    os.environ['PETSC_DIR']  = PETSC_DIR
8765a891e7SLisandro Dalcin    os.environ['PETSC_ARCH'] = PETSC_ARCH
8865a891e7SLisandro Dalcin    sys.path.insert(0, os.path.join(PETSC_DIR, 'config'))
89af0996ceSBarry Smith    sys.path.insert(0, os.path.join(PETSC_DIR, 'lib','petsc','conf'))
90*5ee53db2SLisandro Dalcin
91*5ee53db2SLisandro Dalcin    # Generate package __init__.py and __main__.py files
929fb7a39fSLisandro Dalcin    pkgdir = os.path.join('config', 'pypi')
93*5ee53db2SLisandro Dalcin    os.makedirs(pkgdir, exist_ok=True)
94*5ee53db2SLisandro Dalcin    for pyfile, contents in (
95*5ee53db2SLisandro Dalcin        ('__init__.py', init_py),
96*5ee53db2SLisandro Dalcin        ('__main__.py', main_py),
97*5ee53db2SLisandro Dalcin    ):
98*5ee53db2SLisandro Dalcin        with open(os.path.join(pkgdir, pyfile), 'w') as fh:
99*5ee53db2SLisandro Dalcin            fh.write(contents)
100*5ee53db2SLisandro Dalcin
10115075023SLisandro Dalcin    # Configure options
10215075023SLisandro Dalcin    options = os.environ.get('PETSC_CONFIGURE_OPTIONS', '')
103*5ee53db2SLisandro Dalcin    CONFIGURE_OPTIONS.extend(shlex.split(options))
104007ce00dSBarry Smith    for i in CONFIGURE_OPTIONS:
1055f9afd5aSLawrence Mitchell        if i.startswith('--with-mpi-dir='):
106*5ee53db2SLisandro Dalcin            raise RuntimeError("Do not use --with-mpi-dir, use the environmental variables MPICC, MPICXX, MPIFORT")
1075f9afd5aSLawrence Mitchell        if i.startswith('--with-cc='):
108007ce00dSBarry Smith            raise RuntimeError("Do not use --with-cc, use the environmental variable MPICC")
1095f9afd5aSLawrence Mitchell        if i.startswith('--with-cxx=') and i != "--with-cxx=0":
110007ce00dSBarry Smith            raise RuntimeError("Do not use --with-cxx, use the environmental variable MPICXX")
1115f9afd5aSLawrence Mitchell        if i.startswith('--with-fc=') and i != "--with-fc=0":
112*5ee53db2SLisandro Dalcin            raise RuntimeError("Do not use --with-fc, use the environmental variable MPIFORT")
113007ce00dSBarry Smith
11415075023SLisandro Dalcin    if '--with-mpi=0' not in CONFIGURE_OPTIONS:
11559e0f383SLisandro Dalcin        # Simple-minded lookup for MPI and mpi4py
11659e0f383SLisandro Dalcin        mpi4py = mpicc = None
11759e0f383SLisandro Dalcin        try:
11859e0f383SLisandro Dalcin            import mpi4py
11959e0f383SLisandro Dalcin            conf = mpi4py.get_config()
12059e0f383SLisandro Dalcin            mpicc = conf.get('mpicc')
12159e0f383SLisandro Dalcin        except ImportError: # mpi4py is not installed
122922ada92SLisandro Dalcin            mpi4py = None
12315075023SLisandro Dalcin            mpicc = (os.environ.get('MPICC') or
124*5ee53db2SLisandro Dalcin                     shutil.which('mpicc'))
1251b095333SLisandro Dalcin        except AttributeError: # mpi4py is too old
12659e0f383SLisandro Dalcin            pass
127922ada92SLisandro Dalcin        if not mpi4py and mpicc:
128922ada92SLisandro Dalcin            metadata['install_requires'] = ['mpi4py>=1.2.2']
12965a891e7SLisandro Dalcin
130*5ee53db2SLisandro Dalcin
13196fd8cd7SLisandro Dalcindef config(prefix, dry_run=False):
13265a891e7SLisandro Dalcin    log.info('PETSc: configure')
13365a891e7SLisandro Dalcin    options = [
13496fd8cd7SLisandro Dalcin        '--prefix=' + prefix,
13565a891e7SLisandro Dalcin        'PETSC_ARCH='+os.environ['PETSC_ARCH'],
136cb58ab5bSLisandro Dalcin        '--with-shared-libraries=1',
13711035aebSLisandro Dalcin        '--with-debugging=0',
138922ada92SLisandro Dalcin        '--with-c2html=0', # not needed
13965a891e7SLisandro Dalcin        ]
14015075023SLisandro Dalcin    if '--with-fc=0' in CONFIGURE_OPTIONS:
14115075023SLisandro Dalcin        options.append('--with-sowing=0')
14215075023SLisandro Dalcin    if '--with-mpi=0' not in CONFIGURE_OPTIONS:
14359e0f383SLisandro Dalcin        try:
14459e0f383SLisandro Dalcin            import mpi4py
14559e0f383SLisandro Dalcin            conf = mpi4py.get_config()
14659e0f383SLisandro Dalcin            mpicc  = conf.get('mpicc')
147cb58ab5bSLisandro Dalcin            mpicxx = conf.get('mpicxx')
148*5ee53db2SLisandro Dalcin            mpifort = conf.get('mpifort') or conf.get('mpif90')
14959e0f383SLisandro Dalcin        except (ImportError, AttributeError):
150*5ee53db2SLisandro Dalcin            mpicc  = os.environ.get('MPICC') or shutil.which('mpicc')
151*5ee53db2SLisandro Dalcin            mpicxx = os.environ.get('MPICXX') or shutil.which('mpicxx')
152*5ee53db2SLisandro Dalcin            mpifort = os.environ.get('MPIFORT') or os.environ.get('MPIF90')
153*5ee53db2SLisandro Dalcin            mpifort = mpifort or shutil.which('mpifort')
154*5ee53db2SLisandro Dalcin            mpifort = mpifort or shutil.which('mpif90')
15559e0f383SLisandro Dalcin        if mpicc:
15659e0f383SLisandro Dalcin            options.append('--with-cc='+mpicc)
15715075023SLisandro Dalcin            if '--with-cxx=0' not in CONFIGURE_OPTIONS:
158cb58ab5bSLisandro Dalcin                if mpicxx:
159cb58ab5bSLisandro Dalcin                    options.append('--with-cxx='+mpicxx)
16093b33a5aSLisandro Dalcin                else:
16193b33a5aSLisandro Dalcin                    options.append('--with-cxx=0')
16215075023SLisandro Dalcin            if '--with-fc=0' not in CONFIGURE_OPTIONS:
163*5ee53db2SLisandro Dalcin                if mpifort:
164*5ee53db2SLisandro Dalcin                    options.append('--with-fc='+mpifort)
16559e0f383SLisandro Dalcin                else:
16693b33a5aSLisandro Dalcin                    options.append('--with-fc=0')
16793b33a5aSLisandro Dalcin                    options.append('--with-sowing=0')
16893b33a5aSLisandro Dalcin        else:
16959e0f383SLisandro Dalcin            options.append('--with-mpi=0')
17015075023SLisandro Dalcin    options.extend(CONFIGURE_OPTIONS)
17115075023SLisandro Dalcin    #
172cb58ab5bSLisandro Dalcin    log.info('configure options:')
173cb58ab5bSLisandro Dalcin    for opt in options:
174cb58ab5bSLisandro Dalcin        log.info(' '*4 + opt)
17559e0f383SLisandro Dalcin    # Run PETSc configure
176*5ee53db2SLisandro Dalcin    if dry_run:
177*5ee53db2SLisandro Dalcin        return
1780a0dac6aSLisandro Dalcin    use_config_py = False
17996fd8cd7SLisandro Dalcin    if use_config_py:
180e68ebbecSBarry Smith        import configure
18165a891e7SLisandro Dalcin        configure.petsc_configure(options)
182e68ebbecSBarry Smith        import logger
183e68ebbecSBarry Smith        logger.Logger.defaultLog = None
18496fd8cd7SLisandro Dalcin    else:
18584a6b807SJose E. Roman        python = sys.executable
1860a0dac6aSLisandro Dalcin        command = [python, './configure'] + options
18796fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
188*5ee53db2SLisandro Dalcin        if status != 0:
189*5ee53db2SLisandro Dalcin            raise RuntimeError(status)
190*5ee53db2SLisandro Dalcin    # Fix PETSc configuration
191*5ee53db2SLisandro Dalcin    if os.environ.get('PEP517_BUILD_BACKEND'):
192*5ee53db2SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
193*5ee53db2SLisandro Dalcin        parch = os.environ['PETSC_ARCH']
194*5ee53db2SLisandro Dalcin        include = os.path.join(pdir, parch, 'include')
195*5ee53db2SLisandro Dalcin        for filename in (
196*5ee53db2SLisandro Dalcin            'petscconf.h',
197*5ee53db2SLisandro Dalcin            'petscconfiginfo.h',
198*5ee53db2SLisandro Dalcin            'petscmachineinfo.h',
199*5ee53db2SLisandro Dalcin        ):
200*5ee53db2SLisandro Dalcin            filename = os.path.join(include, filename)
201*5ee53db2SLisandro Dalcin            with open(filename, 'r') as old_fh:
202*5ee53db2SLisandro Dalcin                contents = old_fh.read()
203*5ee53db2SLisandro Dalcin            contents = contents.replace(prefix, '${PETSC_DIR}')
204*5ee53db2SLisandro Dalcin            contents = re.sub(
205*5ee53db2SLisandro Dalcin                r'^(#define PETSC_PYTHON_EXE) "(.*)"$',
206*5ee53db2SLisandro Dalcin                r'\1 "python%d"' % sys.version_info[0],
207*5ee53db2SLisandro Dalcin                contents, flags=re.MULTILINE,
208*5ee53db2SLisandro Dalcin            )
209*5ee53db2SLisandro Dalcin            with open(filename, 'w') as new_fh:
210*5ee53db2SLisandro Dalcin                new_fh.write(contents)
211*5ee53db2SLisandro Dalcin
21212c1d45bSMatthew G Knepley
21365a891e7SLisandro Dalcindef build(dry_run=False):
21465a891e7SLisandro Dalcin    log.info('PETSc: build')
215367c215cSLisandro Dalcin    # Run PETSc build
216*5ee53db2SLisandro Dalcin    if dry_run:
217*5ee53db2SLisandro Dalcin        return
218367c215cSLisandro Dalcin    use_builder_py = False
219367c215cSLisandro Dalcin    if use_builder_py:
220e68ebbecSBarry Smith        import builder
221e68ebbecSBarry Smith        builder.PETScMaker().run()
222105e34d4SBarry Smith        import logger
223105e34d4SBarry Smith        logger.Logger.defaultLog = None
224367c215cSLisandro Dalcin    else:
225*5ee53db2SLisandro Dalcin        make = shutil.which('make')
22696fd8cd7SLisandro Dalcin        command = [make, 'all']
22796fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
228*5ee53db2SLisandro Dalcin        if status != 0:
229*5ee53db2SLisandro Dalcin            raise RuntimeError(status)
230*5ee53db2SLisandro Dalcin
231e68ebbecSBarry Smith
2328c408988SSatish Balaydef install(dry_run=False):
23365a891e7SLisandro Dalcin    log.info('PETSc: install')
23459e0f383SLisandro Dalcin    # Run PETSc installer
235*5ee53db2SLisandro Dalcin    if dry_run:
236*5ee53db2SLisandro Dalcin        return
2370a0dac6aSLisandro Dalcin    use_install_py = False
238367c215cSLisandro Dalcin    if use_install_py:
239105e34d4SBarry Smith        import install
2408c408988SSatish Balay        install.Installer().run()
24165a891e7SLisandro Dalcin        import logger
24265a891e7SLisandro Dalcin        logger.Logger.defaultLog = None
243367c215cSLisandro Dalcin    else:
244*5ee53db2SLisandro Dalcin        make = shutil.which('make')
2458c408988SSatish Balay        command = [make, 'install']
24696fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
247*5ee53db2SLisandro Dalcin        if status != 0:
248*5ee53db2SLisandro Dalcin            raise RuntimeError(status)
249*5ee53db2SLisandro Dalcin
25099468c80SLisandro Dalcin
25196fd8cd7SLisandro Dalcinclass context(object):
25299468c80SLisandro Dalcin    def __init__(self):
25399468c80SLisandro Dalcin        self.sys_argv = sys.argv[:]
25499468c80SLisandro Dalcin        self.wdir = os.getcwd()
25599468c80SLisandro Dalcin    def enter(self):
25699468c80SLisandro Dalcin        del sys.argv[1:]
25799468c80SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
25899468c80SLisandro Dalcin        os.chdir(pdir)
25999468c80SLisandro Dalcin        return self
26099468c80SLisandro Dalcin    def exit(self):
26199468c80SLisandro Dalcin        sys.argv[:] = self.sys_argv
26299468c80SLisandro Dalcin        os.chdir(self.wdir)
263105e34d4SBarry Smith
264*5ee53db2SLisandro Dalcin
26565a891e7SLisandro Dalcinclass cmd_install(_install):
26665a891e7SLisandro Dalcin
26741716173SLisandro Dalcin    def initialize_options(self):
26841716173SLisandro Dalcin        _install.initialize_options(self)
26941716173SLisandro Dalcin
27089031a3cSLisandro Dalcin    def finalize_options(self):
27189031a3cSLisandro Dalcin        _install.finalize_options(self)
27289031a3cSLisandro Dalcin        self.install_lib = self.install_platlib
27389031a3cSLisandro Dalcin        self.install_libbase = self.install_lib
274f46a955bSLisandro Dalcin        self.old_and_unmanageable = True
27589031a3cSLisandro Dalcin
27665a891e7SLisandro Dalcin    def run(self):
27789031a3cSLisandro Dalcin        root_dir = os.path.abspath(self.install_lib)
2788c408988SSatish Balay        prefix = os.path.join(root_dir, 'petsc')
27999468c80SLisandro Dalcin        #
28099468c80SLisandro Dalcin        ctx = context().enter()
28165a891e7SLisandro Dalcin        try:
28296fd8cd7SLisandro Dalcin            config(prefix, self.dry_run)
28396fd8cd7SLisandro Dalcin            build(self.dry_run)
2848c408988SSatish Balay            install(self.dry_run)
28565a891e7SLisandro Dalcin        finally:
28699468c80SLisandro Dalcin            ctx.exit()
28796fd8cd7SLisandro Dalcin        #
28896fd8cd7SLisandro Dalcin        self.outputs = []
2898c408988SSatish Balay        for dirpath, _, filenames in os.walk(prefix):
29096fd8cd7SLisandro Dalcin            for fn in filenames:
29196fd8cd7SLisandro Dalcin                self.outputs.append(os.path.join(dirpath, fn))
29296fd8cd7SLisandro Dalcin        #
29396fd8cd7SLisandro Dalcin        _install.run(self)
29465a891e7SLisandro Dalcin
29596fd8cd7SLisandro Dalcin    def get_outputs(self):
29696fd8cd7SLisandro Dalcin        outputs = getattr(self, 'outputs', [])
29796fd8cd7SLisandro Dalcin        outputs += _install.get_outputs(self)
29896fd8cd7SLisandro Dalcin        return outputs
299a32381aeSLisandro Dalcin
300*5ee53db2SLisandro Dalcin
301*5ee53db2SLisandro Dalcinclass cmd_bdist_wheel(_bdist_wheel):
302*5ee53db2SLisandro Dalcin
303*5ee53db2SLisandro Dalcin    def finalize_options(self):
304*5ee53db2SLisandro Dalcin        super().finalize_options()
305*5ee53db2SLisandro Dalcin        self.root_is_pure = False
306*5ee53db2SLisandro Dalcin        self.build_number = None
307*5ee53db2SLisandro Dalcin
308*5ee53db2SLisandro Dalcin    def get_tag(self):
309*5ee53db2SLisandro Dalcin        plat_tag = super().get_tag()[-1]
310*5ee53db2SLisandro Dalcin        return (self.python_tag, "none", plat_tag)
311*5ee53db2SLisandro Dalcin
312*5ee53db2SLisandro Dalcin
31365a891e7SLisandro Dalcindef version():
3147d04d9c9SLisandro Dalcin    version_re = {
3157d04d9c9SLisandro Dalcin        'major'  : re.compile(r"#define\s+PETSC_VERSION_MAJOR\s+(\d+)"),
3167d04d9c9SLisandro Dalcin        'minor'  : re.compile(r"#define\s+PETSC_VERSION_MINOR\s+(\d+)"),
3177d04d9c9SLisandro Dalcin        'micro'  : re.compile(r"#define\s+PETSC_VERSION_SUBMINOR\s+(\d+)"),
31815261b6dSSatish Balay        'release': re.compile(r"#define\s+PETSC_VERSION_RELEASE\s+([-]*\d+)"),
3197d04d9c9SLisandro Dalcin        }
3207d04d9c9SLisandro Dalcin    petscversion_h = os.path.join('include','petscversion.h')
32196fd8cd7SLisandro Dalcin    data = open(petscversion_h, 'r').read()
3227d04d9c9SLisandro Dalcin    major = int(version_re['major'].search(data).groups()[0])
3237d04d9c9SLisandro Dalcin    minor = int(version_re['minor'].search(data).groups()[0])
3247d04d9c9SLisandro Dalcin    micro = int(version_re['micro'].search(data).groups()[0])
3257d04d9c9SLisandro Dalcin    release = int(version_re['release'].search(data).groups()[0])
326f46a955bSLisandro Dalcin    if release:
3270a0dac6aSLisandro Dalcin        v = "%d.%d.%d" % (major, minor, micro)
3287d04d9c9SLisandro Dalcin    else:
3290a0dac6aSLisandro Dalcin        v = "%d.%d.0.dev%d" % (major, minor+1, 0)
3307d04d9c9SLisandro Dalcin    return v
33159e0f383SLisandro Dalcin
332*5ee53db2SLisandro Dalcin
33365a891e7SLisandro Dalcindef tarball():
33450f36069SLisandro Dalcin    VERSION = version()
335*5ee53db2SLisandro Dalcin    if '.dev' in VERSION:
336*5ee53db2SLisandro Dalcin        return None
337ca0d62ffSSatish Balay    return ('https://web.cels.anl.gov/projects/petsc/download/release-snapshots/'
338a8af48b3SSatish Balay            'petsc-%s.tar.gz#egg=petsc-%s' % (VERSION, VERSION))
33965a891e7SLisandro Dalcin
340*5ee53db2SLisandro Dalcin
341*5ee53db2SLisandro Dalcindescription = __doc__.split('\n')[1:-1]
342*5ee53db2SLisandro Dalcindel description[1:3]
343*5ee53db2SLisandro Dalcin
34465a891e7SLisandro Dalcinclassifiers = """
34596fd8cd7SLisandro DalcinDevelopment Status :: 5 - Production/Stable
34665a891e7SLisandro DalcinIntended Audience :: Developers
34765a891e7SLisandro DalcinIntended Audience :: Science/Research
34896fd8cd7SLisandro DalcinLicense :: OSI Approved :: BSD License
34996fd8cd7SLisandro DalcinOperating System :: POSIX
35065a891e7SLisandro DalcinProgramming Language :: C
35165a891e7SLisandro DalcinProgramming Language :: C++
35265a891e7SLisandro DalcinProgramming Language :: Fortran
35365a891e7SLisandro DalcinProgramming Language :: Python
35465a891e7SLisandro DalcinTopic :: Scientific/Engineering
35565a891e7SLisandro DalcinTopic :: Software Development :: Libraries
35665a891e7SLisandro Dalcin"""
35765a891e7SLisandro Dalcin
35865a891e7SLisandro Dalcinbootstrap()
359*5ee53db2SLisandro Dalcinsetup(
360*5ee53db2SLisandro Dalcin    name='petsc',
36165a891e7SLisandro Dalcin    version=version(),
36265a891e7SLisandro Dalcin    description=description.pop(0),
36365a891e7SLisandro Dalcin    long_description='\n'.join(description),
364*5ee53db2SLisandro Dalcin    long_description_content_type='text/x-rst',
36565a891e7SLisandro Dalcin    classifiers=classifiers.split('\n')[1:-1],
36665a891e7SLisandro Dalcin    keywords = ['PETSc', 'MPI'],
36765a891e7SLisandro Dalcin    platforms=['POSIX'],
368*5ee53db2SLisandro Dalcin    license='BSD-2-Clause',
36965a891e7SLisandro Dalcin
370a17b96a8SKyle Gerard Felker    url='https://petsc.org/',
37165a891e7SLisandro Dalcin    download_url=tarball(),
37265a891e7SLisandro Dalcin
37365a891e7SLisandro Dalcin    author='PETSc Team',
37499468c80SLisandro Dalcin    author_email='petsc-maint@mcs.anl.gov',
37565a891e7SLisandro Dalcin    maintainer='Lisandro Dalcin',
37665a891e7SLisandro Dalcin    maintainer_email='dalcinl@gmail.com',
37765a891e7SLisandro Dalcin
37865a891e7SLisandro Dalcin    packages=['petsc'],
3799fb7a39fSLisandro Dalcin    package_dir= {'petsc': 'config/pypi'},
380*5ee53db2SLisandro Dalcin    cmdclass={
381*5ee53db2SLisandro Dalcin        'install': cmd_install,
382*5ee53db2SLisandro Dalcin        'bdist_wheel': cmd_bdist_wheel,
383*5ee53db2SLisandro Dalcin    },
384*5ee53db2SLisandro Dalcin    **metadata
385*5ee53db2SLisandro Dalcin)
386