xref: /petsc/src/binding/petsc4py/setup.py (revision fb83dddadea1072c893d178467655cbacad931ac)
15808f684SSatish Balay#!/usr/bin/env python
25808f684SSatish Balay# Author:  Lisandro Dalcin
35808f684SSatish Balay# Contact: dalcinl@gmail.com
45808f684SSatish Balay
55808f684SSatish Balay"""
65808f684SSatish BalayPETSc for Python
75808f684SSatish Balay"""
85808f684SSatish Balay
95808f684SSatish Balayimport re
10*fb83dddaSLisandro Dalcinimport os
11*fb83dddaSLisandro Dalcinimport sys
125808f684SSatish Balay
135808f684SSatish Balaytry:
145808f684SSatish Balay    import setuptools
155808f684SSatish Balayexcept ImportError:
165808f684SSatish Balay    setuptools = None
175808f684SSatish Balay
185808f684SSatish Balaypyver = sys.version_info[:2]
191e83877aSSatish Balayif pyver < (2, 6) or (3, 0) <= pyver < (3, 2):
201e83877aSSatish Balay    raise RuntimeError("Python version 2.6, 2.7 or >= 3.2 required")
211e83877aSSatish Balayif pyver == (2, 6) or pyver == (3, 2):
221e83877aSSatish Balay    sys.stderr.write(
231e83877aSSatish Balay        "WARNING: Python %d.%d is not supported.\n" % pyver)
241e83877aSSatish Balay
25*fb83dddaSLisandro Dalcin# python-3.11+ requires cython 0.29.32+
26*fb83dddaSLisandro Dalcinif pyver >= (3, 11):
27*fb83dddaSLisandro Dalcin  CYTHON = '0.29.32'
28*fb83dddaSLisandro Dalcinelse:
29*fb83dddaSLisandro Dalcin  CYTHON = '0.24'
30*fb83dddaSLisandro Dalcin
315808f684SSatish Balay# --------------------------------------------------------------------
325808f684SSatish Balay# Metadata
335808f684SSatish Balay# --------------------------------------------------------------------
345808f684SSatish Balay
355808f684SSatish Balaytopdir = os.path.abspath(os.path.dirname(__file__))
36a9c71d45SLisandro Dalcinsys.path.insert(0, topdir)
375808f684SSatish Balay
385808f684SSatish Balaydef name():
395808f684SSatish Balay    return 'petsc4py'
405808f684SSatish Balay
415808f684SSatish Balaydef version():
425808f684SSatish Balay    with open(os.path.join(topdir, 'src', '__init__.py')) as f:
435808f684SSatish Balay        m = re.search(r"__version__\s*=\s*'(.*)'", f.read())
445808f684SSatish Balay        return m.groups()[0]
455808f684SSatish Balay
465808f684SSatish Balaydef description():
47*fb83dddaSLisandro Dalcin    return __doc__.strip()
48*fb83dddaSLisandro Dalcin
49*fb83dddaSLisandro Dalcindef long_description():
505808f684SSatish Balay    with open(os.path.join(topdir, 'DESCRIPTION.rst')) as f:
515808f684SSatish Balay        return f.read()
525808f684SSatish Balay
535808f684SSatish Balayname     = name()
545808f684SSatish Balayversion  = version()
555808f684SSatish Balay
56eaf87d4bSBarry Smithurl      = 'https://gitlab.com/petsc/petsc'
575808f684SSatish Balaypypiroot = 'https://pypi.io/packages/source/%s/%s/' % (name[0], name)
585808f684SSatish Balaydownload = pypiroot + '%(name)s-%(version)s.tar.gz' % vars()
595808f684SSatish Balay
60*fb83dddaSLisandro Dalcinclassifiers = """
61*fb83dddaSLisandro DalcinLicense :: OSI Approved :: BSD License
62*fb83dddaSLisandro DalcinOperating System :: POSIX
63*fb83dddaSLisandro DalcinIntended Audience :: Developers
64*fb83dddaSLisandro DalcinIntended Audience :: Science/Research
65*fb83dddaSLisandro DalcinProgramming Language :: C
66*fb83dddaSLisandro DalcinProgramming Language :: C++
67*fb83dddaSLisandro DalcinProgramming Language :: Cython
68*fb83dddaSLisandro DalcinProgramming Language :: Python
69*fb83dddaSLisandro DalcinProgramming Language :: Python :: 2
70*fb83dddaSLisandro DalcinProgramming Language :: Python :: 3
71*fb83dddaSLisandro DalcinProgramming Language :: Python :: Implementation :: CPython
72*fb83dddaSLisandro DalcinTopic :: Scientific/Engineering
73*fb83dddaSLisandro DalcinTopic :: Software Development :: Libraries :: Python Modules
74*fb83dddaSLisandro DalcinDevelopment Status :: 5 - Production/Stable
75*fb83dddaSLisandro Dalcin"""
765808f684SSatish Balay
77*fb83dddaSLisandro Dalcinkeywords = """
78*fb83dddaSLisandro Dalcinscientific computing
79*fb83dddaSLisandro Dalcinparallel computing
80*fb83dddaSLisandro DalcinPETSc
81*fb83dddaSLisandro DalcinMPI
82*fb83dddaSLisandro Dalcin"""
835808f684SSatish Balay
84*fb83dddaSLisandro Dalcinplatforms = """
85*fb83dddaSLisandro DalcinPOSIX
86*fb83dddaSLisandro DalcinLinux
87*fb83dddaSLisandro DalcinmacOS
88*fb83dddaSLisandro DalcinFreeBSD
89*fb83dddaSLisandro Dalcin"""
90*fb83dddaSLisandro Dalcin
91*fb83dddaSLisandro Dalcinmetadata = {
92*fb83dddaSLisandro Dalcin    'name'             : name,
93*fb83dddaSLisandro Dalcin    'version'          : version,
94*fb83dddaSLisandro Dalcin    'description'      : description(),
95*fb83dddaSLisandro Dalcin    'long_description' : long_description(),
96*fb83dddaSLisandro Dalcin    'url'              : url,
97*fb83dddaSLisandro Dalcin    'download_url'     : download,
98*fb83dddaSLisandro Dalcin    'classifiers'      : classifiers.strip().split('\n'),
99*fb83dddaSLisandro Dalcin    'keywords'         : keywords.strip().split('\n'),
100*fb83dddaSLisandro Dalcin    'license'          : 'BSD-2-Clause',
101*fb83dddaSLisandro Dalcin    'platforms'        : platforms.split('\n'),
102*fb83dddaSLisandro Dalcin    'author'           : 'Lisandro Dalcin',
103*fb83dddaSLisandro Dalcin    'author_email'     : 'dalcinl@gmail.com',
104*fb83dddaSLisandro Dalcin    'maintainer'       : 'PETSc Team',
105*fb83dddaSLisandro Dalcin    'maintainer_email' : 'petsc-maint@mcs.anl.gov',
106*fb83dddaSLisandro Dalcin}
107*fb83dddaSLisandro Dalcinmetadata.update({
108*fb83dddaSLisandro Dalcin    'requires': ['numpy'],
109*fb83dddaSLisandro Dalcin})
110*fb83dddaSLisandro Dalcin
111*fb83dddaSLisandro Dalcinmetadata_extra = {
112*fb83dddaSLisandro Dalcin    'long_description_content_type': 'text/rst',
113*fb83dddaSLisandro Dalcin}
1145808f684SSatish Balay
1155808f684SSatish Balay# --------------------------------------------------------------------
1165808f684SSatish Balay# Extension modules
1175808f684SSatish Balay# --------------------------------------------------------------------
1185808f684SSatish Balay
119*fb83dddaSLisandro Dalcindef extensions():
1208885bf16SLisandro Dalcin    from os import walk
1215808f684SSatish Balay    from glob import glob
1228885bf16SLisandro Dalcin    from os.path import join
1238885bf16SLisandro Dalcin    glob_join = lambda *args: glob(join(*args))
1245808f684SSatish Balay    depends = []
1255808f684SSatish Balay    for pth, dirs, files in walk('src'):
1268885bf16SLisandro Dalcin        depends += glob_join(pth, '*.h')
1278885bf16SLisandro Dalcin        depends += glob_join(pth, '*.c')
1288885bf16SLisandro Dalcin    if 'PETSC_DIR' in os.environ:
1298885bf16SLisandro Dalcin        pd = os.environ['PETSC_DIR']
1308885bf16SLisandro Dalcin        pa = os.environ.get('PETSC_ARCH', '')
1318885bf16SLisandro Dalcin        depends += glob_join(pd, 'include', '*.h')
1328885bf16SLisandro Dalcin        depends += glob_join(pd, 'include', 'petsc', 'private', '*.h')
1338885bf16SLisandro Dalcin        depends += glob_join(pd, pa, 'include', 'petscconf.h')
1340f51ee0fSAlexei Colin    numpy_include = os.environ.get('NUMPY_INCLUDE')
1350f51ee0fSAlexei Colin    if numpy_include is not None:
1360f51ee0fSAlexei Colin        numpy_includes = [numpy_include]
1370f51ee0fSAlexei Colin    else:
1385808f684SSatish Balay        try:
1395808f684SSatish Balay            import numpy
1405808f684SSatish Balay            numpy_includes = [numpy.get_include()]
1415808f684SSatish Balay        except ImportError:
1425808f684SSatish Balay            numpy_includes = []
143*fb83dddaSLisandro Dalcin    PETSc = dict(
144*fb83dddaSLisandro Dalcin        name='petsc4py.lib.PETSc',
145*fb83dddaSLisandro Dalcin        sources=['src/PETSc.c'],
146*fb83dddaSLisandro Dalcin        depends=depends,
147*fb83dddaSLisandro Dalcin        include_dirs=[
148*fb83dddaSLisandro Dalcin            'src/include',
1495808f684SSatish Balay        ] + numpy_includes,
150*fb83dddaSLisandro Dalcin        define_macros=[
151*fb83dddaSLisandro Dalcin            ('MPICH_SKIP_MPICXX', 1),
152*fb83dddaSLisandro Dalcin            ('OMPI_SKIP_MPICXX', 1),
153*fb83dddaSLisandro Dalcin        ],
154*fb83dddaSLisandro Dalcin    )
155*fb83dddaSLisandro Dalcin    return [PETSc]
1565808f684SSatish Balay
1575808f684SSatish Balay# --------------------------------------------------------------------
1585808f684SSatish Balay# Setup
1595808f684SSatish Balay# --------------------------------------------------------------------
1605808f684SSatish Balay
1615808f684SSatish Balayfrom conf.petscconf import setup, Extension
1625808f684SSatish Balayfrom conf.petscconf import config, build, build_src, build_ext, install
163*fb83dddaSLisandro Dalcinfrom conf.petscconf import clean, sdist
1645808f684SSatish Balay
165f8c80548SLisandro Dalcindef get_release():
166f8c80548SLisandro Dalcin    release = 1
167f8c80548SLisandro Dalcin    if topdir.endswith(os.path.join(os.path.sep, 'src', 'binding', name)):
168f8c80548SLisandro Dalcin        topname = name.replace('4py', '')
169f8c80548SLisandro Dalcin        rootdir = os.path.abspath(os.path.join(topdir, *[os.path.pardir]*3))
170f8c80548SLisandro Dalcin        version_h = os.path.join(rootdir, 'include', '%sversion.h' % topname)
171f8c80548SLisandro Dalcin        release_macro = '%s_VERSION_RELEASE' % topname.upper()
172f8c80548SLisandro Dalcin        version_re = re.compile(r"#define\s+%s\s+([-]*\d+)" % release_macro)
173f8c80548SLisandro Dalcin        if os.path.exists(version_h) and os.path.isfile(version_h):
174f8c80548SLisandro Dalcin            with open(version_h, 'r') as f:
175f8c80548SLisandro Dalcin                release = int(version_re.search(f.read()).groups()[0])
176f8c80548SLisandro Dalcin    return bool(release)
177f8c80548SLisandro Dalcin
178f8c80548SLisandro Dalcindef requires(pkgname, major, minor, release=True):
179f8c80548SLisandro Dalcin    minor = minor + int(not release)
180f8c80548SLisandro Dalcin    devel = '' if release else '.dev0'
181f8c80548SLisandro Dalcin    vmin = "%s.%s%s" % (major, minor, devel)
182f8c80548SLisandro Dalcin    vmax = "%s.%s" % (major, minor + 1)
183f8c80548SLisandro Dalcin    return "%s>=%s,<%s" % (pkgname, vmin, vmax)
184f8c80548SLisandro Dalcin
1855808f684SSatish Balaydef run_setup():
1865808f684SSatish Balay    setup_args = metadata.copy()
187f8c80548SLisandro Dalcin    vstr = setup_args['version'].split('.')[:2]
188f8c80548SLisandro Dalcin    x, y = tuple(map(int, vstr))
189f8c80548SLisandro Dalcin    release = get_release()
190f8c80548SLisandro Dalcin    if not release:
191f8c80548SLisandro Dalcin        setup_args['version'] = "%d.%d.0.dev0" %(x, y+1)
1925808f684SSatish Balay    if setuptools:
1935808f684SSatish Balay        setup_args['zip_safe'] = False
1945808f684SSatish Balay        setup_args['install_requires'] = ['numpy']
1955808f684SSatish Balay        PETSC_DIR = os.environ.get('PETSC_DIR')
1965808f684SSatish Balay        if not (PETSC_DIR and os.path.isdir(PETSC_DIR)):
197f8c80548SLisandro Dalcin            petsc = requires('petsc', x, y, release)
198f8c80548SLisandro Dalcin            setup_args['install_requires'] += [petsc]
199*fb83dddaSLisandro Dalcin        setup_args.update(metadata_extra)
2005808f684SSatish Balay    if setuptools:
2015808f684SSatish Balay        src = os.path.join('src', 'petsc4py.PETSc.c')
2025808f684SSatish Balay        has_src = os.path.exists(os.path.join(topdir, src))
2035808f684SSatish Balay        has_git = os.path.isdir(os.path.join(topdir, '.git'))
2045808f684SSatish Balay        has_hg  = os.path.isdir(os.path.join(topdir, '.hg'))
2053594a89dSLisandro Dalcin        suffix = os.path.join('src', 'binding', 'petsc4py')
2063594a89dSLisandro Dalcin        in_petsc = topdir.endswith(os.path.sep + suffix)
2073594a89dSLisandro Dalcin        if not has_src or has_git or has_hg or in_petsc:
2085808f684SSatish Balay            setup_args['setup_requires'] = ['Cython>='+CYTHON]
2095808f684SSatish Balay    #
210*fb83dddaSLisandro Dalcin    setup(
211*fb83dddaSLisandro Dalcin        packages=[
212*fb83dddaSLisandro Dalcin            'petsc4py',
213*fb83dddaSLisandro Dalcin            'petsc4py.lib',
214*fb83dddaSLisandro Dalcin        ],
215*fb83dddaSLisandro Dalcin        package_dir={
216*fb83dddaSLisandro Dalcin            'petsc4py'     : 'src',
217*fb83dddaSLisandro Dalcin            'petsc4py.lib' : 'src/lib',
218*fb83dddaSLisandro Dalcin        },
219*fb83dddaSLisandro Dalcin        package_data={
220*fb83dddaSLisandro Dalcin            'petsc4py': [
221*fb83dddaSLisandro Dalcin                'include/petsc4py/*.h',
2225808f684SSatish Balay                'include/petsc4py/*.i',
2235808f684SSatish Balay                'include/petsc4py/*.pxd',
2245808f684SSatish Balay                'include/petsc4py/*.pxi',
2255808f684SSatish Balay                'include/petsc4py/*.pyx',
226*fb83dddaSLisandro Dalcin                'PETSc.pxd',
227*fb83dddaSLisandro Dalcin            ],
228*fb83dddaSLisandro Dalcin            'petsc4py.lib': [
229*fb83dddaSLisandro Dalcin                'petsc.cfg',
230*fb83dddaSLisandro Dalcin            ],
231*fb83dddaSLisandro Dalcin        },
232*fb83dddaSLisandro Dalcin        ext_modules=[Extension(**ext) for ext in extensions()],
233*fb83dddaSLisandro Dalcin        cmdclass={
234*fb83dddaSLisandro Dalcin            'config':     config,
2355808f684SSatish Balay            'build':      build,
2365808f684SSatish Balay            'build_src':  build_src,
2375808f684SSatish Balay            'build_ext':  build_ext,
2385808f684SSatish Balay            'install':    install,
2395808f684SSatish Balay            'clean':      clean,
2405808f684SSatish Balay            'sdist':      sdist,
2415808f684SSatish Balay        },
242*fb83dddaSLisandro Dalcin        **setup_args,
243*fb83dddaSLisandro Dalcin    )
2445808f684SSatish Balay
245*fb83dddaSLisandro Dalcin# --------------------------------------------------------------------
246*fb83dddaSLisandro Dalcin
247*fb83dddaSLisandro Dalcindef cython_req():
248*fb83dddaSLisandro Dalcin    return CYTHON
249*fb83dddaSLisandro Dalcin
250*fb83dddaSLisandro Dalcindef cython_chk(VERSION, verbose=True):
251*fb83dddaSLisandro Dalcin    from conf.baseconf import log
252*fb83dddaSLisandro Dalcin    from conf.baseconf import Version
253*fb83dddaSLisandro Dalcin    from conf.baseconf import LegacyVersion
254*fb83dddaSLisandro Dalcin    if verbose:
2555808f684SSatish Balay        warn = lambda msg='': sys.stderr.write(msg+'\n')
256*fb83dddaSLisandro Dalcin    else:
257*fb83dddaSLisandro Dalcin        warn = lambda msg='': None
2585808f684SSatish Balay    #
2595808f684SSatish Balay    try:
2605808f684SSatish Balay        import Cython
2615808f684SSatish Balay    except ImportError:
2625808f684SSatish Balay        warn("*"*80)
2635808f684SSatish Balay        warn()
264*fb83dddaSLisandro Dalcin        warn(" You need Cython to generate C source files.\n")
265*fb83dddaSLisandro Dalcin        warn("   $ python -m pip install cython")
2665808f684SSatish Balay        warn()
2675808f684SSatish Balay        warn("*"*80)
2685808f684SSatish Balay        return False
2695808f684SSatish Balay    #
2705808f684SSatish Balay    REQUIRED = VERSION
271*fb83dddaSLisandro Dalcin    CYTHON_VERSION = Cython.__version__
272*fb83dddaSLisandro Dalcin    if VERSION is not None:
2735808f684SSatish Balay        m = re.match(r"(\d+\.\d+(?:\.\d+)?).*", CYTHON_VERSION)
2745808f684SSatish Balay        if m:
275*fb83dddaSLisandro Dalcin            REQUIRED  = Version(VERSION)
276*fb83dddaSLisandro Dalcin            AVAILABLE = Version(m.groups()[0])
2775808f684SSatish Balay        else:
278*fb83dddaSLisandro Dalcin            REQUIRED  = LegacyVersion(VERSION)
279*fb83dddaSLisandro Dalcin            AVAILABLE = LegacyVersion(CYTHON_VERSION)
280*fb83dddaSLisandro Dalcin        if AVAILABLE < REQUIRED:
2815808f684SSatish Balay            warn("*"*80)
2825808f684SSatish Balay            warn()
283*fb83dddaSLisandro Dalcin            warn(" You need Cython >= {0} (you have version {1}).\n"
284*fb83dddaSLisandro Dalcin                 .format(REQUIRED, CYTHON_VERSION))
285*fb83dddaSLisandro Dalcin            warn("   $ python -m pip install --upgrade cython")
2865808f684SSatish Balay            warn()
2875808f684SSatish Balay            warn("*"*80)
2885808f684SSatish Balay            return False
2895808f684SSatish Balay    #
290*fb83dddaSLisandro Dalcin    if verbose:
291*fb83dddaSLisandro Dalcin        log.info("using Cython version %s" % CYTHON_VERSION)
2925808f684SSatish Balay    return True
2935808f684SSatish Balay
294*fb83dddaSLisandro Dalcindef cython_run(
295*fb83dddaSLisandro Dalcin    source, target=None,
296a9c71d45SLisandro Dalcin    depends=(), includes=(),
2975808f684SSatish Balay    destdir_c=None, destdir_h=None,
298*fb83dddaSLisandro Dalcin    workdir=None, force=False,
299*fb83dddaSLisandro Dalcin    VERSION=None,
300*fb83dddaSLisandro Dalcin):
3015808f684SSatish Balay    from glob import glob
302*fb83dddaSLisandro Dalcin    from conf.baseconf import log
303*fb83dddaSLisandro Dalcin    from conf.baseconf import dep_util
304*fb83dddaSLisandro Dalcin    from conf.baseconf import DistutilsError
305a9c71d45SLisandro Dalcin    if target is None:
3065808f684SSatish Balay        target = os.path.splitext(source)[0]+'.c'
3075808f684SSatish Balay    cwd = os.getcwd()
3085808f684SSatish Balay    try:
309*fb83dddaSLisandro Dalcin        if workdir:
310*fb83dddaSLisandro Dalcin            os.chdir(workdir)
3115808f684SSatish Balay        alldeps = [source]
3125808f684SSatish Balay        for dep in depends:
3135808f684SSatish Balay            alldeps += glob(dep)
3145808f684SSatish Balay        if not (force or dep_util.newer_group(alldeps, target)):
3155808f684SSatish Balay            log.debug("skipping '%s' -> '%s' (up-to-date)",
3165808f684SSatish Balay                      source, target)
3175808f684SSatish Balay            return
3185808f684SSatish Balay    finally:
3195808f684SSatish Balay        os.chdir(cwd)
320*fb83dddaSLisandro Dalcin    #
321*fb83dddaSLisandro Dalcin    require = 'Cython'
322*fb83dddaSLisandro Dalcin    if VERSION is not None:
323*fb83dddaSLisandro Dalcin        require += '>=%s' % VERSION
324*fb83dddaSLisandro Dalcin    if not cython_chk(VERSION, verbose=False):
325*fb83dddaSLisandro Dalcin        pkgname = re.compile(r'cython(\.|$)', re.IGNORECASE)
326*fb83dddaSLisandro Dalcin        for modname in list(sys.modules.keys()):
327*fb83dddaSLisandro Dalcin            if pkgname.match(modname):
328*fb83dddaSLisandro Dalcin                del sys.modules[modname]
329*fb83dddaSLisandro Dalcin        try:
330*fb83dddaSLisandro Dalcin            import warnings
331*fb83dddaSLisandro Dalcin            import setuptools
332*fb83dddaSLisandro Dalcin            install_setup_requires = setuptools._install_setup_requires
333*fb83dddaSLisandro Dalcin            with warnings.catch_warnings():
334*fb83dddaSLisandro Dalcin                category = setuptools.SetuptoolsDeprecationWarning
335*fb83dddaSLisandro Dalcin                warnings.simplefilter('ignore', category)
336*fb83dddaSLisandro Dalcin                log.info("fetching build requirement %s" % require)
337*fb83dddaSLisandro Dalcin                install_setup_requires(dict(setup_requires=[require]))
338*fb83dddaSLisandro Dalcin        except Exception:
339*fb83dddaSLisandro Dalcin            log.info("failed to fetch build requirement %s" % require)
340*fb83dddaSLisandro Dalcin    if not cython_chk(VERSION):
3415808f684SSatish Balay        raise DistutilsError("requires Cython>=%s" % VERSION)
342*fb83dddaSLisandro Dalcin    #
3435808f684SSatish Balay    log.info("cythonizing '%s' -> '%s'", source, target)
3445808f684SSatish Balay    from conf.cythonize import cythonize
345*fb83dddaSLisandro Dalcin    err = cythonize(
346*fb83dddaSLisandro Dalcin        source, target,
3475808f684SSatish Balay        includes=includes,
3485808f684SSatish Balay        destdir_c=destdir_c,
3495808f684SSatish Balay        destdir_h=destdir_h,
350*fb83dddaSLisandro Dalcin        workdir=workdir,
351*fb83dddaSLisandro Dalcin    )
3525808f684SSatish Balay    if err:
3535808f684SSatish Balay        raise DistutilsError(
3545808f684SSatish Balay            "Cython failure: '%s' -> '%s'" % (source, target))
3555808f684SSatish Balay
3565808f684SSatish Balaydef build_sources(cmd):
3575808f684SSatish Balay    from os.path import exists, isdir, join
3585808f684SSatish Balay    # petsc4py.PETSc
3595808f684SSatish Balay    source = 'petsc4py.PETSc.pyx'
360a9c71d45SLisandro Dalcin    target = 'petsc4py.PETSc.c'
361*fb83dddaSLisandro Dalcin    depends = [
362*fb83dddaSLisandro Dalcin        'include/*/*.pxd',
3635808f684SSatish Balay        'PETSc/*.pyx',
364*fb83dddaSLisandro Dalcin        'PETSc/*.pxi',
365*fb83dddaSLisandro Dalcin    ]
3665808f684SSatish Balay    includes = ['include']
3675808f684SSatish Balay    destdir_h = os.path.join('include', 'petsc4py')
368*fb83dddaSLisandro Dalcin    cython_run(
369*fb83dddaSLisandro Dalcin        source, target,
370*fb83dddaSLisandro Dalcin        depends=depends,
371*fb83dddaSLisandro Dalcin        includes=includes,
372*fb83dddaSLisandro Dalcin        destdir_c=None,
373*fb83dddaSLisandro Dalcin        destdir_h=destdir_h,
374*fb83dddaSLisandro Dalcin        workdir='src',
375*fb83dddaSLisandro Dalcin        force=cmd.force,
376*fb83dddaSLisandro Dalcin        VERSION=cython_req(),
377*fb83dddaSLisandro Dalcin    )
3785808f684SSatish Balay
3795808f684SSatish Balaybuild_src.run = build_sources
3805808f684SSatish Balay
3815808f684SSatish Balay# --------------------------------------------------------------------
3825808f684SSatish Balay
3835808f684SSatish Balaydef main():
3845808f684SSatish Balay    run_setup()
3855808f684SSatish Balay
3865808f684SSatish Balayif __name__ == '__main__':
3875808f684SSatish Balay    main()
3885808f684SSatish Balay
3895808f684SSatish Balay# --------------------------------------------------------------------
390