blob: 12d3fb074735683d9a3a950ca7ccd2c6b6b8ee78 [file] [log] [blame]
David Lordc76d0da2016-04-11 08:22:11 -07001#!/usr/bin/env python
Armin Ronacher5f6f3df2010-06-22 19:35:26 +02002import os
Armin Ronacherf134ff72016-01-13 22:37:16 +01003import re
4import ast
Armin Ronacher5bda5222010-06-22 19:33:18 +02005import sys
Greg Back0ad62902015-07-14 13:58:39 -05006from setuptools import setup, Extension, Feature
Armin Ronacher5bda5222010-06-22 19:33:18 +02007from distutils.command.build_ext import build_ext
8from distutils.errors import CCompilerError, DistutilsExecError, \
Armin Ronacher026f3172014-04-17 11:05:46 +02009 DistutilsPlatformError
Armin Ronacher115ba372010-06-22 19:21:32 +020010
11
Armin Ronacher5bda5222010-06-22 19:33:18 +020012# fail safe compilation shamelessly stolen from the simplejson
13# setup.py file. Original author: Bob Ippolito
14
Armin Ronacher515ec272011-07-20 09:51:43 +020015is_jython = 'java' in sys.platform
16is_pypy = hasattr(sys, 'pypy_version_info')
17
Armin Ronacherf134ff72016-01-13 22:37:16 +010018with open('markupsafe/__init__.py') as f:
19 version = ast.literal_eval(re.search(
20 '^__version__\s+=\s+(.*?)$(?sm)', f.read()).group(1))
21
Armin Ronacher5bda5222010-06-22 19:33:18 +020022
Greg Back0ad62902015-07-14 13:58:39 -050023speedups = Feature(
24 'optional C speed-enhancement module',
25 standard=True,
Armin Ronacherf134ff72016-01-13 22:37:16 +010026 ext_modules=[
Greg Back0ad62902015-07-14 13:58:39 -050027 Extension('markupsafe._speedups', ['markupsafe/_speedups.c']),
28 ],
29)
30
Matthew Brett5064ad32014-08-02 19:00:36 -070031# Known errors when running build_ext.build_extension method
Armin Ronacher5bda5222010-06-22 19:33:18 +020032ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError)
33if sys.platform == 'win32' and sys.version_info > (2, 6):
Armin Ronacher026f3172014-04-17 11:05:46 +020034 # 2.6's distutils.msvc9compiler can raise an IOError when failing to
35 # find the compiler
36 ext_errors += (IOError,)
Matthew Brett5064ad32014-08-02 19:00:36 -070037# Known errors when running build_ext.run method
38run_errors = (DistutilsPlatformError,)
39if sys.platform == 'darwin':
40 run_errors += (SystemError,)
Armin Ronacher5bda5222010-06-22 19:33:18 +020041
42
43class BuildFailed(Exception):
44 pass
45
46
47class ve_build_ext(build_ext):
48 """This class allows C extension building to fail."""
49
50 def run(self):
51 try:
52 build_ext.run(self)
Matthew Brett5064ad32014-08-02 19:00:36 -070053 except run_errors:
Armin Ronacher5bda5222010-06-22 19:33:18 +020054 raise BuildFailed()
55
56 def build_extension(self, ext):
57 try:
58 build_ext.build_extension(self, ext)
Armin Ronacher1ce02cd2010-06-22 21:53:13 +020059 except ext_errors:
Armin Ronacher5bda5222010-06-22 19:33:18 +020060 raise BuildFailed()
Christoph Zwerschke796b2ea2011-06-05 13:02:02 +020061 except ValueError:
62 # this can happen on Windows 64 bit, see Python issue 7511
63 if "'path'" in str(sys.exc_info()[1]): # works with Python 2 and 3
Christoph Zwerschke4964e772011-06-04 19:28:56 +020064 raise BuildFailed()
65 raise
Armin Ronacher5bda5222010-06-22 19:33:18 +020066
67
Armin Ronacher5f853162010-06-22 21:56:38 +020068def echo(msg=''):
69 sys.stdout.write(msg + '\n')
70
71
Armin Ronacher20706f22010-06-22 19:46:25 +020072readme = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read()
Armin Ronacher5f6f3df2010-06-22 19:35:26 +020073
74
Armin Ronacher5bda5222010-06-22 19:33:18 +020075def run_setup(with_binary):
Greg Back0ad62902015-07-14 13:58:39 -050076 features = {}
77 if with_binary:
78 features['speedups'] = speedups
Armin Ronacher5bda5222010-06-22 19:33:18 +020079 setup(
80 name='MarkupSafe',
Armin Ronacherf134ff72016-01-13 22:37:16 +010081 version=version,
Hsiaoming Yang453e41c2018-04-20 00:15:15 +090082 url='https://www.palletsprojects.com/p/markupsafe/',
Armin Ronacher5bda5222010-06-22 19:33:18 +020083 license='BSD',
84 author='Armin Ronacher',
85 author_email='armin.ronacher@active-4.com',
Hsiaoming Yang453e41c2018-04-20 00:15:15 +090086 maintainer='Pallets team',
87 maintainer_email='contact@palletsprojects.com',
Armin Ronacher5bda5222010-06-22 19:33:18 +020088 description='Implements a XML/HTML/XHTML Markup safe string for Python',
Armin Ronacher20706f22010-06-22 19:46:25 +020089 long_description=readme,
Armin Ronacher5bda5222010-06-22 19:33:18 +020090 zip_safe=False,
91 classifiers=[
92 'Development Status :: 5 - Production/Stable',
93 'Environment :: Web Environment',
94 'Intended Audience :: Developers',
95 'License :: OSI Approved :: BSD License',
96 'Operating System :: OS Independent',
97 'Programming Language :: Python',
Hugo085711d2017-10-08 18:23:28 +030098 'Programming Language :: Python :: 2',
Hugo085711d2017-10-08 18:23:28 +030099 'Programming Language :: Python :: 2.7',
Armin Ronacher5bda5222010-06-22 19:33:18 +0200100 'Programming Language :: Python :: 3',
Hugo085711d2017-10-08 18:23:28 +0300101 'Programming Language :: Python :: 3.4',
102 'Programming Language :: Python :: 3.5',
103 'Programming Language :: Python :: 3.6',
Armin Ronacher5bda5222010-06-22 19:33:18 +0200104 'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
105 'Topic :: Software Development :: Libraries :: Python Modules',
106 'Topic :: Text Processing :: Markup :: HTML'
107 ],
108 packages=['markupsafe'],
David Lordc76d0da2016-04-11 08:22:11 -0700109 test_suite='tests.suite',
Armin Ronacher5bda5222010-06-22 19:33:18 +0200110 include_package_data=True,
111 cmdclass={'build_ext': ve_build_ext},
Greg Back0ad62902015-07-14 13:58:39 -0500112 features=features,
Armin Ronacher5bda5222010-06-22 19:33:18 +0200113 )
114
115
Armin Ronacher515ec272011-07-20 09:51:43 +0200116def try_building_extension():
117 try:
118 run_setup(True)
119 except BuildFailed:
120 LINE = '=' * 74
121 BUILD_EXT_WARNING = 'WARNING: The C extension could not be ' \
122 'compiled, speedups are not enabled.'
Armin Ronacher5bda5222010-06-22 19:33:18 +0200123
Armin Ronacher515ec272011-07-20 09:51:43 +0200124 echo(LINE)
125 echo(BUILD_EXT_WARNING)
126 echo('Failure information, if any, is above.')
127 echo('Retrying the build without the C extension now.')
128 echo()
Armin Ronacher5bda5222010-06-22 19:33:18 +0200129
Armin Ronacher515ec272011-07-20 09:51:43 +0200130 run_setup(False)
Armin Ronacher5bda5222010-06-22 19:33:18 +0200131
Armin Ronacher515ec272011-07-20 09:51:43 +0200132 echo(LINE)
133 echo(BUILD_EXT_WARNING)
134 echo('Plain-Python installation succeeded.')
135 echo(LINE)
136
137
138if not (is_pypy or is_jython):
139 try_building_extension()
140else:
Armin Ronacher98caea12011-07-20 10:57:46 +0200141 run_setup(False)