| import sys |
| import os |
|
|
| |
| |
| |
|
|
| |
| _build_ext_module = sys.modules.get('setuptools.command.build_ext') |
| if _build_ext_module is None: |
| try: |
| import distutils.command.build_ext as _build_ext_module |
| except ImportError: |
| |
| try: |
| import setuptools.command.build_ext as _build_ext_module |
| except ImportError: |
| raise ImportError("'distutils' cannot be imported. Please install setuptools.") |
|
|
|
|
| |
| _build_ext = getattr(_build_ext_module, '_du_build_ext', None) |
| if _build_ext is None: |
| _build_ext = getattr(_build_ext_module, 'build_ext', None) |
| if _build_ext is None: |
| from distutils.command.build_ext import build_ext as _build_ext |
|
|
|
|
| class build_ext(_build_ext): |
|
|
| user_options = _build_ext.user_options + [ |
| ('cython-cplus', None, |
| "generate C++ source files"), |
| ('cython-create-listing', None, |
| "write errors to a listing file"), |
| ('cython-line-directives', None, |
| "emit source line directives"), |
| ('cython-include-dirs=', None, |
| "path to the Cython include files" + _build_ext.sep_by), |
| ('cython-c-in-temp', None, |
| "put generated C files in temp directory"), |
| ('cython-gen-pxi', None, |
| "generate .pxi file for public declarations"), |
| ('cython-directives=', None, |
| "compiler directive overrides"), |
| ('cython-gdb', None, |
| "generate debug information for cygdb"), |
| ('cython-compile-time-env', None, |
| "cython compile time environment"), |
| ] |
|
|
| boolean_options = _build_ext.boolean_options + [ |
| 'cython-cplus', 'cython-create-listing', 'cython-line-directives', |
| 'cython-c-in-temp', 'cython-gdb', |
| ] |
|
|
| def initialize_options(self): |
| super().initialize_options() |
| self.cython_cplus = 0 |
| self.cython_create_listing = 0 |
| self.cython_line_directives = 0 |
| self.cython_include_dirs = None |
| self.cython_directives = None |
| self.cython_c_in_temp = 0 |
| self.cython_gen_pxi = 0 |
| self.cython_gdb = False |
| self.cython_compile_time_env = None |
| self.shared_utility_qualified_name = None |
|
|
| def finalize_options(self): |
| super().finalize_options() |
| if self.cython_include_dirs is None: |
| self.cython_include_dirs = [] |
| elif isinstance(self.cython_include_dirs, str): |
| self.cython_include_dirs = \ |
| self.cython_include_dirs.split(os.pathsep) |
| if self.cython_directives is None: |
| self.cython_directives = {} |
|
|
| def get_extension_attr(self, extension, option_name, default=False): |
| return getattr(self, option_name) or getattr(extension, option_name, default) |
|
|
| def build_extension(self, ext): |
| from Cython.Build.Dependencies import cythonize |
|
|
| |
| |
| |
| |
| |
| includes = list(self.cython_include_dirs) |
| for include_dir in getattr(ext, 'cython_include_dirs', []): |
| if include_dir not in includes: |
| includes.append(include_dir) |
|
|
| |
| |
| ext.include_dirs = list(ext.include_dirs) |
| for include_dir in ext.include_dirs + list(self.include_dirs): |
| if include_dir not in includes: |
| includes.append(include_dir) |
|
|
| |
| |
| |
| |
| directives = dict(self.cython_directives) |
| if hasattr(ext, "cython_directives"): |
| directives.update(ext.cython_directives) |
|
|
| if self.get_extension_attr(ext, 'cython_cplus'): |
| ext.language = 'c++' |
|
|
| if hasattr(ext, 'no_c_in_traceback'): |
| c_line_in_traceback = not ext.no_c_in_traceback |
| else: |
| c_line_in_traceback = None |
| options = { |
| 'use_listing_file': self.get_extension_attr(ext, 'cython_create_listing'), |
| 'emit_linenums': self.get_extension_attr(ext, 'cython_line_directives'), |
| 'include_path': includes, |
| 'compiler_directives': directives, |
| 'build_dir': self.build_temp if self.get_extension_attr(ext, 'cython_c_in_temp') else None, |
| 'generate_pxi': self.get_extension_attr(ext, 'cython_gen_pxi'), |
| 'gdb_debug': self.get_extension_attr(ext, 'cython_gdb'), |
| 'c_line_in_traceback': c_line_in_traceback, |
| 'compile_time_env': self.get_extension_attr(ext, 'cython_compile_time_env', default=None), |
| 'shared_utility_qualified_name': self.get_extension_attr(ext, 'shared_utility_qualified_name', default=None), |
| } |
|
|
| new_ext = cythonize( |
| ext,force=self.force, quiet=self.verbose == 0, **options |
| )[0] |
|
|
| ext.sources = new_ext.sources |
| super().build_extension(ext) |
|
|
| |
| new_build_ext = build_ext |
|
|