xref: /petsc/setup.py (revision dc3b5f91da540d0d3af7bee0d33428ae6c98e163)
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
156e8294f6SStefano Zampini   To install the ``PETSc`` and ``petsc4py`` packages use::
1693b33a5aSLisandro Dalcin
176e8294f6SStefano 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
246e8294f6SStefano 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
276e8294f6SStefano 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``.
306e8294f6SStefano Zampini  Compilers are detected from (in order): 1) the environmental variables ``MPICC``, ``MPICXX``, ``MPIFORT``,
316e8294f6SStefano 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
118*f873f7fbSLisandro Dalcindef config(prefix):
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')
1286e8294f6SStefano Zampini    if '--with-debugging=1' not in CONFIGURE_OPTIONS:
1296e8294f6SStefano 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')
1336e8294f6SStefano Zampini        mpifort = (
1346e8294f6SStefano Zampini            os.environ.get('MPIFORT')
1356e8294f6SStefano Zampini            or os.environ.get('MPIF90')
1366e8294f6SStefano Zampini            or shutil.which('mpifort')
1376e8294f6SStefano Zampini            or shutil.which('mpif90')
1386e8294f6SStefano 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
1600a0dac6aSLisandro Dalcin    use_config_py = False
16196fd8cd7SLisandro Dalcin    if use_config_py:
162e68ebbecSBarry Smith        import configure
16365a891e7SLisandro Dalcin        configure.petsc_configure(options)
164e68ebbecSBarry Smith        import logger
165e68ebbecSBarry Smith        logger.Logger.defaultLog = None
16696fd8cd7SLisandro Dalcin    else:
16784a6b807SJose E. Roman        python = sys.executable
1680a0dac6aSLisandro Dalcin        command = [python, './configure'] + options
16996fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
1705ee53db2SLisandro Dalcin        if status != 0:
1715ee53db2SLisandro Dalcin            raise RuntimeError(status)
1726e8294f6SStefano Zampini
1735ee53db2SLisandro Dalcin    # Fix PETSc configuration
1741eeab4b4SLisandro Dalcin    using_build_backend = any(
1751eeab4b4SLisandro Dalcin        os.environ.get(prefix + '_BUILD_BACKEND')
1761eeab4b4SLisandro Dalcin        for prefix in ('_PYPROJECT_HOOKS', 'PEP517')
1771eeab4b4SLisandro Dalcin    )
1781eeab4b4SLisandro Dalcin    if using_build_backend:
1795ee53db2SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
1805ee53db2SLisandro Dalcin        parch = os.environ['PETSC_ARCH']
1815ee53db2SLisandro Dalcin        include = os.path.join(pdir, parch, 'include')
1825ee53db2SLisandro Dalcin        for filename in (
1835ee53db2SLisandro Dalcin            'petscconf.h',
1845ee53db2SLisandro Dalcin            'petscconfiginfo.h',
1855ee53db2SLisandro Dalcin            'petscmachineinfo.h',
1865ee53db2SLisandro Dalcin        ):
1875ee53db2SLisandro Dalcin            filename = os.path.join(include, filename)
1885ee53db2SLisandro Dalcin            with open(filename, 'r') as old_fh:
1895ee53db2SLisandro Dalcin                contents = old_fh.read()
1905ee53db2SLisandro Dalcin            contents = contents.replace(prefix, '${PETSC_DIR}')
1915ee53db2SLisandro Dalcin            contents = re.sub(
1925ee53db2SLisandro Dalcin                r'^(#define PETSC_PYTHON_EXE) "(.*)"$',
1935ee53db2SLisandro Dalcin                r'\1 "python%d"' % sys.version_info[0],
1945ee53db2SLisandro Dalcin                contents, flags=re.MULTILINE,
1955ee53db2SLisandro Dalcin            )
1965ee53db2SLisandro Dalcin            with open(filename, 'w') as new_fh:
1975ee53db2SLisandro Dalcin                new_fh.write(contents)
1985ee53db2SLisandro Dalcin
19912c1d45bSMatthew G Knepley
200*f873f7fbSLisandro Dalcindef build():
20165a891e7SLisandro Dalcin    log.info('PETSc: build')
202367c215cSLisandro Dalcin    # Run PETSc build
203367c215cSLisandro Dalcin    use_builder_py = False
204367c215cSLisandro Dalcin    if use_builder_py:
205e68ebbecSBarry Smith        import builder
206e68ebbecSBarry Smith        builder.PETScMaker().run()
207105e34d4SBarry Smith        import logger
208105e34d4SBarry Smith        logger.Logger.defaultLog = None
209367c215cSLisandro Dalcin    else:
2105ee53db2SLisandro Dalcin        make = shutil.which('make')
21196fd8cd7SLisandro Dalcin        command = [make, 'all']
21296fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
2135ee53db2SLisandro Dalcin        if status != 0:
2145ee53db2SLisandro Dalcin            raise RuntimeError(status)
2155ee53db2SLisandro Dalcin
216e68ebbecSBarry Smith
217*f873f7fbSLisandro Dalcindef install():
21865a891e7SLisandro Dalcin    log.info('PETSc: install')
21959e0f383SLisandro Dalcin    # Run PETSc installer
2200a0dac6aSLisandro Dalcin    use_install_py = False
221367c215cSLisandro Dalcin    if use_install_py:
222105e34d4SBarry Smith        import install
2238c408988SSatish Balay        install.Installer().run()
22465a891e7SLisandro Dalcin        import logger
22565a891e7SLisandro Dalcin        logger.Logger.defaultLog = None
226367c215cSLisandro Dalcin    else:
2275ee53db2SLisandro Dalcin        make = shutil.which('make')
2288c408988SSatish Balay        command = [make, 'install']
22996fd8cd7SLisandro Dalcin        status = os.system(" ".join(command))
2305ee53db2SLisandro Dalcin        if status != 0:
2315ee53db2SLisandro Dalcin            raise RuntimeError(status)
2325ee53db2SLisandro Dalcin
23399468c80SLisandro Dalcin
23496fd8cd7SLisandro Dalcinclass context(object):
23599468c80SLisandro Dalcin    def __init__(self):
23699468c80SLisandro Dalcin        self.sys_argv = sys.argv[:]
23799468c80SLisandro Dalcin        self.wdir = os.getcwd()
23899468c80SLisandro Dalcin    def enter(self):
23999468c80SLisandro Dalcin        del sys.argv[1:]
24099468c80SLisandro Dalcin        pdir = os.environ['PETSC_DIR']
24199468c80SLisandro Dalcin        os.chdir(pdir)
24299468c80SLisandro Dalcin        return self
24399468c80SLisandro Dalcin    def exit(self):
24499468c80SLisandro Dalcin        sys.argv[:] = self.sys_argv
24599468c80SLisandro Dalcin        os.chdir(self.wdir)
246105e34d4SBarry Smith
2475ee53db2SLisandro Dalcin
24865a891e7SLisandro Dalcinclass cmd_install(_install):
24965a891e7SLisandro Dalcin
25041716173SLisandro Dalcin    def initialize_options(self):
25141716173SLisandro Dalcin        _install.initialize_options(self)
25241716173SLisandro Dalcin
25389031a3cSLisandro Dalcin    def finalize_options(self):
25489031a3cSLisandro Dalcin        _install.finalize_options(self)
25589031a3cSLisandro Dalcin        self.install_lib = self.install_platlib
25689031a3cSLisandro Dalcin        self.install_libbase = self.install_lib
257f46a955bSLisandro Dalcin        self.old_and_unmanageable = True
25889031a3cSLisandro Dalcin
25965a891e7SLisandro Dalcin    def run(self):
26089031a3cSLisandro Dalcin        root_dir = os.path.abspath(self.install_lib)
2618c408988SSatish Balay        prefix = os.path.join(root_dir, 'petsc')
26299468c80SLisandro Dalcin        #
26399468c80SLisandro Dalcin        ctx = context().enter()
26465a891e7SLisandro Dalcin        try:
265*f873f7fbSLisandro Dalcin            config(prefix)
266*f873f7fbSLisandro Dalcin            build()
267*f873f7fbSLisandro Dalcin            install()
26865a891e7SLisandro Dalcin        finally:
26999468c80SLisandro Dalcin            ctx.exit()
27096fd8cd7SLisandro Dalcin        #
27196fd8cd7SLisandro Dalcin        self.outputs = []
2728c408988SSatish Balay        for dirpath, _, filenames in os.walk(prefix):
27396fd8cd7SLisandro Dalcin            for fn in filenames:
27496fd8cd7SLisandro Dalcin                self.outputs.append(os.path.join(dirpath, fn))
27596fd8cd7SLisandro Dalcin        #
27696fd8cd7SLisandro Dalcin        _install.run(self)
27765a891e7SLisandro Dalcin
27896fd8cd7SLisandro Dalcin    def get_outputs(self):
27996fd8cd7SLisandro Dalcin        outputs = getattr(self, 'outputs', [])
28096fd8cd7SLisandro Dalcin        outputs += _install.get_outputs(self)
28196fd8cd7SLisandro Dalcin        return outputs
282a32381aeSLisandro Dalcin
2835ee53db2SLisandro Dalcin
2845ee53db2SLisandro Dalcinclass cmd_bdist_wheel(_bdist_wheel):
2855ee53db2SLisandro Dalcin
2865ee53db2SLisandro Dalcin    def finalize_options(self):
2875ee53db2SLisandro Dalcin        super().finalize_options()
2885ee53db2SLisandro Dalcin        self.root_is_pure = False
2895ee53db2SLisandro Dalcin        self.build_number = None
2906e8294f6SStefano Zampini        # self.keep_temp = True
2915ee53db2SLisandro Dalcin
2925ee53db2SLisandro Dalcin    def get_tag(self):
2935ee53db2SLisandro Dalcin        plat_tag = super().get_tag()[-1]
2945ee53db2SLisandro Dalcin        return (self.python_tag, "none", plat_tag)
2955ee53db2SLisandro Dalcin
2965ee53db2SLisandro Dalcin
29765a891e7SLisandro Dalcindef version():
2987d04d9c9SLisandro Dalcin    version_re = {
2997d04d9c9SLisandro Dalcin        'major'  : re.compile(r"#define\s+PETSC_VERSION_MAJOR\s+(\d+)"),
3007d04d9c9SLisandro Dalcin        'minor'  : re.compile(r"#define\s+PETSC_VERSION_MINOR\s+(\d+)"),
3017d04d9c9SLisandro Dalcin        'micro'  : re.compile(r"#define\s+PETSC_VERSION_SUBMINOR\s+(\d+)"),
30215261b6dSSatish Balay        'release': re.compile(r"#define\s+PETSC_VERSION_RELEASE\s+([-]*\d+)"),
3037d04d9c9SLisandro Dalcin        }
3047d04d9c9SLisandro Dalcin    petscversion_h = os.path.join('include','petscversion.h')
30596fd8cd7SLisandro Dalcin    data = open(petscversion_h, 'r').read()
3067d04d9c9SLisandro Dalcin    major = int(version_re['major'].search(data).groups()[0])
3077d04d9c9SLisandro Dalcin    minor = int(version_re['minor'].search(data).groups()[0])
3087d04d9c9SLisandro Dalcin    micro = int(version_re['micro'].search(data).groups()[0])
3097d04d9c9SLisandro Dalcin    release = int(version_re['release'].search(data).groups()[0])
310f46a955bSLisandro Dalcin    if release:
3110a0dac6aSLisandro Dalcin        v = "%d.%d.%d" % (major, minor, micro)
3127d04d9c9SLisandro Dalcin    else:
3130a0dac6aSLisandro Dalcin        v = "%d.%d.0.dev%d" % (major, minor+1, 0)
3147d04d9c9SLisandro Dalcin    return v
31559e0f383SLisandro Dalcin
3165ee53db2SLisandro Dalcin
31765a891e7SLisandro Dalcindef tarball():
31850f36069SLisandro Dalcin    VERSION = version()
3195ee53db2SLisandro Dalcin    if '.dev' in VERSION:
3205ee53db2SLisandro Dalcin        return None
321ca0d62ffSSatish Balay    return ('https://web.cels.anl.gov/projects/petsc/download/release-snapshots/'
322a8af48b3SSatish Balay            'petsc-%s.tar.gz#egg=petsc-%s' % (VERSION, VERSION))
32365a891e7SLisandro Dalcin
3245ee53db2SLisandro Dalcin
3255ee53db2SLisandro Dalcindescription = __doc__.split('\n')[1:-1]
3265ee53db2SLisandro Dalcindel description[1:3]
3275ee53db2SLisandro Dalcin
32865a891e7SLisandro Dalcinclassifiers = """
32996fd8cd7SLisandro DalcinDevelopment Status :: 5 - Production/Stable
33065a891e7SLisandro DalcinIntended Audience :: Developers
33165a891e7SLisandro DalcinIntended Audience :: Science/Research
33296fd8cd7SLisandro DalcinOperating System :: POSIX
33365a891e7SLisandro DalcinProgramming Language :: C
33465a891e7SLisandro DalcinProgramming Language :: C++
33565a891e7SLisandro DalcinProgramming Language :: Fortran
33665a891e7SLisandro DalcinProgramming Language :: Python
337aab42556SSatish BalayProgramming Language :: Python :: 3
33865a891e7SLisandro DalcinTopic :: Scientific/Engineering
33965a891e7SLisandro DalcinTopic :: Software Development :: Libraries
34065a891e7SLisandro Dalcin"""
34165a891e7SLisandro Dalcin
34265a891e7SLisandro Dalcinbootstrap()
3435ee53db2SLisandro Dalcinsetup(
3445ee53db2SLisandro Dalcin    name='petsc',
34565a891e7SLisandro Dalcin    version=version(),
34665a891e7SLisandro Dalcin    description=description.pop(0),
34765a891e7SLisandro Dalcin    long_description='\n'.join(description),
3485ee53db2SLisandro Dalcin    long_description_content_type='text/x-rst',
34965a891e7SLisandro Dalcin    classifiers=classifiers.split('\n')[1:-1],
35065a891e7SLisandro Dalcin    keywords = ['PETSc', 'MPI'],
35165a891e7SLisandro Dalcin    platforms=['POSIX'],
3525ee53db2SLisandro Dalcin    license='BSD-2-Clause',
35365a891e7SLisandro Dalcin
354a17b96a8SKyle Gerard Felker    url='https://petsc.org/',
35565a891e7SLisandro Dalcin    download_url=tarball(),
35665a891e7SLisandro Dalcin
35765a891e7SLisandro Dalcin    author='PETSc Team',
35899468c80SLisandro Dalcin    author_email='petsc-maint@mcs.anl.gov',
35965a891e7SLisandro Dalcin    maintainer='Lisandro Dalcin',
36065a891e7SLisandro Dalcin    maintainer_email='dalcinl@gmail.com',
36165a891e7SLisandro Dalcin
36265a891e7SLisandro Dalcin    packages=['petsc'],
3639fb7a39fSLisandro Dalcin    package_dir= {'petsc': 'config/pypi'},
3645ee53db2SLisandro Dalcin    cmdclass={
3655ee53db2SLisandro Dalcin        'install': cmd_install,
3665ee53db2SLisandro Dalcin        'bdist_wheel': cmd_bdist_wheel,
3675ee53db2SLisandro Dalcin    },
3685ee53db2SLisandro Dalcin    **metadata
3695ee53db2SLisandro Dalcin)
370