diff --git a/setup.py b/setup.py index 6fba3988..87ba2ea6 100644 --- a/setup.py +++ b/setup.py @@ -16,6 +16,7 @@ import platform import sys +import warnings try: # Use setuptools if available, for install_requires (among other things). @@ -27,6 +28,89 @@ except ImportError: from distutils.core import Extension +# The following code is copied from +# https://github.com/mongodb/mongo-python-driver/blob/master/setup.py +# to support installing without the extension on platforms where +# no compiler is available. +from distutils.command.build_ext import build_ext +from distutils.errors import CCompilerError +from distutils.errors import DistutilsPlatformError, DistutilsExecError +if sys.platform == 'win32' and sys.version_info > (2, 6): + # 2.6's distutils.msvc9compiler can raise an IOError when failing to + # find the compiler + build_errors = (CCompilerError, DistutilsExecError, + DistutilsPlatformError, IOError) +else: + build_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError) + +class custom_build_ext(build_ext): + """Allow C extension building to fail. + + The C extension speeds up websocket masking, but is not essential. + """ + + warning_message = """ +******************************************************************** +WARNING: %s could not +be compiled. No C extensions are essential for Tornado to run, +although they do result in significant speed improvements for +websockets. +%s + +Here are some hints for popular operating systems: + +If you are seeing this message on Linux you probably need to +install GCC and/or the Python development package for your +version of Python. + +Debian and Ubuntu users should issue the following command: + + $ sudo apt-get install build-essential python-dev + +RedHat, CentOS, and Fedora users should issue the following command: + + $ sudo yum install gcc python-devel + +If you are seeing this message on OSX please read the documentation +here: + +http://api.mongodb.org/python/current/installation.html#osx +******************************************************************** +""" + + def run(self): + try: + build_ext.run(self) + except DistutilsPlatformError: + e = sys.exc_info()[1] + sys.stdout.write('%s\n' % str(e)) + warnings.warn(self.warning_message % ("Extension modules", + "There was an issue with " + "your platform configuration" + " - see above.")) + + def build_extension(self, ext): + name = ext.name + if sys.version_info[:3] >= (2, 4, 0): + try: + build_ext.build_extension(self, ext) + except build_errors: + e = sys.exc_info()[1] + sys.stdout.write('%s\n' % str(e)) + warnings.warn(self.warning_message % ("The %s extension " + "module" % (name,), + "The output above " + "this warning shows how " + "the compilation " + "failed.")) + else: + warnings.warn(self.warning_message % ("The %s extension " + "module" % (name,), + "Please use Python >= 2.4 " + "to take advantage of the " + "extension.")) + + kwargs = {} version = "3.2.dev2" @@ -85,5 +169,6 @@ setuptools.setup( 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', ], + cmdclass={"build_ext": custom_build_ext}, **kwargs )