Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(866)

Side by Side Diff: third_party/protobuf/python/setup.py

Issue 1291903002: Pull new version of protobuf sources. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Build fix attempts Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/protobuf/python/mox.py ('k') | third_party/protobuf/ruby/.gitignore » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #! /usr/bin/python 1 #! /usr/bin/env python
2 # 2 #
3 # See README for usage instructions. 3 # See README for usage instructions.
4 import sys 4 import glob
5 import os 5 import os
6 import subprocess 6 import subprocess
7 import sys
7 8
8 # We must use setuptools, not distutils, because we need to use the 9 # We must use setuptools, not distutils, because we need to use the
9 # namespace_packages option for the "google" package. 10 # namespace_packages option for the "google" package.
10 try: 11 try:
11 from setuptools import setup, Extension 12 from setuptools import setup, Extension, find_packages
12 except ImportError: 13 except ImportError:
13 try: 14 try:
14 from ez_setup import use_setuptools 15 from ez_setup import use_setuptools
15 use_setuptools() 16 use_setuptools()
16 from setuptools import setup, Extension 17 from setuptools import setup, Extension, find_packages
17 except ImportError: 18 except ImportError:
18 sys.stderr.write( 19 sys.stderr.write(
19 "Could not import setuptools; make sure you have setuptools or " 20 "Could not import setuptools; make sure you have setuptools or "
20 "ez_setup installed.\n") 21 "ez_setup installed.\n"
22 )
21 raise 23 raise
24
22 from distutils.command.clean import clean as _clean 25 from distutils.command.clean import clean as _clean
23 from distutils.command.build_py import build_py as _build_py 26
27 if sys.version_info[0] == 3:
28 # Python 3
29 from distutils.command.build_py import build_py_2to3 as _build_py
30 else:
31 # Python 2
32 from distutils.command.build_py import build_py as _build_py
24 from distutils.spawn import find_executable 33 from distutils.spawn import find_executable
25 34
26 maintainer_email = "protobuf@googlegroups.com"
27
28 # Find the Protocol Compiler. 35 # Find the Protocol Compiler.
29 if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']): 36 if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']):
30 protoc = os.environ['PROTOC'] 37 protoc = os.environ['PROTOC']
31 elif os.path.exists("../src/protoc"): 38 elif os.path.exists("../src/protoc"):
32 protoc = "../src/protoc" 39 protoc = "../src/protoc"
33 elif os.path.exists("../src/protoc.exe"): 40 elif os.path.exists("../src/protoc.exe"):
34 protoc = "../src/protoc.exe" 41 protoc = "../src/protoc.exe"
35 elif os.path.exists("../vsprojects/Debug/protoc.exe"): 42 elif os.path.exists("../vsprojects/Debug/protoc.exe"):
36 protoc = "../vsprojects/Debug/protoc.exe" 43 protoc = "../vsprojects/Debug/protoc.exe"
37 elif os.path.exists("../vsprojects/Release/protoc.exe"): 44 elif os.path.exists("../vsprojects/Release/protoc.exe"):
38 protoc = "../vsprojects/Release/protoc.exe" 45 protoc = "../vsprojects/Release/protoc.exe"
39 else: 46 else:
40 protoc = find_executable("protoc") 47 protoc = find_executable("protoc")
41 48
42 def generate_proto(source): 49
50 def GetVersion():
51 """Gets the version from google/protobuf/__init__.py
52
53 Do not import google.protobuf.__init__ directly, because an installed
54 protobuf library may be loaded instead."""
55
56 with open(os.path.join('google', 'protobuf', '__init__.py')) as version_file:
57 exec(version_file.read(), globals())
58 return __version__
59
60
61 def generate_proto(source, require = True):
43 """Invokes the Protocol Compiler to generate a _pb2.py from the given 62 """Invokes the Protocol Compiler to generate a _pb2.py from the given
44 .proto file. Does nothing if the output already exists and is newer than 63 .proto file. Does nothing if the output already exists and is newer than
45 the input.""" 64 the input."""
46 65
66 if not require and not os.path.exists(source):
67 return
68
47 output = source.replace(".proto", "_pb2.py").replace("../src/", "") 69 output = source.replace(".proto", "_pb2.py").replace("../src/", "")
48 70
49 if (not os.path.exists(output) or 71 if (not os.path.exists(output) or
50 (os.path.exists(source) and 72 (os.path.exists(source) and
51 os.path.getmtime(source) > os.path.getmtime(output))): 73 os.path.getmtime(source) > os.path.getmtime(output))):
52 print "Generating %s..." % output 74 print("Generating %s..." % output)
53 75
54 if not os.path.exists(source): 76 if not os.path.exists(source):
55 sys.stderr.write("Can't find required file: %s\n" % source) 77 sys.stderr.write("Can't find required file: %s\n" % source)
56 sys.exit(-1) 78 sys.exit(-1)
57 79
58 if protoc == None: 80 if protoc is None:
59 sys.stderr.write( 81 sys.stderr.write(
60 "protoc is not installed nor found in ../src. Please compile it " 82 "protoc is not installed nor found in ../src. "
61 "or install the binary package.\n") 83 "Please compile it or install the binary package.\n"
84 )
62 sys.exit(-1) 85 sys.exit(-1)
63 86
64 protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] 87 protoc_command = [protoc, "-I../src", "-I.", "--python_out=.", source]
65 if subprocess.call(protoc_command) != 0: 88 if subprocess.call(protoc_command) != 0:
66 sys.exit(-1) 89 sys.exit(-1)
67 90
91
68 def GenerateUnittestProtos(): 92 def GenerateUnittestProtos():
69 generate_proto("../src/google/protobuf/unittest.proto") 93 generate_proto("../src/google/protobuf/map_unittest.proto", False)
70 generate_proto("../src/google/protobuf/unittest_custom_options.proto") 94 generate_proto("../src/google/protobuf/unittest.proto", False)
71 generate_proto("../src/google/protobuf/unittest_import.proto") 95 generate_proto("../src/google/protobuf/unittest_custom_options.proto", False)
72 generate_proto("../src/google/protobuf/unittest_import_public.proto") 96 generate_proto("../src/google/protobuf/unittest_import.proto", False)
73 generate_proto("../src/google/protobuf/unittest_mset.proto") 97 generate_proto("../src/google/protobuf/unittest_import_public.proto", False)
74 generate_proto("../src/google/protobuf/unittest_no_generic_services.proto") 98 generate_proto("../src/google/protobuf/unittest_mset.proto", False)
75 generate_proto("google/protobuf/internal/test_bad_identifiers.proto") 99 generate_proto("../src/google/protobuf/unittest_no_generic_services.proto", Fa lse)
76 generate_proto("google/protobuf/internal/more_extensions.proto") 100 generate_proto("../src/google/protobuf/unittest_proto3_arena.proto", False)
77 generate_proto("google/protobuf/internal/more_extensions_dynamic.proto") 101 generate_proto("google/protobuf/internal/descriptor_pool_test1.proto", False)
78 generate_proto("google/protobuf/internal/more_messages.proto") 102 generate_proto("google/protobuf/internal/descriptor_pool_test2.proto", False)
79 generate_proto("google/protobuf/internal/factory_test1.proto") 103 generate_proto("google/protobuf/internal/factory_test1.proto", False)
80 generate_proto("google/protobuf/internal/factory_test2.proto") 104 generate_proto("google/protobuf/internal/factory_test2.proto", False)
81 105 generate_proto("google/protobuf/internal/import_test_package/inner.proto", Fal se)
82 def MakeTestSuite(): 106 generate_proto("google/protobuf/internal/import_test_package/outer.proto", Fal se)
83 # This is apparently needed on some systems to make sure that the tests 107 generate_proto("google/protobuf/internal/missing_enum_values.proto", False)
84 # work even if a previous version is already installed. 108 generate_proto("google/protobuf/internal/more_extensions.proto", False)
85 if 'google' in sys.modules: 109 generate_proto("google/protobuf/internal/more_extensions_dynamic.proto", False )
86 del sys.modules['google'] 110 generate_proto("google/protobuf/internal/more_messages.proto", False)
87 GenerateUnittestProtos() 111 generate_proto("google/protobuf/internal/test_bad_identifiers.proto", False)
88 112 generate_proto("google/protobuf/pyext/python.proto", False)
89 import unittest
90 import google.protobuf.internal.generator_test as generator_test
91 import google.protobuf.internal.descriptor_test as descriptor_test
92 import google.protobuf.internal.reflection_test as reflection_test
93 import google.protobuf.internal.service_reflection_test \
94 as service_reflection_test
95 import google.protobuf.internal.text_format_test as text_format_test
96 import google.protobuf.internal.wire_format_test as wire_format_test
97 import google.protobuf.internal.unknown_fields_test as unknown_fields_test
98 import google.protobuf.internal.descriptor_database_test \
99 as descriptor_database_test
100 import google.protobuf.internal.descriptor_pool_test as descriptor_pool_test
101 import google.protobuf.internal.message_factory_test as message_factory_test
102 import google.protobuf.internal.message_cpp_test as message_cpp_test
103 import google.protobuf.internal.reflection_cpp_generated_test \
104 as reflection_cpp_generated_test
105
106 loader = unittest.defaultTestLoader
107 suite = unittest.TestSuite()
108 for test in [ generator_test,
109 descriptor_test,
110 reflection_test,
111 service_reflection_test,
112 text_format_test,
113 wire_format_test ]:
114 suite.addTest(loader.loadTestsFromModule(test))
115
116 return suite
117 113
118 114
119 class clean(_clean): 115 class clean(_clean):
120 def run(self): 116 def run(self):
121 # Delete generated files in the code tree. 117 # Delete generated files in the code tree.
122 for (dirpath, dirnames, filenames) in os.walk("."): 118 for (dirpath, dirnames, filenames) in os.walk("."):
123 for filename in filenames: 119 for filename in filenames:
124 filepath = os.path.join(dirpath, filename) 120 filepath = os.path.join(dirpath, filename)
125 if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \ 121 if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \
126 filepath.endswith(".so") or filepath.endswith(".o") or \ 122 filepath.endswith(".so") or filepath.endswith(".o") or \
127 filepath.endswith('google/protobuf/compiler/__init__.py'): 123 filepath.endswith('google/protobuf/compiler/__init__.py'):
128 os.remove(filepath) 124 os.remove(filepath)
129 # _clean is an old-style class, so super() doesn't work. 125 # _clean is an old-style class, so super() doesn't work.
130 _clean.run(self) 126 _clean.run(self)
131 127
128
132 class build_py(_build_py): 129 class build_py(_build_py):
133 def run(self): 130 def run(self):
134 # Generate necessary .proto file if it doesn't exist. 131 # Generate necessary .proto file if it doesn't exist.
135 generate_proto("../src/google/protobuf/descriptor.proto") 132 generate_proto("../src/google/protobuf/descriptor.proto")
136 generate_proto("../src/google/protobuf/compiler/plugin.proto") 133 generate_proto("../src/google/protobuf/compiler/plugin.proto")
134 GenerateUnittestProtos()
137 135
138 GenerateUnittestProtos() 136 # Make sure google.protobuf/** are valid packages.
139 # Make sure google.protobuf.compiler is a valid package. 137 for path in ['', 'internal/', 'compiler/', 'pyext/']:
140 open('google/protobuf/compiler/__init__.py', 'a').close() 138 try:
139 open('google/protobuf/%s__init__.py' % path, 'a').close()
140 except EnvironmentError:
141 pass
141 # _build_py is an old-style class, so super() doesn't work. 142 # _build_py is an old-style class, so super() doesn't work.
142 _build_py.run(self) 143 _build_py.run(self)
144 # TODO(mrovner): Subclass to run 2to3 on some files only.
145 # Tracing what https://wiki.python.org/moin/PortingPythonToPy3k's
146 # "Approach 2" section on how to get 2to3 to run on source files during
147 # install under Python 3. This class seems like a good place to put logic
148 # that calls python3's distutils.util.run_2to3 on the subset of the files we
149 # have in our release that are subject to conversion.
150 # See code reference in previous code review.
143 151
144 if __name__ == '__main__': 152 if __name__ == '__main__':
145 ext_module_list = [] 153 ext_module_list = []
154 cpp_impl = '--cpp_implementation'
155 if cpp_impl in sys.argv:
156 sys.argv.remove(cpp_impl)
157 # C++ implementation extension
158 ext_module_list.append(
159 Extension(
160 "google.protobuf.pyext._message",
161 glob.glob('google/protobuf/pyext/*.cc'),
162 define_macros=[('GOOGLE_PROTOBUF_HAS_ONEOF', '1')],
163 include_dirs=[".", "../src"],
164 libraries=['protobuf'],
165 library_dirs=['../src/.libs'],
166 )
167 )
168 os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'cpp'
146 169
147 # C++ implementation extension 170 setup(
148 if os.getenv("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python") == "cpp": 171 name='protobuf',
149 print "Using EXPERIMENTAL C++ Implmenetation." 172 version=GetVersion(),
150 ext_module_list.append(Extension( 173 description='Protocol Buffers',
151 "google.protobuf.internal._net_proto2___python", 174 long_description="Protocol Buffers are Google's data interchange format",
152 [ "google/protobuf/pyext/python_descriptor.cc", 175 url='https://developers.google.com/protocol-buffers/',
153 "google/protobuf/pyext/python_protobuf.cc", 176 maintainer='protobuf@googlegroups.com',
154 "google/protobuf/pyext/python-proto2.cc" ], 177 maintainer_email='protobuf@googlegroups.com',
155 include_dirs = [ "." ], 178 license='New BSD License',
156 libraries = [ "protobuf" ])) 179 classifiers=[
157 180 'Programming Language :: Python :: 2.7',
158 setup(name = 'protobuf', 181 ],
159 version = '2.5.0-pre', 182 namespace_packages=['google'],
160 packages = [ 'google' ], 183 packages=find_packages(
161 namespace_packages = [ 'google' ], 184 exclude=[
162 test_suite = 'setup.MakeTestSuite', 185 'import_test_package',
163 # Must list modules explicitly so that we don't install tests. 186 ],
164 py_modules = [ 187 ),
165 'google.protobuf.internal.api_implementation', 188 test_suite='google.protobuf.internal',
166 'google.protobuf.internal.containers', 189 cmdclass={
167 'google.protobuf.internal.cpp_message', 190 'clean': clean,
168 'google.protobuf.internal.decoder', 191 'build_py': build_py,
169 'google.protobuf.internal.encoder', 192 },
170 'google.protobuf.internal.enum_type_wrapper', 193 install_requires=['setuptools'],
171 'google.protobuf.internal.message_listener', 194 ext_modules=ext_module_list,
172 'google.protobuf.internal.python_message', 195 )
173 'google.protobuf.internal.type_checkers',
174 'google.protobuf.internal.wire_format',
175 'google.protobuf.descriptor',
176 'google.protobuf.descriptor_pb2',
177 'google.protobuf.compiler.plugin_pb2',
178 'google.protobuf.message',
179 'google.protobuf.descriptor_database',
180 'google.protobuf.descriptor_pool',
181 'google.protobuf.message_factory',
182 'google.protobuf.reflection',
183 'google.protobuf.service',
184 'google.protobuf.service_reflection',
185 'google.protobuf.text_format' ],
186 cmdclass = { 'clean': clean, 'build_py': build_py },
187 install_requires = ['setuptools'],
188 ext_modules = ext_module_list,
189 url = 'http://code.google.com/p/protobuf/',
190 maintainer = maintainer_email,
191 maintainer_email = 'protobuf@googlegroups.com',
192 license = 'New BSD License',
193 description = 'Protocol Buffers',
194 long_description =
195 "Protocol Buffers are Google's data interchange format.",
196 )
OLDNEW
« no previous file with comments | « third_party/protobuf/python/mox.py ('k') | third_party/protobuf/ruby/.gitignore » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698