xref: /petsc/setup.py (revision aab425562e7c2c7b86a9faf80f0fb20ca1581317)
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
155ee53db2SLisandro Dalcin   To install the ``PETSc`` and ``petsc4py`` packages
165ee53db2SLisandro Dalcin   (``mpi4py`` is optional but highly recommended) use::
1793b33a5aSLisandro Dalcin
185ee53db2SLisandro Dalcin     $ python -m pip install numpy mpi4py
195ee53db2SLisandro 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``.
315ee53db2SLisandro Dalcin  To set the MPI compilers use the environmental variables ``MPICC``, ``MPICXX``, ``MPIFORT``.
325ee53db2SLisandro 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
365ee53db2SLisandro Dalcinimport re
375ee53db2SLisandro Dalcinimport os
385ee53db2SLisandro Dalcinimport sys
395ee53db2SLisandro Dalcinimport shlex
405ee53db2SLisandro Dalcinimport shutil
4196fd8cd7SLisandro Dalcinfrom setuptools import setup
4296fd8cd7SLisandro Dalcinfrom setuptools.command.install import install as _install
430902bb45SLisandro Dalcintry:
440902bb45SLisandro Dalcin    from setuptools.command.bdist_wheel import bdist_wheel as _bdist_wheel
450902bb45SLisandro Dalcinexcept ImportError:
460902bb45SLisandro Dalcin    from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
4765a891e7SLisandro Dalcinfrom distutils import log
4812c1d45bSMatthew G Knepley
4965a891e7SLisandro Dalcininit_py = """\
50a32381aeSLisandro Dalcin# Author:  PETSc Team
51a597b971SLisandro Dalcin# Contact: petsc-maint@mcs.anl.gov
5265a891e7SLisandro Dalcin
5365a891e7SLisandro Dalcindef get_petsc_dir():
5465a891e7SLisandro Dalcin    import os
5565a891e7SLisandro Dalcin    return os.path.dirname(__file__)
5665a891e7SLisandro Dalcin
575ee53db2SLisandro Dalcin
58a32381aeSLisandro Dalcindef get_config():
59a32381aeSLisandro Dalcin    conf = {}
609fb7a39fSLisandro Dalcin    conf['PETSC_DIR'] = get_petsc_dir()
61a32381aeSLisandro Dalcin    return conf
6265a891e7SLisandro Dalcin"""
6365a891e7SLisandro Dalcin
645ee53db2SLisandro Dalcinmain_py = """\
655ee53db2SLisandro Dalcin# Author:  PETSc Team
665ee53db2SLisandro Dalcin# Contact: petsc-maint@mcs.anl.gov
675ee53db2SLisandro Dalcin
685ee53db2SLisandro Dalcinif __name__ == "__main__":
695ee53db2SLisandro Dalcin    import sys
705ee53db2SLisandro Dalcin    if "--prefix" in sys.argv:
715ee53db2SLisandro Dalcin        from . import get_petsc_dir
725ee53db2SLisandro Dalcin        print(get_petsc_dir())
735ee53db2SLisandro Dalcin        del get_petsc_dir
745ee53db2SLisandro Dalcin    del sys
755ee53db2SLisandro Dalcin"""
765ee53db2SLisandro Dalcin
7759e0f383SLisandro Dalcinmetadata = {
7859e0f383SLisandro Dalcin    'provides' : ['petsc'],
7996fd8cd7SLisandro Dalcin    'zip_safe' : False,
8059e0f383SLisandro Dalcin}
8159e0f383SLisandro Dalcin
8215075023SLisandro DalcinCONFIGURE_OPTIONS = []
8315075023SLisandro Dalcin
845ee53db2SLisandro Dalcin
8565a891e7SLisandro Dalcindef bootstrap():
86cb58ab5bSLisandro Dalcin    # Set PETSC_DIR and PETSC_ARCH
8765a891e7SLisandro Dalcin    PETSC_DIR  = os.path.abspath(os.getcwd())
885ee53db2SLisandro Dalcin    PETSC_ARCH = 'arch-python'
8965a891e7SLisandro Dalcin    os.environ['PETSC_DIR']  = PETSC_DIR
9065a891e7SLisandro Dalcin    os.environ['PETSC_ARCH'] = PETSC_ARCH
9165a891e7SLisandro Dalcin    sys.path.insert(0, os.path.join(PETSC_DIR, 'config'))
92af0996ceSBarry Smith    sys.path.insert(0, os.path.join(PETSC_DIR, 'lib','petsc','conf'))
935ee53db2SLisandro Dalcin
945ee53db2SLisandro Dalcin    # Generate package __init__.py and __main__.py files
959fb7a39fSLisandro Dalcin    pkgdir = os.path.join('config', 'pypi')
965ee53db2SLisandro Dalcin    os.makedirs(pkgdir, exist_ok=True)
975ee53db2SLisandro Dalcin    for pyfile, contents in (
985ee53db2SLisandro Dalcin        ('__init__.py', init_py),
995ee53db2SLisandro Dalcin        ('__main__.py', main_py),
1005ee53db2SLisandro Dalcin    ):
1015ee53db2SLisandro Dalcin        with open(os.path.join(pkgdir, pyfile), 'w') as fh:
1025ee53db2SLisandro Dalcin            fh.write(contents)
1035ee53db2SLisandro Dalcin
10415075023SLisandro Dalcin    # Configure options
10515075023SLisandro Dalcin    options = os.environ.get('PETSC_CONFIGURE_OPTIONS', '')
1065ee53db2SLisandro Dalcin    CONFIGURE_OPTIONS.extend(shlex.split(options))
107007ce00dSBarry Smith    for i in CONFIGURE_OPTIONS:
1085f9afd5aSLawrence Mitchell        if i.startswith('--with-mpi-dir='):
1095ee53db2SLisandro Dalcin            raise RuntimeError("Do not use --with-mpi-dir, use the environmental variables MPICC, MPICXX, MPIFORT")
1105f9afd5aSLawrence Mitchell        if i.startswith('--with-cc='):
111007ce00dSBarry Smith            raise RuntimeError("Do not use --with-cc, use the environmental variable MPICC")
1125f9afd5aSLawrence Mitchell        if i.startswith('--with-cxx=') and i != "--with-cxx=0":
113007ce00dSBarry Smith            raise RuntimeError("Do not use --with-cxx, use the environmental variable MPICXX")
1145f9afd5aSLawrence Mitchell        if i.startswith('--with-fc=') and i != "--with-fc=0":
1155ee53db2SLisandro Dalcin            raise RuntimeError("Do not use --with-fc, use the environmental variable MPIFORT")
116007ce00dSBarry Smith
11715075023SLisandro Dalcin    if '--with-mpi=0' not in CONFIGURE_OPTIONS:
11859e0f383SLisandro Dalcin        # Simple-minded lookup for MPI and mpi4py
11959e0f383SLisandro Dalcin        mpi4py = mpicc = None
12059e0f383SLisandro Dalcin        try:
12159e0f383SLisandro Dalcin            import mpi4py
12259e0f383SLisandro Dalcin            conf = mpi4py.get_config()
12359e0f383SLisandro Dalcin            mpicc = conf.get('mpicc')
12459e0f383SLisandro Dalcin        except ImportError: # mpi4py is not installed
125922ada92SLisandro Dalcin            mpi4py = None
12615075023SLisandro Dalcin            mpicc = (os.environ.get('MPICC') or
1275ee53db2SLisandro Dalcin                     shutil.which('mpicc'))
1281b095333SLisandro Dalcin        except AttributeError: # mpi4py is too old
12959e0f383SLisandro Dalcin            pass
130922ada92SLisandro Dalcin        if not mpi4py and mpicc:
131922ada92SLisandro Dalcin            metadata['install_requires'] = ['mpi4py>=1.2.2']
13265a891e7SLisandro Dalcin
1335ee53db2SLisandro Dalcin
13496fd8cd7SLisandro Dalcindef config(prefix, dry_run=False):
13565a891e7SLisandro Dalcin    log.info('PETSc: configure')
13665a891e7SLisandro Dalcin    options = [
13796fd8cd7SLisandro Dalcin        '--prefix=' + prefix,
13865a891e7SLisandro Dalcin        'PETSC_ARCH='+os.environ['PETSC_ARCH'],
139cb58ab5bSLisandro Dalcin        '--with-shared-libraries=1',
14011035aebSLisandro Dalcin        '--with-debugging=0',
141922ada92SLisandro Dalcin        '--with-c2html=0', # not needed
14265a891e7SLisandro Dalcin        ]
14315075023SLisandro Dalcin    if '--with-fc=0' in CONFIGURE_OPTIONS:
14415075023SLisandro Dalcin        options.append('--with-sowing=0')
14515075023SLisandro Dalcin    if '--with-mpi=0' not in CONFIGURE_OPTIONS:
14659e0f383SLisandro Dalcin        try:
14759e0f383SLisandro Dalcin            import mpi4py
14859e0f383SLisandro Dalcin            conf = mpi4py.get_config()
14959e0f383SLisandro Dalcin            mpicc  = conf.get('mpicc')
150cb58ab5bSLisandro Dalcin            mpicxx = conf.get('mpicxx')
1515ee53db2SLisandro Dalcin            mpifort = conf.get('mpifort') or conf.get('mpif90')
15259e0f383SLisandro Dalcin        except (ImportError, AttributeError):
1535ee53db2SLisandro Dalcin            mpicc  = os.environ.get('MPICC') or shutil.which('mpicc')
1545ee53db2SLisandro Dalcin            mpicxx = os.environ.get('MPICXX') or shutil.which('mpicxx')
1555ee53db2SLisandro Dalcin            mpifort = os.environ.get('MPIFORT') or os.environ.get('MPIF90')
1565ee53db2SLisandro Dalcin            mpifort = mpifort or shutil.which('mpifort')
1575ee53db2SLisandro Dalcin            mpifort = mpifort or shutil.which('mpif90')
15859e0f383SLisandro Dalcin        if mpicc:
15959e0f383SLisandro Dalcin            options.append('--with-cc='+mpicc)
16015075023SLisandro Dalcin            if '--with-cxx=0' not in CONFIGURE_OPTIONS:
161cb58ab5bSLisandro Dalcin                if mpicxx:
162cb58ab5bSLisandro Dalcin                    options.append('--with-cxx='+mpicxx)
16393b33a5aSLisandro Dalcin                else:
16493b33a5aSLisandro Dalcin                    options.append('--with-cxx=0')
16515075023SLisandro Dalcin            if '--with-fc=0' not in CONFIGURE_OPTIONS:
1665ee53db2SLisandro Dalcin                if mpifort:
1675ee53db2SLisandro Dalcin                    options.append('--with-fc='+mpifort)
16859e0f383SLisandro Dalcin                else:
16993b33a5aSLisandro Dalcin                    options.append('--with-fc=0')
17093b33a5aSLisandro Dalcin                    options.append('--with-sowing=0')
17193b33a5aSLisandro Dalcin        else:
17259e0f383SLisandro Dalcin            options.append('--with-mpi=0')
17315075023SLisandro Dalcin    options.extend(CONFIGURE_OPTIONS)
17415075023SLisandro Dalcin    #
175cb58ab5bSLisandro Dalcin    log.info('configure options:')
176cb58ab5bSLisandro Dalcin    for opt in options:
177cb58ab5bSLisandro Dalcin        log.info(' '*4 + opt)
17859e0f383SLisandro Dalcin    # Run PETSc configure
1795ee53db2SLisandro Dalcin    if dry_run:
1805ee53db2SLisandro Dalcin        return
1810a0dac6aSLisandro Dalcin    use_config_py = False
18296fd8cd7SLisandro Dalcin    if use_config_py:
183e68ebbecSBarry Smith        import configure
18465a891e7SLisandro Dalcin        configure.petsc_configure(options)
185e68ebbecSBarry Smith        import logger
186e68ebbecSBarry Smith        logger.Logger.defaultLog = None
18796fd8cd7SLisandro Dalcin    else:
18884a6b807SJose E. Roman        python = sys.executable
1890a0dac6aSLisandro Dalcin        command = [python, './configure'] + options
19096fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
1915ee53db2SLisandro Dalcin        if status != 0:
1925ee53db2SLisandro Dalcin            raise RuntimeError(status)
1935ee53db2SLisandro Dalcin    # Fix PETSc configuration
1941eeab4b4SLisandro Dalcin    using_build_backend = any(
1951eeab4b4SLisandro Dalcin        os.environ.get(prefix + '_BUILD_BACKEND')
1961eeab4b4SLisandro Dalcin        for prefix in ('_PYPROJECT_HOOKS', 'PEP517')
1971eeab4b4SLisandro Dalcin    )
1981eeab4b4SLisandro Dalcin    if using_build_backend:
1995ee53db2SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
2005ee53db2SLisandro Dalcin        parch = os.environ['PETSC_ARCH']
2015ee53db2SLisandro Dalcin        include = os.path.join(pdir, parch, 'include')
2025ee53db2SLisandro Dalcin        for filename in (
2035ee53db2SLisandro Dalcin            'petscconf.h',
2045ee53db2SLisandro Dalcin            'petscconfiginfo.h',
2055ee53db2SLisandro Dalcin            'petscmachineinfo.h',
2065ee53db2SLisandro Dalcin        ):
2075ee53db2SLisandro Dalcin            filename = os.path.join(include, filename)
2085ee53db2SLisandro Dalcin            with open(filename, 'r') as old_fh:
2095ee53db2SLisandro Dalcin                contents = old_fh.read()
2105ee53db2SLisandro Dalcin            contents = contents.replace(prefix, '${PETSC_DIR}')
2115ee53db2SLisandro Dalcin            contents = re.sub(
2125ee53db2SLisandro Dalcin                r'^(#define PETSC_PYTHON_EXE) "(.*)"$',
2135ee53db2SLisandro Dalcin                r'\1 "python%d"' % sys.version_info[0],
2145ee53db2SLisandro Dalcin                contents, flags=re.MULTILINE,
2155ee53db2SLisandro Dalcin            )
2165ee53db2SLisandro Dalcin            with open(filename, 'w') as new_fh:
2175ee53db2SLisandro Dalcin                new_fh.write(contents)
2185ee53db2SLisandro Dalcin
21912c1d45bSMatthew G Knepley
22065a891e7SLisandro Dalcindef build(dry_run=False):
22165a891e7SLisandro Dalcin    log.info('PETSc: build')
222367c215cSLisandro Dalcin    # Run PETSc build
2235ee53db2SLisandro Dalcin    if dry_run:
2245ee53db2SLisandro Dalcin        return
225367c215cSLisandro Dalcin    use_builder_py = False
226367c215cSLisandro Dalcin    if use_builder_py:
227e68ebbecSBarry Smith        import builder
228e68ebbecSBarry Smith        builder.PETScMaker().run()
229105e34d4SBarry Smith        import logger
230105e34d4SBarry Smith        logger.Logger.defaultLog = None
231367c215cSLisandro Dalcin    else:
2325ee53db2SLisandro Dalcin        make = shutil.which('make')
23396fd8cd7SLisandro Dalcin        command = [make, 'all']
23496fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
2355ee53db2SLisandro Dalcin        if status != 0:
2365ee53db2SLisandro Dalcin            raise RuntimeError(status)
2375ee53db2SLisandro Dalcin
238e68ebbecSBarry Smith
2398c408988SSatish Balaydef install(dry_run=False):
24065a891e7SLisandro Dalcin    log.info('PETSc: install')
24159e0f383SLisandro Dalcin    # Run PETSc installer
2425ee53db2SLisandro Dalcin    if dry_run:
2435ee53db2SLisandro Dalcin        return
2440a0dac6aSLisandro Dalcin    use_install_py = False
245367c215cSLisandro Dalcin    if use_install_py:
246105e34d4SBarry Smith        import install
2478c408988SSatish Balay        install.Installer().run()
24865a891e7SLisandro Dalcin        import logger
24965a891e7SLisandro Dalcin        logger.Logger.defaultLog = None
250367c215cSLisandro Dalcin    else:
2515ee53db2SLisandro Dalcin        make = shutil.which('make')
2528c408988SSatish Balay        command = [make, 'install']
25396fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
2545ee53db2SLisandro Dalcin        if status != 0:
2555ee53db2SLisandro Dalcin            raise RuntimeError(status)
2565ee53db2SLisandro Dalcin
25799468c80SLisandro Dalcin
25896fd8cd7SLisandro Dalcinclass context(object):
25999468c80SLisandro Dalcin    def __init__(self):
26099468c80SLisandro Dalcin        self.sys_argv = sys.argv[:]
26199468c80SLisandro Dalcin        self.wdir = os.getcwd()
26299468c80SLisandro Dalcin    def enter(self):
26399468c80SLisandro Dalcin        del sys.argv[1:]
26499468c80SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
26599468c80SLisandro Dalcin        os.chdir(pdir)
26699468c80SLisandro Dalcin        return self
26799468c80SLisandro Dalcin    def exit(self):
26899468c80SLisandro Dalcin        sys.argv[:] = self.sys_argv
26999468c80SLisandro Dalcin        os.chdir(self.wdir)
270105e34d4SBarry Smith
2715ee53db2SLisandro Dalcin
27265a891e7SLisandro Dalcinclass cmd_install(_install):
27365a891e7SLisandro Dalcin
27441716173SLisandro Dalcin    def initialize_options(self):
27541716173SLisandro Dalcin        _install.initialize_options(self)
27641716173SLisandro Dalcin
27789031a3cSLisandro Dalcin    def finalize_options(self):
27889031a3cSLisandro Dalcin        _install.finalize_options(self)
27989031a3cSLisandro Dalcin        self.install_lib = self.install_platlib
28089031a3cSLisandro Dalcin        self.install_libbase = self.install_lib
281f46a955bSLisandro Dalcin        self.old_and_unmanageable = True
28289031a3cSLisandro Dalcin
28365a891e7SLisandro Dalcin    def run(self):
28489031a3cSLisandro Dalcin        root_dir = os.path.abspath(self.install_lib)
2858c408988SSatish Balay        prefix = os.path.join(root_dir, 'petsc')
28699468c80SLisandro Dalcin        #
28799468c80SLisandro Dalcin        ctx = context().enter()
28865a891e7SLisandro Dalcin        try:
28996fd8cd7SLisandro Dalcin            config(prefix, self.dry_run)
29096fd8cd7SLisandro Dalcin            build(self.dry_run)
2918c408988SSatish Balay            install(self.dry_run)
29265a891e7SLisandro Dalcin        finally:
29399468c80SLisandro Dalcin            ctx.exit()
29496fd8cd7SLisandro Dalcin        #
29596fd8cd7SLisandro Dalcin        self.outputs = []
2968c408988SSatish Balay        for dirpath, _, filenames in os.walk(prefix):
29796fd8cd7SLisandro Dalcin            for fn in filenames:
29896fd8cd7SLisandro Dalcin                self.outputs.append(os.path.join(dirpath, fn))
29996fd8cd7SLisandro Dalcin        #
30096fd8cd7SLisandro Dalcin        _install.run(self)
30165a891e7SLisandro Dalcin
30296fd8cd7SLisandro Dalcin    def get_outputs(self):
30396fd8cd7SLisandro Dalcin        outputs = getattr(self, 'outputs', [])
30496fd8cd7SLisandro Dalcin        outputs += _install.get_outputs(self)
30596fd8cd7SLisandro Dalcin        return outputs
306a32381aeSLisandro Dalcin
3075ee53db2SLisandro Dalcin
3085ee53db2SLisandro Dalcinclass cmd_bdist_wheel(_bdist_wheel):
3095ee53db2SLisandro Dalcin
3105ee53db2SLisandro Dalcin    def finalize_options(self):
3115ee53db2SLisandro Dalcin        super().finalize_options()
3125ee53db2SLisandro Dalcin        self.root_is_pure = False
3135ee53db2SLisandro Dalcin        self.build_number = None
3145ee53db2SLisandro Dalcin
3155ee53db2SLisandro Dalcin    def get_tag(self):
3165ee53db2SLisandro Dalcin        plat_tag = super().get_tag()[-1]
3175ee53db2SLisandro Dalcin        return (self.python_tag, "none", plat_tag)
3185ee53db2SLisandro Dalcin
3195ee53db2SLisandro Dalcin
32065a891e7SLisandro Dalcindef version():
3217d04d9c9SLisandro Dalcin    version_re = {
3227d04d9c9SLisandro Dalcin        'major'  : re.compile(r"#define\s+PETSC_VERSION_MAJOR\s+(\d+)"),
3237d04d9c9SLisandro Dalcin        'minor'  : re.compile(r"#define\s+PETSC_VERSION_MINOR\s+(\d+)"),
3247d04d9c9SLisandro Dalcin        'micro'  : re.compile(r"#define\s+PETSC_VERSION_SUBMINOR\s+(\d+)"),
32515261b6dSSatish Balay        'release': re.compile(r"#define\s+PETSC_VERSION_RELEASE\s+([-]*\d+)"),
3267d04d9c9SLisandro Dalcin        }
3277d04d9c9SLisandro Dalcin    petscversion_h = os.path.join('include','petscversion.h')
32896fd8cd7SLisandro Dalcin    data = open(petscversion_h, 'r').read()
3297d04d9c9SLisandro Dalcin    major = int(version_re['major'].search(data).groups()[0])
3307d04d9c9SLisandro Dalcin    minor = int(version_re['minor'].search(data).groups()[0])
3317d04d9c9SLisandro Dalcin    micro = int(version_re['micro'].search(data).groups()[0])
3327d04d9c9SLisandro Dalcin    release = int(version_re['release'].search(data).groups()[0])
333f46a955bSLisandro Dalcin    if release:
3340a0dac6aSLisandro Dalcin        v = "%d.%d.%d" % (major, minor, micro)
3357d04d9c9SLisandro Dalcin    else:
3360a0dac6aSLisandro Dalcin        v = "%d.%d.0.dev%d" % (major, minor+1, 0)
3377d04d9c9SLisandro Dalcin    return v
33859e0f383SLisandro Dalcin
3395ee53db2SLisandro Dalcin
34065a891e7SLisandro Dalcindef tarball():
34150f36069SLisandro Dalcin    VERSION = version()
3425ee53db2SLisandro Dalcin    if '.dev' in VERSION:
3435ee53db2SLisandro Dalcin        return None
344ca0d62ffSSatish Balay    return ('https://web.cels.anl.gov/projects/petsc/download/release-snapshots/'
345a8af48b3SSatish Balay            'petsc-%s.tar.gz#egg=petsc-%s' % (VERSION, VERSION))
34665a891e7SLisandro Dalcin
3475ee53db2SLisandro Dalcin
3485ee53db2SLisandro Dalcindescription = __doc__.split('\n')[1:-1]
3495ee53db2SLisandro Dalcindel description[1:3]
3505ee53db2SLisandro Dalcin
35165a891e7SLisandro Dalcinclassifiers = """
35296fd8cd7SLisandro DalcinDevelopment Status :: 5 - Production/Stable
35365a891e7SLisandro DalcinIntended Audience :: Developers
35465a891e7SLisandro DalcinIntended Audience :: Science/Research
35596fd8cd7SLisandro DalcinOperating System :: POSIX
35665a891e7SLisandro DalcinProgramming Language :: C
35765a891e7SLisandro DalcinProgramming Language :: C++
35865a891e7SLisandro DalcinProgramming Language :: Fortran
35965a891e7SLisandro DalcinProgramming Language :: Python
360*aab42556SSatish BalayProgramming Language :: Python :: 3
36165a891e7SLisandro DalcinTopic :: Scientific/Engineering
36265a891e7SLisandro DalcinTopic :: Software Development :: Libraries
36365a891e7SLisandro Dalcin"""
36465a891e7SLisandro Dalcin
36565a891e7SLisandro Dalcinbootstrap()
3665ee53db2SLisandro Dalcinsetup(
3675ee53db2SLisandro Dalcin    name='petsc',
36865a891e7SLisandro Dalcin    version=version(),
36965a891e7SLisandro Dalcin    description=description.pop(0),
37065a891e7SLisandro Dalcin    long_description='\n'.join(description),
3715ee53db2SLisandro Dalcin    long_description_content_type='text/x-rst',
37265a891e7SLisandro Dalcin    classifiers=classifiers.split('\n')[1:-1],
37365a891e7SLisandro Dalcin    keywords = ['PETSc', 'MPI'],
37465a891e7SLisandro Dalcin    platforms=['POSIX'],
3755ee53db2SLisandro Dalcin    license='BSD-2-Clause',
37665a891e7SLisandro Dalcin
377a17b96a8SKyle Gerard Felker    url='https://petsc.org/',
37865a891e7SLisandro Dalcin    download_url=tarball(),
37965a891e7SLisandro Dalcin
38065a891e7SLisandro Dalcin    author='PETSc Team',
38199468c80SLisandro Dalcin    author_email='petsc-maint@mcs.anl.gov',
38265a891e7SLisandro Dalcin    maintainer='Lisandro Dalcin',
38365a891e7SLisandro Dalcin    maintainer_email='dalcinl@gmail.com',
38465a891e7SLisandro Dalcin
38565a891e7SLisandro Dalcin    packages=['petsc'],
3869fb7a39fSLisandro Dalcin    package_dir= {'petsc': 'config/pypi'},
3875ee53db2SLisandro Dalcin    cmdclass={
3885ee53db2SLisandro Dalcin        'install': cmd_install,
3895ee53db2SLisandro Dalcin        'bdist_wheel': cmd_bdist_wheel,
3905ee53db2SLisandro Dalcin    },
3915ee53db2SLisandro Dalcin    **metadata
3925ee53db2SLisandro Dalcin)
393