From f60e4eefc2f0552770b8fbd7f987cfbd913621dc Mon Sep 17 00:00:00 2001 From: Graham Dumpleton Date: Thu, 22 Aug 2013 10:50:15 +1000 Subject: [PATCH] Fallback to building pure Python variant if extension cannot be compiled. --- setup.py | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index afd79db..45e7eea 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,36 @@ +from __future__ import print_function + import os +import sys from distutils.core import setup from distutils.core import Extension +from distutils.command.build_ext import build_ext +from distutils.errors import (CCompilerError, DistutilsExecError, + DistutilsPlatformError) -with_extensions = os.environ.get('WRAPT_EXTENSIONS', 'true') -with_extensions = (with_extensions.lower() != 'false') +if sys.platform == 'win32': + build_ext_errors = (CCompilerError, DistutilsExecError, + DistutilsPlatformError, IOError) +else: + build_ext_errors = (CCompilerError, DistutilsExecError, + DistutilsPlatformError) + +class BuildExtFailed(Exception): + pass + +class optional_build_ext(build_ext): + def run(self): + try: + build_ext.run(self) + except DistutilsPlatformError: + raise BuildExtFailed() + + def build_extension(self, ext): + try: + build_ext.build_extension(self, ext) + except build_ext_errors: + raise BuildExtFailed() setup_kwargs = dict( name = 'wrapt', @@ -18,11 +44,56 @@ setup_kwargs = dict( package_dir={'wrapt': 'src'}, ) -setup_extension_kwargs = dict( - ext_modules = [Extension("wrapt._wrappers", ["src/_wrappers.c"])], -) +def run_setup(with_extensions): + setup_kwargs_tmp = dict(setup_kwargs) + + if with_extensions: + setup_kwargs_tmp['ext_modules'] = [ + Extension("wrapt._wrappers", ["src/_wrappers.c"])] + setup_kwargs_tmp['cmdclass'] = dict(build_ext=optional_build_ext) + + setup(**setup_kwargs_tmp) + +with_extensions = os.environ.get('WRAPT_EXTENSIONS', None) if with_extensions: - setup_kwargs.update(setup_extension_kwargs) + if with_extensions.lower() == 'true': + with_extensions = True + elif with_extensions.lower() == 'false': + with_extensions = False + else: + with_extensions = None -setup(**setup_kwargs) +if hasattr(sys, 'pypy_version_info'): + with_extensions = False + +WARNING = """ +WARNING: The C extension component for wrapt could not be compiled. +""" + +if with_extensions is not None: + run_setup(with_extensions=with_extensions) + +else: + try: + run_setup(with_extensions=True) + + except BuildExtFailed: + + print(75 * '*') + + print(WARNING) + print("INFO: Trying to build without extensions.") + + print() + print(75 * '*') + + run_setup(with_extensions=False) + + print(75 * '*') + + print(WARNING) + print("INFO: Only pure Python version of package installed.") + + print() + print(75 * '*')