| Index: third_party/cython/src/setup.py
|
| diff --git a/third_party/cython/src/setup.py b/third_party/cython/src/setup.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..bcd00b5747c91be6f278b9b82ad94bf042242c72
|
| --- /dev/null
|
| +++ b/third_party/cython/src/setup.py
|
| @@ -0,0 +1,337 @@
|
| +#!/usr/bin/env python
|
| +try:
|
| + from setuptools import setup, Extension
|
| +except ImportError:
|
| + from distutils.core import setup, Extension
|
| +import os
|
| +import sys
|
| +
|
| +try:
|
| + import platform
|
| + is_cpython = not hasattr(platform, 'python_implementation') or platform.python_implementation() == 'CPython'
|
| +except (ImportError, NameError):
|
| + is_cpython = True # CPython < 2.6
|
| +
|
| +if sys.platform == "darwin":
|
| + # Don't create resource files on OS X tar.
|
| + os.environ['COPY_EXTENDED_ATTRIBUTES_DISABLE'] = 'true'
|
| + os.environ['COPYFILE_DISABLE'] = 'true'
|
| +
|
| +setup_args = {}
|
| +
|
| +def add_command_class(name, cls):
|
| + cmdclasses = setup_args.get('cmdclass', {})
|
| + cmdclasses[name] = cls
|
| + setup_args['cmdclass'] = cmdclasses
|
| +
|
| +from distutils.command.sdist import sdist as sdist_orig
|
| +class sdist(sdist_orig):
|
| + def run(self):
|
| + self.force_manifest = 1
|
| + if (sys.platform != "win32" and
|
| + os.path.isdir('.git')):
|
| + assert os.system("git rev-parse --verify HEAD > .gitrev") == 0
|
| + sdist_orig.run(self)
|
| +add_command_class('sdist', sdist)
|
| +
|
| +if sys.version_info[0] >= 3:
|
| + import lib2to3.refactor
|
| + from distutils.command.build_py \
|
| + import build_py_2to3 as build_py
|
| + # need to convert sources to Py3 on installation
|
| + fixers = [ fix for fix in lib2to3.refactor.get_fixers_from_package("lib2to3.fixes")
|
| + if fix.split('fix_')[-1] not in ('next',)
|
| + ]
|
| + build_py.fixer_names = fixers
|
| + add_command_class("build_py", build_py)
|
| +
|
| +pxd_include_dirs = [
|
| + directory for directory, dirs, files in os.walk('Cython/Includes')
|
| + if '__init__.pyx' in files or '__init__.pxd' in files
|
| + or directory == 'Cython/Includes' or directory == 'Cython/Includes/Deprecated']
|
| +
|
| +pxd_include_patterns = [
|
| + p+'/*.pxd' for p in pxd_include_dirs ] + [
|
| + p+'/*.pyx' for p in pxd_include_dirs ]
|
| +
|
| +setup_args['package_data'] = {
|
| + 'Cython.Plex' : ['*.pxd'],
|
| + 'Cython.Compiler' : ['*.pxd'],
|
| + 'Cython.Runtime' : ['*.pyx', '*.pxd'],
|
| + 'Cython.Utility' : ['*.pyx', '*.pxd', '*.c', '*.h', '*.cpp'],
|
| + 'Cython' : [ p[7:] for p in pxd_include_patterns ],
|
| + }
|
| +
|
| +# This dict is used for passing extra arguments that are setuptools
|
| +# specific to setup
|
| +setuptools_extra_args = {}
|
| +
|
| +# tells whether to include cygdb (the script and the Cython.Debugger package
|
| +include_debugger = sys.version_info[:2] > (2, 5)
|
| +
|
| +if 'setuptools' in sys.modules:
|
| + setuptools_extra_args['zip_safe'] = False
|
| + setuptools_extra_args['entry_points'] = {
|
| + 'console_scripts': [
|
| + 'cython = Cython.Compiler.Main:setuptools_main',
|
| + ]
|
| + }
|
| + scripts = []
|
| +else:
|
| + if os.name == "posix":
|
| + scripts = ["bin/cython"]
|
| + else:
|
| + scripts = ["cython.py"]
|
| +
|
| +if include_debugger:
|
| + if 'setuptools' in sys.modules:
|
| + setuptools_extra_args['entry_points']['console_scripts'].append(
|
| + 'cygdb = Cython.Debugger.Cygdb:main')
|
| + else:
|
| + if os.name == "posix":
|
| + scripts.append('bin/cygdb')
|
| + else:
|
| + scripts.append('cygdb.py')
|
| +
|
| +
|
| +def compile_cython_modules(profile=False, compile_more=False, cython_with_refnanny=False):
|
| + source_root = os.path.abspath(os.path.dirname(__file__))
|
| + compiled_modules = ["Cython.Plex.Scanners",
|
| + "Cython.Plex.Actions",
|
| + "Cython.Compiler.Lexicon",
|
| + "Cython.Compiler.Scanning",
|
| + "Cython.Compiler.Parsing",
|
| + "Cython.Compiler.Visitor",
|
| + "Cython.Compiler.FlowControl",
|
| + "Cython.Compiler.Code",
|
| + "Cython.Runtime.refnanny",
|
| + # "Cython.Compiler.FusedNode",
|
| + "Cython.Tempita._tempita",
|
| + ]
|
| + if compile_more:
|
| + compiled_modules.extend([
|
| + "Cython.Build.Dependencies",
|
| + "Cython.Compiler.ParseTreeTransforms",
|
| + "Cython.Compiler.Nodes",
|
| + "Cython.Compiler.ExprNodes",
|
| + "Cython.Compiler.ModuleNode",
|
| + "Cython.Compiler.Optimize",
|
| + ])
|
| +
|
| + defines = []
|
| + if cython_with_refnanny:
|
| + defines.append(('CYTHON_REFNANNY', '1'))
|
| +
|
| + extensions = []
|
| + if sys.version_info[0] >= 3:
|
| + from Cython.Distutils import build_ext as build_ext_orig
|
| + for module in compiled_modules:
|
| + source_file = os.path.join(source_root, *module.split('.'))
|
| + if os.path.exists(source_file + ".py"):
|
| + pyx_source_file = source_file + ".py"
|
| + else:
|
| + pyx_source_file = source_file + ".pyx"
|
| + dep_files = []
|
| + if os.path.exists(source_file + '.pxd'):
|
| + dep_files.append(source_file + '.pxd')
|
| + if '.refnanny' in module:
|
| + defines_for_module = []
|
| + else:
|
| + defines_for_module = defines
|
| + extensions.append(
|
| + Extension(module, sources = [pyx_source_file],
|
| + define_macros = defines_for_module,
|
| + depends = dep_files)
|
| + )
|
| +
|
| + class build_ext(build_ext_orig):
|
| + # we must keep the original modules alive to make sure
|
| + # their code keeps working when we remove them from
|
| + # sys.modules
|
| + dead_modules = []
|
| +
|
| + def build_extensions(self):
|
| + # add path where 2to3 installed the transformed sources
|
| + # and make sure Python (re-)imports them from there
|
| + already_imported = [ module for module in sys.modules
|
| + if module == 'Cython' or module.startswith('Cython.') ]
|
| + keep_alive = self.dead_modules.append
|
| + for module in already_imported:
|
| + keep_alive(sys.modules[module])
|
| + del sys.modules[module]
|
| + sys.path.insert(0, os.path.join(source_root, self.build_lib))
|
| +
|
| + if profile:
|
| + from Cython.Compiler.Options import directive_defaults
|
| + directive_defaults['profile'] = True
|
| + print("Enabled profiling for the Cython binary modules")
|
| + build_ext_orig.build_extensions(self)
|
| +
|
| + setup_args['ext_modules'] = extensions
|
| + add_command_class("build_ext", build_ext)
|
| +
|
| + else: # Python 2.x
|
| + from distutils.command.build_ext import build_ext as build_ext_orig
|
| + try:
|
| + class build_ext(build_ext_orig):
|
| + def build_extension(self, ext, *args, **kargs):
|
| + try:
|
| + build_ext_orig.build_extension(self, ext, *args, **kargs)
|
| + except StandardError:
|
| + print("Compilation of '%s' failed" % ext.sources[0])
|
| + from Cython.Compiler.Main import compile
|
| + from Cython import Utils
|
| + if profile:
|
| + from Cython.Compiler.Options import directive_defaults
|
| + directive_defaults['profile'] = True
|
| + print("Enabled profiling for the Cython binary modules")
|
| + source_root = os.path.dirname(__file__)
|
| + for module in compiled_modules:
|
| + source_file = os.path.join(source_root, *module.split('.'))
|
| + if os.path.exists(source_file + ".py"):
|
| + pyx_source_file = source_file + ".py"
|
| + else:
|
| + pyx_source_file = source_file + ".pyx"
|
| + c_source_file = source_file + ".c"
|
| + source_is_newer = False
|
| + if not os.path.exists(c_source_file):
|
| + source_is_newer = True
|
| + else:
|
| + c_last_modified = Utils.modification_time(c_source_file)
|
| + if Utils.file_newer_than(pyx_source_file, c_last_modified):
|
| + source_is_newer = True
|
| + else:
|
| + pxd_source_file = source_file + ".pxd"
|
| + if os.path.exists(pxd_source_file) and Utils.file_newer_than(pxd_source_file, c_last_modified):
|
| + source_is_newer = True
|
| + if source_is_newer:
|
| + print("Compiling module %s ..." % module)
|
| + result = compile(pyx_source_file)
|
| + c_source_file = result.c_file
|
| + if c_source_file:
|
| + # Py2 distutils can't handle unicode file paths
|
| + if isinstance(c_source_file, unicode):
|
| + filename_encoding = sys.getfilesystemencoding()
|
| + if filename_encoding is None:
|
| + filename_encoding = sys.getdefaultencoding()
|
| + c_source_file = c_source_file.encode(filename_encoding)
|
| + if '.refnanny' in module:
|
| + defines_for_module = []
|
| + else:
|
| + defines_for_module = defines
|
| + extensions.append(
|
| + Extension(module, sources = [c_source_file],
|
| + define_macros = defines_for_module)
|
| + )
|
| + else:
|
| + print("Compilation failed")
|
| + if extensions:
|
| + setup_args['ext_modules'] = extensions
|
| + add_command_class("build_ext", build_ext)
|
| + except Exception:
|
| + print('''
|
| +ERROR: %s
|
| +
|
| +Extension module compilation failed, looks like Cython cannot run
|
| +properly on this system. To work around this, pass the option
|
| +"--no-cython-compile". This will install a pure Python version of
|
| +Cython without compiling its own sources.
|
| +''' % sys.exc_info()[1])
|
| + raise
|
| +
|
| +cython_profile = '--cython-profile' in sys.argv
|
| +if cython_profile:
|
| + sys.argv.remove('--cython-profile')
|
| +
|
| +try:
|
| + sys.argv.remove("--cython-compile-all")
|
| + cython_compile_more = True
|
| +except ValueError:
|
| + cython_compile_more = False
|
| +
|
| +try:
|
| + sys.argv.remove("--cython-with-refnanny")
|
| + cython_with_refnanny = True
|
| +except ValueError:
|
| + cython_with_refnanny = False
|
| +
|
| +try:
|
| + sys.argv.remove("--no-cython-compile")
|
| + compile_cython_itself = False
|
| +except ValueError:
|
| + compile_cython_itself = True
|
| +
|
| +if compile_cython_itself and (is_cpython or cython_compile_more):
|
| + compile_cython_modules(cython_profile, cython_compile_more, cython_with_refnanny)
|
| +
|
| +setup_args.update(setuptools_extra_args)
|
| +
|
| +from Cython import __version__ as version
|
| +
|
| +packages = [
|
| + 'Cython',
|
| + 'Cython.Build',
|
| + 'Cython.Compiler',
|
| + 'Cython.Runtime',
|
| + 'Cython.Distutils',
|
| + 'Cython.Plex',
|
| + 'Cython.Tests',
|
| + 'Cython.Build.Tests',
|
| + 'Cython.Compiler.Tests',
|
| + 'Cython.Utility',
|
| + 'Cython.Tempita',
|
| + 'pyximport',
|
| +]
|
| +
|
| +if include_debugger:
|
| + packages.append('Cython.Debugger')
|
| + packages.append('Cython.Debugger.Tests')
|
| + # it's enough to do this for Py2.5+:
|
| + setup_args['package_data']['Cython.Debugger.Tests'] = ['codefile', 'cfuncs.c']
|
| +
|
| +setup(
|
| + name = 'Cython',
|
| + version = version,
|
| + url = 'http://www.cython.org',
|
| + author = 'Robert Bradshaw, Stefan Behnel, Dag Seljebotn, Greg Ewing, et al.',
|
| + author_email = 'cython-devel@python.org',
|
| + description = "The Cython compiler for writing C extensions for the Python language.",
|
| + long_description = """\
|
| + The Cython language makes writing C extensions for the Python language as
|
| + easy as Python itself. Cython is a source code translator based on the
|
| + well-known Pyrex_, but supports more cutting edge functionality and
|
| + optimizations.
|
| +
|
| + The Cython language is very close to the Python language (and most Python
|
| + code is also valid Cython code), but Cython additionally supports calling C
|
| + functions and declaring C types on variables and class attributes. This
|
| + allows the compiler to generate very efficient C code from Cython code.
|
| +
|
| + This makes Cython the ideal language for writing glue code for external C
|
| + libraries, and for fast C modules that speed up the execution of Python
|
| + code.
|
| +
|
| + .. _Pyrex: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
|
| + """,
|
| + classifiers = [
|
| + "Development Status :: 5 - Production/Stable",
|
| + "Intended Audience :: Developers",
|
| + "License :: OSI Approved :: Apache Software License",
|
| + "Operating System :: OS Independent",
|
| + "Programming Language :: Python",
|
| + "Programming Language :: Python :: 2",
|
| + "Programming Language :: Python :: 3",
|
| + "Programming Language :: C",
|
| + "Programming Language :: Cython",
|
| + "Topic :: Software Development :: Code Generators",
|
| + "Topic :: Software Development :: Compilers",
|
| + "Topic :: Software Development :: Libraries :: Python Modules"
|
| + ],
|
| +
|
| + scripts = scripts,
|
| + packages=packages,
|
| +
|
| + py_modules = ["cython"],
|
| +
|
| + **setup_args
|
| + )
|
|
|