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