blob: ff67b8938066c6e50d4076f4189b108656e8cfc6 [file] [log] [blame]
Tamir Duberstein9d9d0b72015-04-11 20:23:45 -07001#! /usr/bin/env python
temporal40ee5512008-07-10 02:12:20 +00002#
3# See README for usage instructions.
Paul Yang704037f2018-11-28 16:45:16 -08004from distutils import util
Misha Seltzer223e8912020-05-14 21:09:09 -04005import fnmatch
Tamir Duberstein5018c432015-05-08 08:48:40 -04006import glob
temporal40ee5512008-07-10 02:12:20 +00007import os
Paul Yang704037f2018-11-28 16:45:16 -08008import pkg_resources
9import re
kenton@google.coma6de64a2009-04-18 02:28:15 +000010import subprocess
Tamir Duberstein5018c432015-05-08 08:48:40 -040011import sys
Paul Yang704037f2018-11-28 16:45:16 -080012import sysconfig
Paul Yang7f3e2372017-01-31 09:17:32 -080013import platform
temporal40ee5512008-07-10 02:12:20 +000014
liujisi@google.com9ced30c2012-08-01 06:22:19 +000015# We must use setuptools, not distutils, because we need to use the
16# namespace_packages option for the "google" package.
Dan O'Reilly3bdfb4b2015-08-20 13:51:26 -040017from setuptools import setup, Extension, find_packages
liujisi@google.com9ced30c2012-08-01 06:22:19 +000018
Benjamin Peterson188c44b2018-09-10 13:35:38 -070019from distutils.command.build_py import build_py as _build_py
Tamir Duberstein21a7cf92015-04-11 18:24:24 -070020from distutils.command.clean import clean as _clean
Jan Tattermusch0ebbd7d2021-03-30 04:04:16 +020021from distutils.command.build_ext import build_ext as _build_ext
Tamir Duberstein21a7cf92015-04-11 18:24:24 -070022from distutils.spawn import find_executable
temporal40ee5512008-07-10 02:12:20 +000023
24# Find the Protocol Compiler.
liujisi@google.come34f1f62012-12-05 01:25:12 +000025if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']):
26 protoc = os.environ['PROTOC']
Joshua Habermanb99994d2020-03-31 16:25:37 -070027elif os.path.exists("../src/protoc"):
28 protoc = "../src/protoc"
29elif os.path.exists("../src/protoc.exe"):
30 protoc = "../src/protoc.exe"
31elif os.path.exists("../vsprojects/Debug/protoc.exe"):
32 protoc = "../vsprojects/Debug/protoc.exe"
33elif os.path.exists("../vsprojects/Release/protoc.exe"):
34 protoc = "../vsprojects/Release/protoc.exe"
temporal40ee5512008-07-10 02:12:20 +000035else:
36 protoc = find_executable("protoc")
37
Tamir Duberstein21a7cf92015-04-11 18:24:24 -070038
Jisi Liu4573e112015-03-04 16:45:13 -080039def GetVersion():
40 """Gets the version from google/protobuf/__init__.py
41
Tamir Duberstein21a7cf92015-04-11 18:24:24 -070042 Do not import google.protobuf.__init__ directly, because an installed
43 protobuf library may be loaded instead."""
Jisi Liu4573e112015-03-04 16:45:13 -080044
Joshua Habermanb99994d2020-03-31 16:25:37 -070045 with open(os.path.join('google', 'protobuf', '__init__.py')) as version_file:
Behzad Tabibian2bf92b32015-05-07 19:04:56 +020046 exec(version_file.read(), globals())
cclauss35567c12018-06-25 19:50:40 +020047 global __version__
Jisi Liu4573e112015-03-04 16:45:13 -080048 return __version__
49
50
Feng Xiao8e142682015-05-26 00:11:09 -070051def generate_proto(source, require = True):
temporal40ee5512008-07-10 02:12:20 +000052 """Invokes the Protocol Compiler to generate a _pb2.py from the given
53 .proto file. Does nothing if the output already exists and is newer than
54 the input."""
55
Feng Xiao8e142682015-05-26 00:11:09 -070056 if not require and not os.path.exists(source):
57 return
58
Joshua Habermanb99994d2020-03-31 16:25:37 -070059 output = source.replace(".proto", "_pb2.py").replace("../src/", "")
temporal40ee5512008-07-10 02:12:20 +000060
temporal40ee5512008-07-10 02:12:20 +000061 if (not os.path.exists(output) or
62 (os.path.exists(source) and
63 os.path.getmtime(source) > os.path.getmtime(output))):
Joshua Habermanb99994d2020-03-31 16:25:37 -070064 print("Generating %s..." % output)
temporal40ee5512008-07-10 02:12:20 +000065
liujisi@google.com9ced30c2012-08-01 06:22:19 +000066 if not os.path.exists(source):
67 sys.stderr.write("Can't find required file: %s\n" % source)
68 sys.exit(-1)
69
Tamir Duberstein21a7cf92015-04-11 18:24:24 -070070 if protoc is None:
temporal40ee5512008-07-10 02:12:20 +000071 sys.stderr.write(
72 "protoc is not installed nor found in ../src. Please compile it "
73 "or install the binary package.\n")
74 sys.exit(-1)
75
Joshua Habermanb99994d2020-03-31 16:25:37 -070076 protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ]
kenton@google.coma6de64a2009-04-18 02:28:15 +000077 if subprocess.call(protoc_command) != 0:
temporal40ee5512008-07-10 02:12:20 +000078 sys.exit(-1)
79
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +000080def GenerateUnittestProtos():
Adam Cozzetted64a2d92016-06-29 15:23:27 -070081 generate_proto("../src/google/protobuf/any_test.proto", False)
Adam Cozzette13fd0452017-09-12 10:32:01 -070082 generate_proto("../src/google/protobuf/map_proto2_unittest.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -070083 generate_proto("../src/google/protobuf/map_unittest.proto", False)
Joshua Habermanf1ce60e2016-12-03 11:51:25 -050084 generate_proto("../src/google/protobuf/test_messages_proto3.proto", False)
Yilun Chong18a0c2c2017-06-27 18:24:15 -070085 generate_proto("../src/google/protobuf/test_messages_proto2.proto", False)
Jisi Liub0f66112015-08-21 11:18:45 -070086 generate_proto("../src/google/protobuf/unittest_arena.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -070087 generate_proto("../src/google/protobuf/unittest.proto", False)
88 generate_proto("../src/google/protobuf/unittest_custom_options.proto", False)
89 generate_proto("../src/google/protobuf/unittest_import.proto", False)
90 generate_proto("../src/google/protobuf/unittest_import_public.proto", False)
91 generate_proto("../src/google/protobuf/unittest_mset.proto", False)
Jisi Liub0f66112015-08-21 11:18:45 -070092 generate_proto("../src/google/protobuf/unittest_mset_wire_format.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -070093 generate_proto("../src/google/protobuf/unittest_no_generic_services.proto", False)
94 generate_proto("../src/google/protobuf/unittest_proto3_arena.proto", False)
Hao Nguyen09cab822019-06-11 16:00:16 -070095 generate_proto("../src/google/protobuf/util/json_format.proto", False)
Jisi Liu46e8ff62015-10-05 11:59:43 -070096 generate_proto("../src/google/protobuf/util/json_format_proto3.proto", False)
Feng Xiaoe841bac2015-12-11 17:09:20 -080097 generate_proto("google/protobuf/internal/any_test.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -070098 generate_proto("google/protobuf/internal/descriptor_pool_test1.proto", False)
99 generate_proto("google/protobuf/internal/descriptor_pool_test2.proto", False)
100 generate_proto("google/protobuf/internal/factory_test1.proto", False)
101 generate_proto("google/protobuf/internal/factory_test2.proto", False)
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700102 generate_proto("google/protobuf/internal/file_options_test.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -0700103 generate_proto("google/protobuf/internal/import_test_package/inner.proto", False)
104 generate_proto("google/protobuf/internal/import_test_package/outer.proto", False)
105 generate_proto("google/protobuf/internal/missing_enum_values.proto", False)
Jisi Liub0f66112015-08-21 11:18:45 -0700106 generate_proto("google/protobuf/internal/message_set_extensions.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -0700107 generate_proto("google/protobuf/internal/more_extensions.proto", False)
108 generate_proto("google/protobuf/internal/more_extensions_dynamic.proto", False)
109 generate_proto("google/protobuf/internal/more_messages.proto", False)
Adam Cozzette837c94b2018-03-14 13:01:55 -0700110 generate_proto("google/protobuf/internal/no_package.proto", False)
Jisi Liub0f66112015-08-21 11:18:45 -0700111 generate_proto("google/protobuf/internal/packed_field_test.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -0700112 generate_proto("google/protobuf/internal/test_bad_identifiers.proto", False)
Joshua Habermanb7742c52020-04-08 10:30:17 -0700113 generate_proto("google/protobuf/internal/test_proto3_optional.proto", False)
Feng Xiao8e142682015-05-26 00:11:09 -0700114 generate_proto("google/protobuf/pyext/python.proto", False)
liujisi@google.com9ced30c2012-08-01 06:22:19 +0000115
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700116
liujisi@google.com9ced30c2012-08-01 06:22:19 +0000117class clean(_clean):
118 def run(self):
119 # Delete generated files in the code tree.
Joshua Habermanb99994d2020-03-31 16:25:37 -0700120 for (dirpath, dirnames, filenames) in os.walk("."):
temporal40ee5512008-07-10 02:12:20 +0000121 for filename in filenames:
122 filepath = os.path.join(dirpath, filename)
liujisi@google.com33165fe2010-11-02 13:14:58 +0000123 if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \
Thomas Hisch451e0442018-04-09 21:43:10 +0200124 filepath.endswith(".so") or filepath.endswith(".o"):
temporal40ee5512008-07-10 02:12:20 +0000125 os.remove(filepath)
liujisi@google.com9ced30c2012-08-01 06:22:19 +0000126 # _clean is an old-style class, so super() doesn't work.
127 _clean.run(self)
128
129class build_py(_build_py):
130 def run(self):
temporal40ee5512008-07-10 02:12:20 +0000131 # Generate necessary .proto file if it doesn't exist.
temporal40ee5512008-07-10 02:12:20 +0000132 generate_proto("../src/google/protobuf/descriptor.proto")
liujisi@google.com9b7f6c52010-12-08 03:45:27 +0000133 generate_proto("../src/google/protobuf/compiler/plugin.proto")
Jisi Liu7464f402015-10-06 14:20:26 -0700134 generate_proto("../src/google/protobuf/any.proto")
Jisi Liuf6fa5c72015-10-06 14:26:00 -0700135 generate_proto("../src/google/protobuf/api.proto")
136 generate_proto("../src/google/protobuf/duration.proto")
137 generate_proto("../src/google/protobuf/empty.proto")
Jisi Liu7464f402015-10-06 14:20:26 -0700138 generate_proto("../src/google/protobuf/field_mask.proto")
Jisi Liuf6fa5c72015-10-06 14:26:00 -0700139 generate_proto("../src/google/protobuf/source_context.proto")
140 generate_proto("../src/google/protobuf/struct.proto")
141 generate_proto("../src/google/protobuf/timestamp.proto")
142 generate_proto("../src/google/protobuf/type.proto")
143 generate_proto("../src/google/protobuf/wrappers.proto")
jieluo@google.combde4a322014-08-12 21:10:30 +0000144 GenerateUnittestProtos()
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000145
liujisi@google.com9ced30c2012-08-01 06:22:19 +0000146 # _build_py is an old-style class, so super() doesn't work.
147 _build_py.run(self)
jieluo@google.combde4a322014-08-12 21:10:30 +0000148
Misha Seltzer223e8912020-05-14 21:09:09 -0400149 def find_package_modules(self, package, package_dir):
150 exclude = (
151 "*test*",
152 "google/protobuf/internal/*_pb2.py",
153 "google/protobuf/internal/_parameterized.py",
154 "google/protobuf/pyext/python_pb2.py",
155 )
156 modules = _build_py.find_package_modules(self, package, package_dir)
157 return [(pkg, mod, fil) for (pkg, mod, fil) in modules
158 if not any(fnmatch.fnmatchcase(fil, pat=pat) for pat in exclude)]
159
160
Jan Tattermusch0ebbd7d2021-03-30 04:04:16 +0200161class build_ext(_build_ext):
162 def get_ext_filename(self, ext_name):
163 # since python3.5, python extensions' shared libraries use a suffix that corresponds to the value
164 # of sysconfig.get_config_var('EXT_SUFFIX') and contains info about the architecture the library targets.
165 # E.g. on x64 linux the suffix is ".cpython-XYZ-x86_64-linux-gnu.so"
166 # When crosscompiling python wheels, we need to be able to override this suffix
167 # so that the resulting file name matches the target architecture and we end up with a well-formed
168 # wheel.
169 filename = _build_ext.get_ext_filename(self, ext_name)
170 orig_ext_suffix = sysconfig.get_config_var("EXT_SUFFIX")
171 new_ext_suffix = os.getenv("PROTOCOL_BUFFERS_OVERRIDE_EXT_SUFFIX")
172 if new_ext_suffix and filename.endswith(orig_ext_suffix):
173 filename = filename[:-len(orig_ext_suffix)] + new_ext_suffix
174 return filename
175
176
Josh Haberman325392d2015-08-17 12:30:49 -0700177class test_conformance(_build_py):
178 target = 'test_python'
179 def run(self):
Yuchen Xie595231d2018-06-26 06:20:53 +0800180 # Python 2.6 dodges these extra failures.
181 os.environ["CONFORMANCE_PYTHON_EXTRA_FAILURES"] = (
182 "--failure_list failure_list_python-post26.txt")
Josh Haberman4b31ffa2015-12-03 12:54:54 -0800183 cmd = 'cd ../conformance && make %s' % (test_conformance.target)
184 status = subprocess.check_call(cmd, shell=True)
Josh Haberman325392d2015-08-17 12:30:49 -0700185
temporal40ee5512008-07-10 02:12:20 +0000186
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700187def get_option_from_sys_argv(option_str):
188 if option_str in sys.argv:
189 sys.argv.remove(option_str)
190 return True
191 return False
192
193
liujisi@google.com9ced30c2012-08-01 06:22:19 +0000194if __name__ == '__main__':
jieluo@google.com1eba9d92014-08-25 20:17:53 +0000195 ext_module_list = []
Josh Haberman00700b72015-10-06 14:13:09 -0700196 warnings_as_errors = '--warnings_as_errors'
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700197 if get_option_from_sys_argv('--cpp_implementation'):
198 # Link libprotobuf.a and libprotobuf-lite.a statically with the
199 # extension. Note that those libraries have to be compiled with
200 # -fPIC for this to work.
201 compile_static_ext = get_option_from_sys_argv('--compile_static_extension')
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700202 libraries = ['protobuf']
203 extra_objects = None
204 if compile_static_ext:
205 libraries = None
206 extra_objects = ['../src/.libs/libprotobuf.a',
207 '../src/.libs/libprotobuf-lite.a']
Josh Haberman325392d2015-08-17 12:30:49 -0700208 test_conformance.target = 'test_python_cpp'
Josh Habermand8814ed2015-10-07 11:46:23 -0700209
Paul Yangc9317432018-04-02 15:55:28 -0700210 extra_compile_args = []
211
Roy Williams7ad0fd42021-04-23 23:03:01 -0400212 message_extra_link_args = None
213 api_implementation_link_args = None
214 if "darwin" in sys.platform:
215 if sys.version_info[0] == 2:
216 message_init_symbol = 'init_message'
217 api_implementation_init_symbol = 'init_api_implementation'
218 else:
219 message_init_symbol = 'PyInit__message'
220 api_implementation_init_symbol = 'PyInit__api_implementation'
221 message_extra_link_args = ['-Wl,-exported_symbol,_%s' % message_init_symbol]
222 api_implementation_link_args = ['-Wl,-exported_symbol,_%s' % api_implementation_init_symbol]
223
Paul Yangc9317432018-04-02 15:55:28 -0700224 if sys.platform != 'win32':
225 extra_compile_args.append('-Wno-write-strings')
226 extra_compile_args.append('-Wno-invalid-offsetof')
227 extra_compile_args.append('-Wno-sign-compare')
Feng Xiaoacd5b052018-08-09 21:21:01 -0700228 extra_compile_args.append('-Wno-unused-variable')
Arun Olappamanna Vasudevanc7e0e262018-07-23 13:35:15 -0700229 extra_compile_args.append('-std=c++11')
Paul Yangc9317432018-04-02 15:55:28 -0700230
Feng Xiaoacd5b052018-08-09 21:21:01 -0700231 if sys.platform == 'darwin':
232 extra_compile_args.append("-Wno-shorten-64-to-32");
Yilun Chong7bcb5222019-02-26 15:47:09 -0800233 extra_compile_args.append("-Wno-deprecated-register");
Feng Xiaoacd5b052018-08-09 21:21:01 -0700234
Paul Yang704037f2018-11-28 16:45:16 -0800235 # https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes
236 # C++ projects must now migrate to libc++ and are recommended to set a
237 # deployment target of macOS 10.9 or later, or iOS 7 or later.
238 if sys.platform == 'darwin':
Thomas BACCELLI26c0fbc2020-12-06 15:40:04 +0100239 mac_target = str(sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET'))
Paul Yang704037f2018-11-28 16:45:16 -0800240 if mac_target and (pkg_resources.parse_version(mac_target) <
241 pkg_resources.parse_version('10.9.0')):
242 os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.9'
243 os.environ['_PYTHON_HOST_PLATFORM'] = re.sub(
244 r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.9-\1',
245 util.get_platform())
246
Paul Yangc9317432018-04-02 15:55:28 -0700247 # https://github.com/Theano/Theano/issues/4926
248 if sys.platform == 'win32':
249 extra_compile_args.append('-D_hypot=hypot')
250
251 # https://github.com/tpaviot/pythonocc-core/issues/48
252 if sys.platform == 'win32' and '64 bit' in sys.version:
253 extra_compile_args.append('-DMS_WIN64')
254
255 # MSVS default is dymanic
Paul Yang3b6d0272018-04-06 15:43:32 -0700256 if (sys.platform == 'win32'):
Paul Yangc9317432018-04-02 15:55:28 -0700257 extra_compile_args.append('/MT')
258
Josh Habermane1abdf22015-12-22 11:13:03 -0800259 if "clang" in os.popen('$CC --version 2> /dev/null').read():
Josh Habermand8814ed2015-10-07 11:46:23 -0700260 extra_compile_args.append('-Wno-shorten-64-to-32')
Josh Haberman00700b72015-10-06 14:13:09 -0700261
262 if warnings_as_errors in sys.argv:
263 extra_compile_args.append('-Werror')
264 sys.argv.remove(warnings_as_errors)
265
jieluo@google.com1eba9d92014-08-25 20:17:53 +0000266 # C++ implementation extension
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700267 ext_module_list.extend([
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700268 Extension(
269 "google.protobuf.pyext._message",
Tamir Duberstein5018c432015-05-08 08:48:40 -0400270 glob.glob('google/protobuf/pyext/*.cc'),
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700271 include_dirs=[".", "../src"],
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700272 libraries=libraries,
273 extra_objects=extra_objects,
Roy Williams7ad0fd42021-04-23 23:03:01 -0400274 extra_link_args=message_extra_link_args,
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700275 library_dirs=['../src/.libs'],
Josh Haberman00700b72015-10-06 14:13:09 -0700276 extra_compile_args=extra_compile_args,
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700277 ),
278 Extension(
279 "google.protobuf.internal._api_implementation",
280 glob.glob('google/protobuf/internal/api_implementation.cc'),
Paul Yangc9317432018-04-02 15:55:28 -0700281 extra_compile_args=extra_compile_args + ['-DPYTHON_PROTO2_CPP_IMPL_V2'],
Roy Williams7ad0fd42021-04-23 23:03:01 -0400282 extra_link_args=api_implementation_link_args,
Manjunath Kudlurcf828de2016-03-25 10:58:46 -0700283 ),
284 ])
Jisi Liuada65562015-02-25 16:39:11 -0800285 os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'cpp'
liujisi@google.com33165fe2010-11-02 13:14:58 +0000286
Dan O'Reilly3791c802015-08-20 20:49:45 -0400287 # Keep this list of dependencies in sync with tox.ini.
Misha Seltzer7daf0aa2020-05-14 21:53:32 -0400288 install_requires = ['six>=1.9']
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400289 if sys.version_info <= (2,7):
290 install_requires.append('ordereddict')
291 install_requires.append('unittest2')
292
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700293 setup(
294 name='protobuf',
295 version=GetVersion(),
296 description='Protocol Buffers',
Feng Xiaoafe98de2018-08-22 11:55:30 -0700297 download_url='https://github.com/protocolbuffers/protobuf/releases',
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700298 long_description="Protocol Buffers are Google's data interchange format",
299 url='https://developers.google.com/protocol-buffers/',
300 maintainer='protobuf@googlegroups.com',
301 maintainer_email='protobuf@googlegroups.com',
Sebastian Schuberth902af082017-02-28 09:58:24 +0100302 license='3-Clause BSD License',
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700303 classifiers=[
Dan O'Reillye47cdd52015-08-12 23:57:46 -0400304 "Programming Language :: Python",
305 "Programming Language :: Python :: 2",
Dan O'Reillye47cdd52015-08-12 23:57:46 -0400306 "Programming Language :: Python :: 2.7",
307 "Programming Language :: Python :: 3",
308 "Programming Language :: Python :: 3.3",
309 "Programming Language :: Python :: 3.4",
Paul Yang4dec4f92018-12-18 18:07:24 -0800310 "Programming Language :: Python :: 3.5",
311 "Programming Language :: Python :: 3.6",
312 "Programming Language :: Python :: 3.7",
Dan O'Reillye47cdd52015-08-12 23:57:46 -0400313 ],
Craig Citro0e7c0c22016-03-04 20:40:24 -0800314 namespace_packages=['google'],
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700315 packages=find_packages(
316 exclude=[
317 'import_test_package',
David L. Jonesff06e232020-08-31 10:40:57 -0700318 'protobuf_distutils',
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700319 ],
320 ),
321 test_suite='google.protobuf.internal',
322 cmdclass={
323 'clean': clean,
324 'build_py': build_py,
Jan Tattermusch0ebbd7d2021-03-30 04:04:16 +0200325 'build_ext': build_ext,
Josh Haberman325392d2015-08-17 12:30:49 -0700326 'test_conformance': test_conformance,
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700327 },
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400328 install_requires=install_requires,
Tamir Duberstein21a7cf92015-04-11 18:24:24 -0700329 ext_modules=ext_module_list,
330 )