xref: /petsc/setup.py (revision 6e8294f68f5aed480a30b64681aaabebca5c529b)
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*6e8294f6SStefano Zampini   To install the ``PETSc`` and ``petsc4py`` packages use::
1693b33a5aSLisandro Dalcin
17*6e8294f6SStefano Zampini     $ python -m pip install numpy
185ee53db2SLisandro Dalcin     $ python -m pip install petsc petsc4py
1993b33a5aSLisandro Dalcin
20922ada92SLisandro Dalcin.. tip::
21922ada92SLisandro Dalcin
2293b33a5aSLisandro Dalcin  You can also install the in-development versions with::
23922ada92SLisandro Dalcin
24*6e8294f6SStefano Zampini    $ python -m pip install cython numpy
259dddd249SSatish Balay    $ python -m pip install --no-deps https://gitlab.com/petsc/petsc/-/archive/main/petsc-main.tar.gz
26ca62002aSBarry Smith
27*6e8294f6SStefano Zampini  Provide any ``PETSc`` ``./configure`` options using the environmental variable ``PETSC_CONFIGURE_OPTIONS``.
28007ce00dSBarry Smith
29007ce00dSBarry Smith  Do not use the ``PETSc`` ``./configure`` options ``--with-cc``, ``--with-cxx``, ``--with-fc``, or ``--with-mpi-dir``.
30*6e8294f6SStefano Zampini  Compilers are detected from (in order): 1) the environmental variables ``MPICC``, ``MPICXX``, ``MPIFORT``,
31*6e8294f6SStefano Zampini  or 2) from running the ``which mpicc``, ``which mpicxx``, ``which mpifort`` commands.
32007ce00dSBarry Smith
33e68ebbecSBarry Smith"""
34e68ebbecSBarry Smith
355ee53db2SLisandro Dalcinimport re
365ee53db2SLisandro Dalcinimport os
375ee53db2SLisandro Dalcinimport sys
385ee53db2SLisandro Dalcinimport shlex
395ee53db2SLisandro Dalcinimport shutil
4096fd8cd7SLisandro Dalcinfrom setuptools import setup
4196fd8cd7SLisandro Dalcinfrom setuptools.command.install import install as _install
420902bb45SLisandro Dalcintry:
430902bb45SLisandro Dalcin    from setuptools.command.bdist_wheel import bdist_wheel as _bdist_wheel
440902bb45SLisandro Dalcinexcept ImportError:
450902bb45SLisandro Dalcin    from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
4665a891e7SLisandro Dalcinfrom distutils import log
4712c1d45bSMatthew G Knepley
4865a891e7SLisandro Dalcininit_py = """\
49a32381aeSLisandro Dalcin# Author:  PETSc Team
50a597b971SLisandro Dalcin# Contact: petsc-maint@mcs.anl.gov
5165a891e7SLisandro Dalcin
5265a891e7SLisandro Dalcindef get_petsc_dir():
5365a891e7SLisandro Dalcin    import os
5465a891e7SLisandro Dalcin    return os.path.dirname(__file__)
5565a891e7SLisandro Dalcin
565ee53db2SLisandro Dalcin
57a32381aeSLisandro Dalcindef get_config():
58a32381aeSLisandro Dalcin    conf = {}
599fb7a39fSLisandro Dalcin    conf['PETSC_DIR'] = get_petsc_dir()
60a32381aeSLisandro Dalcin    return conf
6165a891e7SLisandro Dalcin"""
6265a891e7SLisandro Dalcin
635ee53db2SLisandro Dalcinmain_py = """\
645ee53db2SLisandro Dalcin# Author:  PETSc Team
655ee53db2SLisandro Dalcin# Contact: petsc-maint@mcs.anl.gov
665ee53db2SLisandro Dalcin
675ee53db2SLisandro Dalcinif __name__ == "__main__":
685ee53db2SLisandro Dalcin    import sys
695ee53db2SLisandro Dalcin    if "--prefix" in sys.argv:
705ee53db2SLisandro Dalcin        from . import get_petsc_dir
715ee53db2SLisandro Dalcin        print(get_petsc_dir())
725ee53db2SLisandro Dalcin        del get_petsc_dir
735ee53db2SLisandro Dalcin    del sys
745ee53db2SLisandro Dalcin"""
755ee53db2SLisandro Dalcin
7659e0f383SLisandro Dalcinmetadata = {
7759e0f383SLisandro Dalcin    'provides' : ['petsc'],
7896fd8cd7SLisandro Dalcin    'zip_safe' : False,
7959e0f383SLisandro Dalcin}
8059e0f383SLisandro Dalcin
8115075023SLisandro DalcinCONFIGURE_OPTIONS = []
8215075023SLisandro Dalcin
835ee53db2SLisandro Dalcin
8465a891e7SLisandro Dalcindef bootstrap():
85cb58ab5bSLisandro Dalcin    # Set PETSC_DIR and PETSC_ARCH
8665a891e7SLisandro Dalcin    PETSC_DIR  = os.path.abspath(os.getcwd())
875ee53db2SLisandro Dalcin    PETSC_ARCH = 'arch-python'
8865a891e7SLisandro Dalcin    os.environ['PETSC_DIR']  = PETSC_DIR
8965a891e7SLisandro Dalcin    os.environ['PETSC_ARCH'] = PETSC_ARCH
9065a891e7SLisandro Dalcin    sys.path.insert(0, os.path.join(PETSC_DIR, 'config'))
91af0996ceSBarry Smith    sys.path.insert(0, os.path.join(PETSC_DIR, 'lib','petsc','conf'))
925ee53db2SLisandro Dalcin
935ee53db2SLisandro Dalcin    # Generate package __init__.py and __main__.py files
949fb7a39fSLisandro Dalcin    pkgdir = os.path.join('config', 'pypi')
955ee53db2SLisandro Dalcin    os.makedirs(pkgdir, exist_ok=True)
965ee53db2SLisandro Dalcin    for pyfile, contents in (
975ee53db2SLisandro Dalcin        ('__init__.py', init_py),
985ee53db2SLisandro Dalcin        ('__main__.py', main_py),
995ee53db2SLisandro Dalcin    ):
1005ee53db2SLisandro Dalcin        with open(os.path.join(pkgdir, pyfile), 'w') as fh:
1015ee53db2SLisandro Dalcin            fh.write(contents)
1025ee53db2SLisandro Dalcin
10315075023SLisandro Dalcin    # Configure options
10415075023SLisandro Dalcin    options = os.environ.get('PETSC_CONFIGURE_OPTIONS', '')
1055ee53db2SLisandro Dalcin    CONFIGURE_OPTIONS.extend(shlex.split(options))
106007ce00dSBarry Smith    for i in CONFIGURE_OPTIONS:
1075f9afd5aSLawrence Mitchell        if i.startswith('--with-mpi-dir='):
1085ee53db2SLisandro Dalcin            raise RuntimeError("Do not use --with-mpi-dir, use the environmental variables MPICC, MPICXX, MPIFORT")
1095f9afd5aSLawrence Mitchell        if i.startswith('--with-cc='):
110007ce00dSBarry Smith            raise RuntimeError("Do not use --with-cc, use the environmental variable MPICC")
1115f9afd5aSLawrence Mitchell        if i.startswith('--with-cxx=') and i != "--with-cxx=0":
112007ce00dSBarry Smith            raise RuntimeError("Do not use --with-cxx, use the environmental variable MPICXX")
1135f9afd5aSLawrence Mitchell        if i.startswith('--with-fc=') and i != "--with-fc=0":
1145ee53db2SLisandro Dalcin            raise RuntimeError("Do not use --with-fc, use the environmental variable MPIFORT")
115007ce00dSBarry Smith
11665a891e7SLisandro Dalcin
1175ee53db2SLisandro Dalcin
11896fd8cd7SLisandro Dalcindef config(prefix, dry_run=False):
11965a891e7SLisandro Dalcin    log.info('PETSc: configure')
12065a891e7SLisandro Dalcin    options = [
12196fd8cd7SLisandro Dalcin        '--prefix=' + prefix,
12265a891e7SLisandro Dalcin        'PETSC_ARCH='+os.environ['PETSC_ARCH'],
123cb58ab5bSLisandro Dalcin        '--with-shared-libraries=1',
124922ada92SLisandro Dalcin        '--with-c2html=0', # not needed
12565a891e7SLisandro Dalcin        ]
12615075023SLisandro Dalcin    if '--with-fc=0' in CONFIGURE_OPTIONS:
12715075023SLisandro Dalcin        options.append('--with-sowing=0')
128*6e8294f6SStefano Zampini    if '--with-debugging=1' not in CONFIGURE_OPTIONS:
129*6e8294f6SStefano Zampini        options.append('--with-debugging=0')
13015075023SLisandro Dalcin    if '--with-mpi=0' not in CONFIGURE_OPTIONS:
1315ee53db2SLisandro Dalcin        mpicc = os.environ.get('MPICC') or shutil.which('mpicc')
1325ee53db2SLisandro Dalcin        mpicxx = os.environ.get('MPICXX') or shutil.which('mpicxx')
133*6e8294f6SStefano Zampini        mpifort = (
134*6e8294f6SStefano Zampini            os.environ.get('MPIFORT')
135*6e8294f6SStefano Zampini            or os.environ.get('MPIF90')
136*6e8294f6SStefano Zampini            or shutil.which('mpifort')
137*6e8294f6SStefano Zampini            or shutil.which('mpif90')
138*6e8294f6SStefano Zampini        )
13959e0f383SLisandro Dalcin        if mpicc:
14059e0f383SLisandro Dalcin            options.append('--with-cc='+mpicc)
14115075023SLisandro Dalcin            if '--with-cxx=0' not in CONFIGURE_OPTIONS:
142cb58ab5bSLisandro Dalcin                if mpicxx:
143cb58ab5bSLisandro Dalcin                    options.append('--with-cxx='+mpicxx)
14493b33a5aSLisandro Dalcin                else:
14593b33a5aSLisandro Dalcin                    options.append('--with-cxx=0')
14615075023SLisandro Dalcin            if '--with-fc=0' not in CONFIGURE_OPTIONS:
1475ee53db2SLisandro Dalcin                if mpifort:
1485ee53db2SLisandro Dalcin                    options.append('--with-fc='+mpifort)
14959e0f383SLisandro Dalcin                else:
15093b33a5aSLisandro Dalcin                    options.append('--with-fc=0')
15193b33a5aSLisandro Dalcin                    options.append('--with-sowing=0')
15293b33a5aSLisandro Dalcin        else:
15359e0f383SLisandro Dalcin            options.append('--with-mpi=0')
15415075023SLisandro Dalcin    options.extend(CONFIGURE_OPTIONS)
15515075023SLisandro Dalcin    #
156cb58ab5bSLisandro Dalcin    log.info('configure options:')
157cb58ab5bSLisandro Dalcin    for opt in options:
158cb58ab5bSLisandro Dalcin        log.info(' '*4 + opt)
15959e0f383SLisandro Dalcin    # Run PETSc configure
1605ee53db2SLisandro Dalcin    if dry_run:
1615ee53db2SLisandro Dalcin        return
1620a0dac6aSLisandro Dalcin    use_config_py = False
16396fd8cd7SLisandro Dalcin    if use_config_py:
164e68ebbecSBarry Smith        import configure
16565a891e7SLisandro Dalcin        configure.petsc_configure(options)
166e68ebbecSBarry Smith        import logger
167e68ebbecSBarry Smith        logger.Logger.defaultLog = None
16896fd8cd7SLisandro Dalcin    else:
16984a6b807SJose E. Roman        python = sys.executable
1700a0dac6aSLisandro Dalcin        command = [python, './configure'] + options
17196fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
1725ee53db2SLisandro Dalcin        if status != 0:
1735ee53db2SLisandro Dalcin            raise RuntimeError(status)
174*6e8294f6SStefano Zampini
1755ee53db2SLisandro Dalcin    # Fix PETSc configuration
1761eeab4b4SLisandro Dalcin    using_build_backend = any(
1771eeab4b4SLisandro Dalcin        os.environ.get(prefix + '_BUILD_BACKEND')
1781eeab4b4SLisandro Dalcin        for prefix in ('_PYPROJECT_HOOKS', 'PEP517')
1791eeab4b4SLisandro Dalcin    )
1801eeab4b4SLisandro Dalcin    if using_build_backend:
1815ee53db2SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
1825ee53db2SLisandro Dalcin        parch = os.environ['PETSC_ARCH']
1835ee53db2SLisandro Dalcin        include = os.path.join(pdir, parch, 'include')
1845ee53db2SLisandro Dalcin        for filename in (
1855ee53db2SLisandro Dalcin            'petscconf.h',
1865ee53db2SLisandro Dalcin            'petscconfiginfo.h',
1875ee53db2SLisandro Dalcin            'petscmachineinfo.h',
1885ee53db2SLisandro Dalcin        ):
1895ee53db2SLisandro Dalcin            filename = os.path.join(include, filename)
1905ee53db2SLisandro Dalcin            with open(filename, 'r') as old_fh:
1915ee53db2SLisandro Dalcin                contents = old_fh.read()
1925ee53db2SLisandro Dalcin            contents = contents.replace(prefix, '${PETSC_DIR}')
1935ee53db2SLisandro Dalcin            contents = re.sub(
1945ee53db2SLisandro Dalcin                r'^(#define PETSC_PYTHON_EXE) "(.*)"$',
1955ee53db2SLisandro Dalcin                r'\1 "python%d"' % sys.version_info[0],
1965ee53db2SLisandro Dalcin                contents, flags=re.MULTILINE,
1975ee53db2SLisandro Dalcin            )
1985ee53db2SLisandro Dalcin            with open(filename, 'w') as new_fh:
1995ee53db2SLisandro Dalcin                new_fh.write(contents)
2005ee53db2SLisandro Dalcin
20112c1d45bSMatthew G Knepley
20265a891e7SLisandro Dalcindef build(dry_run=False):
20365a891e7SLisandro Dalcin    log.info('PETSc: build')
204367c215cSLisandro Dalcin    # Run PETSc build
2055ee53db2SLisandro Dalcin    if dry_run:
2065ee53db2SLisandro Dalcin        return
207367c215cSLisandro Dalcin    use_builder_py = False
208367c215cSLisandro Dalcin    if use_builder_py:
209e68ebbecSBarry Smith        import builder
210e68ebbecSBarry Smith        builder.PETScMaker().run()
211105e34d4SBarry Smith        import logger
212105e34d4SBarry Smith        logger.Logger.defaultLog = None
213367c215cSLisandro Dalcin    else:
2145ee53db2SLisandro Dalcin        make = shutil.which('make')
21596fd8cd7SLisandro Dalcin        command = [make, 'all']
21696fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
2175ee53db2SLisandro Dalcin        if status != 0:
2185ee53db2SLisandro Dalcin            raise RuntimeError(status)
2195ee53db2SLisandro Dalcin
220e68ebbecSBarry Smith
2218c408988SSatish Balaydef install(dry_run=False):
22265a891e7SLisandro Dalcin    log.info('PETSc: install')
22359e0f383SLisandro Dalcin    # Run PETSc installer
2245ee53db2SLisandro Dalcin    if dry_run:
2255ee53db2SLisandro Dalcin        return
2260a0dac6aSLisandro Dalcin    use_install_py = False
227367c215cSLisandro Dalcin    if use_install_py:
228105e34d4SBarry Smith        import install
2298c408988SSatish Balay        install.Installer().run()
23065a891e7SLisandro Dalcin        import logger
23165a891e7SLisandro Dalcin        logger.Logger.defaultLog = None
232367c215cSLisandro Dalcin    else:
2335ee53db2SLisandro Dalcin        make = shutil.which('make')
2348c408988SSatish Balay        command = [make, 'install']
23596fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
2365ee53db2SLisandro Dalcin        if status != 0:
2375ee53db2SLisandro Dalcin            raise RuntimeError(status)
2385ee53db2SLisandro Dalcin
23999468c80SLisandro Dalcin
24096fd8cd7SLisandro Dalcinclass context(object):
24199468c80SLisandro Dalcin    def __init__(self):
24299468c80SLisandro Dalcin        self.sys_argv = sys.argv[:]
24399468c80SLisandro Dalcin        self.wdir = os.getcwd()
24499468c80SLisandro Dalcin    def enter(self):
24599468c80SLisandro Dalcin        del sys.argv[1:]
24699468c80SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
24799468c80SLisandro Dalcin        os.chdir(pdir)
24899468c80SLisandro Dalcin        return self
24999468c80SLisandro Dalcin    def exit(self):
25099468c80SLisandro Dalcin        sys.argv[:] = self.sys_argv
25199468c80SLisandro Dalcin        os.chdir(self.wdir)
252105e34d4SBarry Smith
2535ee53db2SLisandro Dalcin
25465a891e7SLisandro Dalcinclass cmd_install(_install):
25565a891e7SLisandro Dalcin
25641716173SLisandro Dalcin    def initialize_options(self):
25741716173SLisandro Dalcin        _install.initialize_options(self)
25841716173SLisandro Dalcin
25989031a3cSLisandro Dalcin    def finalize_options(self):
26089031a3cSLisandro Dalcin        _install.finalize_options(self)
26189031a3cSLisandro Dalcin        self.install_lib = self.install_platlib
26289031a3cSLisandro Dalcin        self.install_libbase = self.install_lib
263f46a955bSLisandro Dalcin        self.old_and_unmanageable = True
26489031a3cSLisandro Dalcin
26565a891e7SLisandro Dalcin    def run(self):
26689031a3cSLisandro Dalcin        root_dir = os.path.abspath(self.install_lib)
2678c408988SSatish Balay        prefix = os.path.join(root_dir, 'petsc')
26899468c80SLisandro Dalcin        #
26999468c80SLisandro Dalcin        ctx = context().enter()
27065a891e7SLisandro Dalcin        try:
27196fd8cd7SLisandro Dalcin            config(prefix, self.dry_run)
27296fd8cd7SLisandro Dalcin            build(self.dry_run)
2738c408988SSatish Balay            install(self.dry_run)
27465a891e7SLisandro Dalcin        finally:
27599468c80SLisandro Dalcin            ctx.exit()
27696fd8cd7SLisandro Dalcin        #
27796fd8cd7SLisandro Dalcin        self.outputs = []
2788c408988SSatish Balay        for dirpath, _, filenames in os.walk(prefix):
27996fd8cd7SLisandro Dalcin            for fn in filenames:
28096fd8cd7SLisandro Dalcin                self.outputs.append(os.path.join(dirpath, fn))
28196fd8cd7SLisandro Dalcin        #
28296fd8cd7SLisandro Dalcin        _install.run(self)
28365a891e7SLisandro Dalcin
28496fd8cd7SLisandro Dalcin    def get_outputs(self):
28596fd8cd7SLisandro Dalcin        outputs = getattr(self, 'outputs', [])
28696fd8cd7SLisandro Dalcin        outputs += _install.get_outputs(self)
28796fd8cd7SLisandro Dalcin        return outputs
288a32381aeSLisandro Dalcin
2895ee53db2SLisandro Dalcin
2905ee53db2SLisandro Dalcinclass cmd_bdist_wheel(_bdist_wheel):
2915ee53db2SLisandro Dalcin
2925ee53db2SLisandro Dalcin    def finalize_options(self):
2935ee53db2SLisandro Dalcin        super().finalize_options()
2945ee53db2SLisandro Dalcin        self.root_is_pure = False
2955ee53db2SLisandro Dalcin        self.build_number = None
296*6e8294f6SStefano Zampini        # self.keep_temp = True
2975ee53db2SLisandro Dalcin
2985ee53db2SLisandro Dalcin    def get_tag(self):
2995ee53db2SLisandro Dalcin        plat_tag = super().get_tag()[-1]
3005ee53db2SLisandro Dalcin        return (self.python_tag, "none", plat_tag)
3015ee53db2SLisandro Dalcin
3025ee53db2SLisandro Dalcin
30365a891e7SLisandro Dalcindef version():
3047d04d9c9SLisandro Dalcin    version_re = {
3057d04d9c9SLisandro Dalcin        'major'  : re.compile(r"#define\s+PETSC_VERSION_MAJOR\s+(\d+)"),
3067d04d9c9SLisandro Dalcin        'minor'  : re.compile(r"#define\s+PETSC_VERSION_MINOR\s+(\d+)"),
3077d04d9c9SLisandro Dalcin        'micro'  : re.compile(r"#define\s+PETSC_VERSION_SUBMINOR\s+(\d+)"),
30815261b6dSSatish Balay        'release': re.compile(r"#define\s+PETSC_VERSION_RELEASE\s+([-]*\d+)"),
3097d04d9c9SLisandro Dalcin        }
3107d04d9c9SLisandro Dalcin    petscversion_h = os.path.join('include','petscversion.h')
31196fd8cd7SLisandro Dalcin    data = open(petscversion_h, 'r').read()
3127d04d9c9SLisandro Dalcin    major = int(version_re['major'].search(data).groups()[0])
3137d04d9c9SLisandro Dalcin    minor = int(version_re['minor'].search(data).groups()[0])
3147d04d9c9SLisandro Dalcin    micro = int(version_re['micro'].search(data).groups()[0])
3157d04d9c9SLisandro Dalcin    release = int(version_re['release'].search(data).groups()[0])
316f46a955bSLisandro Dalcin    if release:
3170a0dac6aSLisandro Dalcin        v = "%d.%d.%d" % (major, minor, micro)
3187d04d9c9SLisandro Dalcin    else:
3190a0dac6aSLisandro Dalcin        v = "%d.%d.0.dev%d" % (major, minor+1, 0)
3207d04d9c9SLisandro Dalcin    return v
32159e0f383SLisandro Dalcin
3225ee53db2SLisandro Dalcin
32365a891e7SLisandro Dalcindef tarball():
32450f36069SLisandro Dalcin    VERSION = version()
3255ee53db2SLisandro Dalcin    if '.dev' in VERSION:
3265ee53db2SLisandro Dalcin        return None
327ca0d62ffSSatish Balay    return ('https://web.cels.anl.gov/projects/petsc/download/release-snapshots/'
328a8af48b3SSatish Balay            'petsc-%s.tar.gz#egg=petsc-%s' % (VERSION, VERSION))
32965a891e7SLisandro Dalcin
3305ee53db2SLisandro Dalcin
3315ee53db2SLisandro Dalcindescription = __doc__.split('\n')[1:-1]
3325ee53db2SLisandro Dalcindel description[1:3]
3335ee53db2SLisandro Dalcin
33465a891e7SLisandro Dalcinclassifiers = """
33596fd8cd7SLisandro DalcinDevelopment Status :: 5 - Production/Stable
33665a891e7SLisandro DalcinIntended Audience :: Developers
33765a891e7SLisandro DalcinIntended Audience :: Science/Research
33896fd8cd7SLisandro DalcinOperating System :: POSIX
33965a891e7SLisandro DalcinProgramming Language :: C
34065a891e7SLisandro DalcinProgramming Language :: C++
34165a891e7SLisandro DalcinProgramming Language :: Fortran
34265a891e7SLisandro DalcinProgramming Language :: Python
343aab42556SSatish BalayProgramming Language :: Python :: 3
34465a891e7SLisandro DalcinTopic :: Scientific/Engineering
34565a891e7SLisandro DalcinTopic :: Software Development :: Libraries
34665a891e7SLisandro Dalcin"""
34765a891e7SLisandro Dalcin
34865a891e7SLisandro Dalcinbootstrap()
3495ee53db2SLisandro Dalcinsetup(
3505ee53db2SLisandro Dalcin    name='petsc',
35165a891e7SLisandro Dalcin    version=version(),
35265a891e7SLisandro Dalcin    description=description.pop(0),
35365a891e7SLisandro Dalcin    long_description='\n'.join(description),
3545ee53db2SLisandro Dalcin    long_description_content_type='text/x-rst',
35565a891e7SLisandro Dalcin    classifiers=classifiers.split('\n')[1:-1],
35665a891e7SLisandro Dalcin    keywords = ['PETSc', 'MPI'],
35765a891e7SLisandro Dalcin    platforms=['POSIX'],
3585ee53db2SLisandro Dalcin    license='BSD-2-Clause',
35965a891e7SLisandro Dalcin
360a17b96a8SKyle Gerard Felker    url='https://petsc.org/',
36165a891e7SLisandro Dalcin    download_url=tarball(),
36265a891e7SLisandro Dalcin
36365a891e7SLisandro Dalcin    author='PETSc Team',
36499468c80SLisandro Dalcin    author_email='petsc-maint@mcs.anl.gov',
36565a891e7SLisandro Dalcin    maintainer='Lisandro Dalcin',
36665a891e7SLisandro Dalcin    maintainer_email='dalcinl@gmail.com',
36765a891e7SLisandro Dalcin
36865a891e7SLisandro Dalcin    packages=['petsc'],
3699fb7a39fSLisandro Dalcin    package_dir= {'petsc': 'config/pypi'},
3705ee53db2SLisandro Dalcin    cmdclass={
3715ee53db2SLisandro Dalcin        'install': cmd_install,
3725ee53db2SLisandro Dalcin        'bdist_wheel': cmd_bdist_wheel,
3735ee53db2SLisandro Dalcin    },
3745ee53db2SLisandro Dalcin    **metadata
3755ee53db2SLisandro Dalcin)
376