From: Jake Farrell Date: Sat, 26 Nov 2011 05:23:09 +0000 (+0000) Subject: Thrift-386: Make it possible to build the Python library without the extension X-Git-Tag: 0.8.0~5 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=a0dd75d7c871370341c27388ffed5ed66917098f;p=common%2Fthrift.git Thrift-386: Make it possible to build the Python library without the extension Client: py Patch: Jake Farrell patch for py lib which will attempt to build the C extension and if it fails falls back to just building the library without any extensions. git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1206398 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/py/setup.py b/lib/py/setup.py index 8664b031..5870cd08 100644 --- a/lib/py/setup.py +++ b/lib/py/setup.py @@ -19,43 +19,86 @@ # under the License. # +import sys try: from setuptools import setup, Extension except: - from distutils.core import setup, Extension -import sys + from distutils.core import setup, Extension, Command + +from distutils.command.build_ext import build_ext +from distutils.errors import CCompilerError, DistutilsExecError, DistutilsPlatformError include_dirs = [] if sys.platform == 'win32': include_dirs.append('compat/win32') -fastbinarymod = Extension('thrift.protocol.fastbinary', - sources = ['src/protocol/fastbinary.c'], + ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError, IOError) +else: + ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError) + +class BuildFailed(Exception): + pass + +class ve_build_ext(build_ext): + def run(self): + try: + build_ext.run(self) + except DistutilsPlatformError, x: + raise BuildFailed() + + def build_extension(self, ext): + try: + build_ext.build_extension(self, ext) + except ext_errors, x: + raise BuildFailed() + +def run_setup(with_binary): + if with_binary: + extensions = dict( + ext_modules = [ + Extension('thrift.protocol.fastbinary', + sources = ['src/protocol/fastbinary.c'], include_dirs = include_dirs, ) + ], + cmdclass=dict(build_ext=ve_build_ext) + ) + else: + extensions = dict() + + setup(name = 'thrift', + version = '0.8.0-dev', + description = 'Python bindings for the Apache Thrift RPC system', + author = ['Thrift Developers'], + author_email = ['dev@thrift.apache.org'], + url = 'http://thrift.apache.org', + license = 'Apache License 2.0', + packages = [ + 'thrift', + 'thrift.protocol', + 'thrift.transport', + 'thrift.server', + ], + package_dir = {'thrift' : 'src'}, + classifiers = [ + 'Development Status :: 5 - Production/Stable', + 'Environment :: Console', + 'Intended Audience :: Developers', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Topic :: Software Development :: Libraries', + 'Topic :: System :: Networking' + ], + **extensions + ) -setup(name = 'thrift', - version = '0.8.0-dev', - description = 'Python bindings for the Apache Thrift RPC system', - author = ['Thrift Developers'], - author_email = ['dev@thrift.apache.org'], - url = 'http://thrift.apache.org', - license = 'Apache License 2.0', - packages = [ - 'thrift', - 'thrift.protocol', - 'thrift.transport', - 'thrift.server', - ], - package_dir = {'thrift' : 'src'}, - ext_modules = [fastbinarymod], - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console', - 'Intended Audience :: Developers', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Topic :: Software Development :: Libraries', - 'Topic :: System :: Networking' - ] -) +try: + run_setup(True) +except BuildFailed: + print + print '*' * 80 + print "An error occured while trying to compile with the C extension enabled" + print "Attempting to build without the extension now" + print '*' * 80 + print + run_setup(False)