1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
""" Build ``cytoolz`` with or without Cython.
By default, CyToolz will be built using Cython if available.
If Cython is not available, then the default C compiler will be used
to compile the distributed *.c files instead.
Pass "--cython" or "--with-cython" as a command line argument to setup.py to
force the project to build using Cython (and fail if Cython is unavailable).
Pass "--no-cython" or "--without-cython" to disable usage of Cython.
For convenience, developmental versions (with 'dev' in the version number)
automatically use Cython unless disabled via a command line argument.
To summarize differently, the rules are as follows (apply first applicable rule):
1. If `--no-cython` or `--without-cython` are used, then only build from `.*c` files.
2. If this is a dev version, then cythonize only the files that have changed.
3. If `--cython` or `--with-cython` are used, then force cythonize all files.
4. If no arguments are passed, then force cythonize all files if Cython is available,
else build from `*.c` files. This is default when installing via pip.
By forcing cythonization of all files (except in dev) if Cython is available,
we avoid the case where the generated `*.c` files are not forward-compatible.
"""
import os
import sys
from setuptools import setup, Extension
try:
import Cython
from Cython.Build import cythonize
has_cython = True
except ImportError:
has_cython = False
try:
from setuptools_git_versioning import get_version
version = get_version(
{
'dev_template': '{tag}+{ccount}.g{sha}',
'dirty_template': '{tag}+{ccount}.g{sha}.dirty',
}
)
is_dev = '+' in str(version)
except ModuleNotFoundError:
is_dev = True
use_cython = True
strict_cython = is_dev or os.environ.get('CIBUILDWHEEL', '0') != '1'
if '--no-cython' in sys.argv:
use_cython = False
sys.argv.remove('--no-cython')
if '--without-cython' in sys.argv:
use_cython = False
sys.argv.remove('--without-cython')
if '--cython' in sys.argv:
strict_cython = True
sys.argv.remove('--cython')
if '--with-cython' in sys.argv:
strict_cython = True
sys.argv.remove('--with-cython')
if use_cython and not has_cython:
if strict_cython:
raise RuntimeError('Cython required to build dev version of cytoolz.')
print('ALERT: Cython not installed. Building without Cython.')
use_cython = False
if use_cython:
suffix = '.pyx'
else:
suffix = '.c'
ext_modules = []
for modname in ['dicttoolz', 'functoolz', 'itertoolz', 'recipes', 'utils']:
ext_modules.append(Extension('cytoolz.' + modname.replace('/', '.'),
['cytoolz/' + modname + suffix]))
if use_cython and "clean" not in sys.argv:
try:
from Cython.Compiler.Options import get_directive_defaults
directive_defaults = get_directive_defaults()
except ImportError:
# for Cython < 0.25
from Cython.Compiler.Options import directive_defaults
directive_defaults['embedsignature'] = True
directive_defaults['binding'] = True
directive_defaults['language_level'] = '3'
if Cython.__version__ >= '3.1':
# This is experimental! Use at your own risk (and please let us know of issues)
directive_defaults['freethreading_compatible'] = True
# The distributed *.c files may not be forward compatible.
# If we are cythonizing a non-dev version, then force everything to cythonize.
ext_modules = cythonize(ext_modules, force=not is_dev)
setup(ext_modules=ext_modules)
|