| from distutils.core import Extension as _Extension | |
| from distutils.core import Distribution as _Distribution | |
| def _get_unpatched(cls): | |
| """Protect against re-patching the distutils if reloaded | |
| Also ensures that no other distutils extension monkeypatched the distutils | |
| first. | |
| """ | |
| while cls.__module__.startswith('setuptools'): | |
| cls, = cls.__bases__ | |
| if not cls.__module__.startswith('distutils'): | |
| raise AssertionError( | |
| "distutils has already been patched by %r" % cls | |
| ) | |
| return cls | |
| _Distribution = _get_unpatched(_Distribution) | |
| _Extension = _get_unpatched(_Extension) | |
| try: | |
| from Pyrex.Distutils.build_ext import build_ext | |
| except ImportError: | |
| have_pyrex = False | |
| else: | |
| have_pyrex = True | |
| class Extension(_Extension): | |
| """Extension that uses '.c' files in place of '.pyx' files""" | |
| if not have_pyrex: | |
| # convert .pyx extensions to .c | |
| def __init__(self,*args,**kw): | |
| _Extension.__init__(self,*args,**kw) | |
| sources = [] | |
| for s in self.sources: | |
| if s.endswith('.pyx'): | |
| sources.append(s[:-3]+'c') | |
| else: | |
| sources.append(s) | |
| self.sources = sources | |
| class Library(Extension): | |
| """Just like a regular Extension, but built as a library instead""" | |
| import sys, distutils.core, distutils.extension | |
| distutils.core.Extension = Extension | |
| distutils.extension.Extension = Extension | |
| if 'distutils.command.build_ext' in sys.modules: | |
| sys.modules['distutils.command.build_ext'].Extension = Extension |