Roll WebRTC 9745:9761, Libjingle 9742:9761
[chromium-blink-merge.git] / third_party / cython / src / setup.py
blobbcd00b5747c91be6f278b9b82ad94bf042242c72
1 #!/usr/bin/env python
2 try:
3 from setuptools import setup, Extension
4 except ImportError:
5 from distutils.core import setup, Extension
6 import os
7 import sys
9 try:
10 import platform
11 is_cpython = not hasattr(platform, 'python_implementation') or platform.python_implementation() == 'CPython'
12 except (ImportError, NameError):
13 is_cpython = True # CPython < 2.6
15 if sys.platform == "darwin":
16 # Don't create resource files on OS X tar.
17 os.environ['COPY_EXTENDED_ATTRIBUTES_DISABLE'] = 'true'
18 os.environ['COPYFILE_DISABLE'] = 'true'
20 setup_args = {}
22 def add_command_class(name, cls):
23 cmdclasses = setup_args.get('cmdclass', {})
24 cmdclasses[name] = cls
25 setup_args['cmdclass'] = cmdclasses
27 from distutils.command.sdist import sdist as sdist_orig
28 class sdist(sdist_orig):
29 def run(self):
30 self.force_manifest = 1
31 if (sys.platform != "win32" and
32 os.path.isdir('.git')):
33 assert os.system("git rev-parse --verify HEAD > .gitrev") == 0
34 sdist_orig.run(self)
35 add_command_class('sdist', sdist)
37 if sys.version_info[0] >= 3:
38 import lib2to3.refactor
39 from distutils.command.build_py \
40 import build_py_2to3 as build_py
41 # need to convert sources to Py3 on installation
42 fixers = [ fix for fix in lib2to3.refactor.get_fixers_from_package("lib2to3.fixes")
43 if fix.split('fix_')[-1] not in ('next',)
45 build_py.fixer_names = fixers
46 add_command_class("build_py", build_py)
48 pxd_include_dirs = [
49 directory for directory, dirs, files in os.walk('Cython/Includes')
50 if '__init__.pyx' in files or '__init__.pxd' in files
51 or directory == 'Cython/Includes' or directory == 'Cython/Includes/Deprecated']
53 pxd_include_patterns = [
54 p+'/*.pxd' for p in pxd_include_dirs ] + [
55 p+'/*.pyx' for p in pxd_include_dirs ]
57 setup_args['package_data'] = {
58 'Cython.Plex' : ['*.pxd'],
59 'Cython.Compiler' : ['*.pxd'],
60 'Cython.Runtime' : ['*.pyx', '*.pxd'],
61 'Cython.Utility' : ['*.pyx', '*.pxd', '*.c', '*.h', '*.cpp'],
62 'Cython' : [ p[7:] for p in pxd_include_patterns ],
65 # This dict is used for passing extra arguments that are setuptools
66 # specific to setup
67 setuptools_extra_args = {}
69 # tells whether to include cygdb (the script and the Cython.Debugger package
70 include_debugger = sys.version_info[:2] > (2, 5)
72 if 'setuptools' in sys.modules:
73 setuptools_extra_args['zip_safe'] = False
74 setuptools_extra_args['entry_points'] = {
75 'console_scripts': [
76 'cython = Cython.Compiler.Main:setuptools_main',
79 scripts = []
80 else:
81 if os.name == "posix":
82 scripts = ["bin/cython"]
83 else:
84 scripts = ["cython.py"]
86 if include_debugger:
87 if 'setuptools' in sys.modules:
88 setuptools_extra_args['entry_points']['console_scripts'].append(
89 'cygdb = Cython.Debugger.Cygdb:main')
90 else:
91 if os.name == "posix":
92 scripts.append('bin/cygdb')
93 else:
94 scripts.append('cygdb.py')
97 def compile_cython_modules(profile=False, compile_more=False, cython_with_refnanny=False):
98 source_root = os.path.abspath(os.path.dirname(__file__))
99 compiled_modules = ["Cython.Plex.Scanners",
100 "Cython.Plex.Actions",
101 "Cython.Compiler.Lexicon",
102 "Cython.Compiler.Scanning",
103 "Cython.Compiler.Parsing",
104 "Cython.Compiler.Visitor",
105 "Cython.Compiler.FlowControl",
106 "Cython.Compiler.Code",
107 "Cython.Runtime.refnanny",
108 # "Cython.Compiler.FusedNode",
109 "Cython.Tempita._tempita",
111 if compile_more:
112 compiled_modules.extend([
113 "Cython.Build.Dependencies",
114 "Cython.Compiler.ParseTreeTransforms",
115 "Cython.Compiler.Nodes",
116 "Cython.Compiler.ExprNodes",
117 "Cython.Compiler.ModuleNode",
118 "Cython.Compiler.Optimize",
121 defines = []
122 if cython_with_refnanny:
123 defines.append(('CYTHON_REFNANNY', '1'))
125 extensions = []
126 if sys.version_info[0] >= 3:
127 from Cython.Distutils import build_ext as build_ext_orig
128 for module in compiled_modules:
129 source_file = os.path.join(source_root, *module.split('.'))
130 if os.path.exists(source_file + ".py"):
131 pyx_source_file = source_file + ".py"
132 else:
133 pyx_source_file = source_file + ".pyx"
134 dep_files = []
135 if os.path.exists(source_file + '.pxd'):
136 dep_files.append(source_file + '.pxd')
137 if '.refnanny' in module:
138 defines_for_module = []
139 else:
140 defines_for_module = defines
141 extensions.append(
142 Extension(module, sources = [pyx_source_file],
143 define_macros = defines_for_module,
144 depends = dep_files)
147 class build_ext(build_ext_orig):
148 # we must keep the original modules alive to make sure
149 # their code keeps working when we remove them from
150 # sys.modules
151 dead_modules = []
153 def build_extensions(self):
154 # add path where 2to3 installed the transformed sources
155 # and make sure Python (re-)imports them from there
156 already_imported = [ module for module in sys.modules
157 if module == 'Cython' or module.startswith('Cython.') ]
158 keep_alive = self.dead_modules.append
159 for module in already_imported:
160 keep_alive(sys.modules[module])
161 del sys.modules[module]
162 sys.path.insert(0, os.path.join(source_root, self.build_lib))
164 if profile:
165 from Cython.Compiler.Options import directive_defaults
166 directive_defaults['profile'] = True
167 print("Enabled profiling for the Cython binary modules")
168 build_ext_orig.build_extensions(self)
170 setup_args['ext_modules'] = extensions
171 add_command_class("build_ext", build_ext)
173 else: # Python 2.x
174 from distutils.command.build_ext import build_ext as build_ext_orig
175 try:
176 class build_ext(build_ext_orig):
177 def build_extension(self, ext, *args, **kargs):
178 try:
179 build_ext_orig.build_extension(self, ext, *args, **kargs)
180 except StandardError:
181 print("Compilation of '%s' failed" % ext.sources[0])
182 from Cython.Compiler.Main import compile
183 from Cython import Utils
184 if profile:
185 from Cython.Compiler.Options import directive_defaults
186 directive_defaults['profile'] = True
187 print("Enabled profiling for the Cython binary modules")
188 source_root = os.path.dirname(__file__)
189 for module in compiled_modules:
190 source_file = os.path.join(source_root, *module.split('.'))
191 if os.path.exists(source_file + ".py"):
192 pyx_source_file = source_file + ".py"
193 else:
194 pyx_source_file = source_file + ".pyx"
195 c_source_file = source_file + ".c"
196 source_is_newer = False
197 if not os.path.exists(c_source_file):
198 source_is_newer = True
199 else:
200 c_last_modified = Utils.modification_time(c_source_file)
201 if Utils.file_newer_than(pyx_source_file, c_last_modified):
202 source_is_newer = True
203 else:
204 pxd_source_file = source_file + ".pxd"
205 if os.path.exists(pxd_source_file) and Utils.file_newer_than(pxd_source_file, c_last_modified):
206 source_is_newer = True
207 if source_is_newer:
208 print("Compiling module %s ..." % module)
209 result = compile(pyx_source_file)
210 c_source_file = result.c_file
211 if c_source_file:
212 # Py2 distutils can't handle unicode file paths
213 if isinstance(c_source_file, unicode):
214 filename_encoding = sys.getfilesystemencoding()
215 if filename_encoding is None:
216 filename_encoding = sys.getdefaultencoding()
217 c_source_file = c_source_file.encode(filename_encoding)
218 if '.refnanny' in module:
219 defines_for_module = []
220 else:
221 defines_for_module = defines
222 extensions.append(
223 Extension(module, sources = [c_source_file],
224 define_macros = defines_for_module)
226 else:
227 print("Compilation failed")
228 if extensions:
229 setup_args['ext_modules'] = extensions
230 add_command_class("build_ext", build_ext)
231 except Exception:
232 print('''
233 ERROR: %s
235 Extension module compilation failed, looks like Cython cannot run
236 properly on this system. To work around this, pass the option
237 "--no-cython-compile". This will install a pure Python version of
238 Cython without compiling its own sources.
239 ''' % sys.exc_info()[1])
240 raise
242 cython_profile = '--cython-profile' in sys.argv
243 if cython_profile:
244 sys.argv.remove('--cython-profile')
246 try:
247 sys.argv.remove("--cython-compile-all")
248 cython_compile_more = True
249 except ValueError:
250 cython_compile_more = False
252 try:
253 sys.argv.remove("--cython-with-refnanny")
254 cython_with_refnanny = True
255 except ValueError:
256 cython_with_refnanny = False
258 try:
259 sys.argv.remove("--no-cython-compile")
260 compile_cython_itself = False
261 except ValueError:
262 compile_cython_itself = True
264 if compile_cython_itself and (is_cpython or cython_compile_more):
265 compile_cython_modules(cython_profile, cython_compile_more, cython_with_refnanny)
267 setup_args.update(setuptools_extra_args)
269 from Cython import __version__ as version
271 packages = [
272 'Cython',
273 'Cython.Build',
274 'Cython.Compiler',
275 'Cython.Runtime',
276 'Cython.Distutils',
277 'Cython.Plex',
278 'Cython.Tests',
279 'Cython.Build.Tests',
280 'Cython.Compiler.Tests',
281 'Cython.Utility',
282 'Cython.Tempita',
283 'pyximport',
286 if include_debugger:
287 packages.append('Cython.Debugger')
288 packages.append('Cython.Debugger.Tests')
289 # it's enough to do this for Py2.5+:
290 setup_args['package_data']['Cython.Debugger.Tests'] = ['codefile', 'cfuncs.c']
292 setup(
293 name = 'Cython',
294 version = version,
295 url = 'http://www.cython.org',
296 author = 'Robert Bradshaw, Stefan Behnel, Dag Seljebotn, Greg Ewing, et al.',
297 author_email = 'cython-devel@python.org',
298 description = "The Cython compiler for writing C extensions for the Python language.",
299 long_description = """\
300 The Cython language makes writing C extensions for the Python language as
301 easy as Python itself. Cython is a source code translator based on the
302 well-known Pyrex_, but supports more cutting edge functionality and
303 optimizations.
305 The Cython language is very close to the Python language (and most Python
306 code is also valid Cython code), but Cython additionally supports calling C
307 functions and declaring C types on variables and class attributes. This
308 allows the compiler to generate very efficient C code from Cython code.
310 This makes Cython the ideal language for writing glue code for external C
311 libraries, and for fast C modules that speed up the execution of Python
312 code.
314 .. _Pyrex: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
315 """,
316 classifiers = [
317 "Development Status :: 5 - Production/Stable",
318 "Intended Audience :: Developers",
319 "License :: OSI Approved :: Apache Software License",
320 "Operating System :: OS Independent",
321 "Programming Language :: Python",
322 "Programming Language :: Python :: 2",
323 "Programming Language :: Python :: 3",
324 "Programming Language :: C",
325 "Programming Language :: Cython",
326 "Topic :: Software Development :: Code Generators",
327 "Topic :: Software Development :: Compilers",
328 "Topic :: Software Development :: Libraries :: Python Modules"
331 scripts = scripts,
332 packages=packages,
334 py_modules = ["cython"],
336 **setup_args