blob: fcaeb12ec4124dd15d3efdebeb5a07840ba716fb [file] [log] [blame]
Armin Ronacher5f6f3df2010-06-22 19:35:26 +02001import os
Armin Ronacher5bda5222010-06-22 19:33:18 +02002import sys
Jason R. Coombsb74cfd12014-02-16 18:44:37 -05003from setuptools import setup, Extension
Armin Ronacher5bda5222010-06-22 19:33:18 +02004from distutils.command.build_ext import build_ext
5from distutils.errors import CCompilerError, DistutilsExecError, \
6 DistutilsPlatformError
Armin Ronacher115ba372010-06-22 19:21:32 +02007
8
Armin Ronacher5bda5222010-06-22 19:33:18 +02009# fail safe compilation shamelessly stolen from the simplejson
10# setup.py file. Original author: Bob Ippolito
11
Armin Ronacher515ec272011-07-20 09:51:43 +020012is_jython = 'java' in sys.platform
13is_pypy = hasattr(sys, 'pypy_version_info')
14
Armin Ronacher5bda5222010-06-22 19:33:18 +020015
Armin Ronacher5bda5222010-06-22 19:33:18 +020016ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError)
17if sys.platform == 'win32' and sys.version_info > (2, 6):
18 # 2.6's distutils.msvc9compiler can raise an IOError when failing to
19 # find the compiler
20 ext_errors += (IOError,)
21
22
23class BuildFailed(Exception):
24 pass
25
26
27class ve_build_ext(build_ext):
28 """This class allows C extension building to fail."""
29
30 def run(self):
31 try:
32 build_ext.run(self)
Armin Ronacher1ce02cd2010-06-22 21:53:13 +020033 except DistutilsPlatformError:
Armin Ronacher5bda5222010-06-22 19:33:18 +020034 raise BuildFailed()
35
36 def build_extension(self, ext):
37 try:
38 build_ext.build_extension(self, ext)
Armin Ronacher1ce02cd2010-06-22 21:53:13 +020039 except ext_errors:
Armin Ronacher5bda5222010-06-22 19:33:18 +020040 raise BuildFailed()
Christoph Zwerschke796b2ea2011-06-05 13:02:02 +020041 except ValueError:
42 # this can happen on Windows 64 bit, see Python issue 7511
43 if "'path'" in str(sys.exc_info()[1]): # works with Python 2 and 3
Christoph Zwerschke4964e772011-06-04 19:28:56 +020044 raise BuildFailed()
45 raise
Armin Ronacher5bda5222010-06-22 19:33:18 +020046
47
Armin Ronacher5f853162010-06-22 21:56:38 +020048def echo(msg=''):
49 sys.stdout.write(msg + '\n')
50
51
Armin Ronacher20706f22010-06-22 19:46:25 +020052readme = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read()
Armin Ronacher5f6f3df2010-06-22 19:35:26 +020053
54
Armin Ronacher5bda5222010-06-22 19:33:18 +020055def run_setup(with_binary):
Jason R. Coombsb74cfd12014-02-16 18:44:37 -050056 ext = Extension('markupsafe._speedups', ['markupsafe/_speedups.c'])
57 ext_modules = [ext] if with_binary else []
Armin Ronacher5bda5222010-06-22 19:33:18 +020058 setup(
59 name='MarkupSafe',
Armin Ronachercbac3a72013-05-22 02:15:36 +010060 version='0.18',
Armin Ronacher7afa6392013-05-20 19:13:07 +010061 url='http://github.com/mitsuhiko/markupsafe',
Armin Ronacher5bda5222010-06-22 19:33:18 +020062 license='BSD',
63 author='Armin Ronacher',
64 author_email='armin.ronacher@active-4.com',
65 description='Implements a XML/HTML/XHTML Markup safe string for Python',
Armin Ronacher20706f22010-06-22 19:46:25 +020066 long_description=readme,
Armin Ronacher5bda5222010-06-22 19:33:18 +020067 zip_safe=False,
68 classifiers=[
69 'Development Status :: 5 - Production/Stable',
70 'Environment :: Web Environment',
71 'Intended Audience :: Developers',
72 'License :: OSI Approved :: BSD License',
73 'Operating System :: OS Independent',
74 'Programming Language :: Python',
75 'Programming Language :: Python :: 3',
76 'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
77 'Topic :: Software Development :: Libraries :: Python Modules',
78 'Topic :: Text Processing :: Markup :: HTML'
79 ],
80 packages=['markupsafe'],
Armin Ronacherea75ec92010-06-22 19:45:11 +020081 test_suite='markupsafe.tests.suite',
Armin Ronacher5bda5222010-06-22 19:33:18 +020082 include_package_data=True,
83 cmdclass={'build_ext': ve_build_ext},
Jason R. Coombsb74cfd12014-02-16 18:44:37 -050084 ext_modules=ext_modules,
Armin Ronacher5bda5222010-06-22 19:33:18 +020085 )
86
87
Armin Ronacher515ec272011-07-20 09:51:43 +020088def try_building_extension():
89 try:
90 run_setup(True)
91 except BuildFailed:
92 LINE = '=' * 74
93 BUILD_EXT_WARNING = 'WARNING: The C extension could not be ' \
94 'compiled, speedups are not enabled.'
Armin Ronacher5bda5222010-06-22 19:33:18 +020095
Armin Ronacher515ec272011-07-20 09:51:43 +020096 echo(LINE)
97 echo(BUILD_EXT_WARNING)
98 echo('Failure information, if any, is above.')
99 echo('Retrying the build without the C extension now.')
100 echo()
Armin Ronacher5bda5222010-06-22 19:33:18 +0200101
Armin Ronacher515ec272011-07-20 09:51:43 +0200102 run_setup(False)
Armin Ronacher5bda5222010-06-22 19:33:18 +0200103
Armin Ronacher515ec272011-07-20 09:51:43 +0200104 echo(LINE)
105 echo(BUILD_EXT_WARNING)
106 echo('Plain-Python installation succeeded.')
107 echo(LINE)
108
109
110if not (is_pypy or is_jython):
111 try_building_extension()
112else:
Armin Ronacher98caea12011-07-20 10:57:46 +0200113 run_setup(False)