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