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