| OLD | NEW |
| 1 #! /usr/bin/python | 1 #! /usr/bin/python |
| 2 # | 2 # |
| 3 # See README for usage instructions. | 3 # See README for usage instructions. |
| 4 | |
| 5 # We must use setuptools, not distutils, because we need to use the | |
| 6 # namespace_packages option for the "google" package. | |
| 7 from ez_setup import use_setuptools | |
| 8 use_setuptools() | |
| 9 | |
| 10 from setuptools import setup, Extension | |
| 11 from distutils.spawn import find_executable | |
| 12 import sys | 4 import sys |
| 13 import os | 5 import os |
| 14 import subprocess | 6 import subprocess |
| 15 | 7 |
| 8 # We must use setuptools, not distutils, because we need to use the |
| 9 # namespace_packages option for the "google" package. |
| 10 try: |
| 11 from setuptools import setup, Extension |
| 12 except ImportError: |
| 13 try: |
| 14 from ez_setup import use_setuptools |
| 15 use_setuptools() |
| 16 from setuptools import setup, Extension |
| 17 except ImportError: |
| 18 sys.stderr.write( |
| 19 "Could not import setuptools; make sure you have setuptools or " |
| 20 "ez_setup installed.\n") |
| 21 raise |
| 22 from distutils.command.clean import clean as _clean |
| 23 from distutils.command.build_py import build_py as _build_py |
| 24 from distutils.spawn import find_executable |
| 25 |
| 16 maintainer_email = "protobuf@googlegroups.com" | 26 maintainer_email = "protobuf@googlegroups.com" |
| 17 | 27 |
| 18 # Find the Protocol Compiler. | 28 # Find the Protocol Compiler. |
| 19 if os.path.exists("../src/protoc"): | 29 if os.path.exists("../src/protoc"): |
| 20 protoc = "../src/protoc" | 30 protoc = "../src/protoc" |
| 21 elif os.path.exists("../src/protoc.exe"): | 31 elif os.path.exists("../src/protoc.exe"): |
| 22 protoc = "../src/protoc.exe" | 32 protoc = "../src/protoc.exe" |
| 23 elif os.path.exists("../vsprojects/Debug/protoc.exe"): | 33 elif os.path.exists("../vsprojects/Debug/protoc.exe"): |
| 24 protoc = "../vsprojects/Debug/protoc.exe" | 34 protoc = "../vsprojects/Debug/protoc.exe" |
| 25 elif os.path.exists("../vsprojects/Release/protoc.exe"): | 35 elif os.path.exists("../vsprojects/Release/protoc.exe"): |
| 26 protoc = "../vsprojects/Release/protoc.exe" | 36 protoc = "../vsprojects/Release/protoc.exe" |
| 27 else: | 37 else: |
| 28 protoc = find_executable("protoc") | 38 protoc = find_executable("protoc") |
| 29 | 39 |
| 30 def generate_proto(source): | 40 def generate_proto(source): |
| 31 """Invokes the Protocol Compiler to generate a _pb2.py from the given | 41 """Invokes the Protocol Compiler to generate a _pb2.py from the given |
| 32 .proto file. Does nothing if the output already exists and is newer than | 42 .proto file. Does nothing if the output already exists and is newer than |
| 33 the input.""" | 43 the input.""" |
| 34 | 44 |
| 35 output = source.replace(".proto", "_pb2.py").replace("../src/", "") | 45 output = source.replace(".proto", "_pb2.py").replace("../src/", "") |
| 36 | 46 |
| 37 if not os.path.exists(source): | |
| 38 print "Can't find required file: " + source | |
| 39 sys.exit(-1) | |
| 40 | |
| 41 if (not os.path.exists(output) or | 47 if (not os.path.exists(output) or |
| 42 (os.path.exists(source) and | 48 (os.path.exists(source) and |
| 43 os.path.getmtime(source) > os.path.getmtime(output))): | 49 os.path.getmtime(source) > os.path.getmtime(output))): |
| 44 print "Generating %s..." % output | 50 print "Generating %s..." % output |
| 45 | 51 |
| 52 if not os.path.exists(source): |
| 53 sys.stderr.write("Can't find required file: %s\n" % source) |
| 54 sys.exit(-1) |
| 55 |
| 46 if protoc == None: | 56 if protoc == None: |
| 47 sys.stderr.write( | 57 sys.stderr.write( |
| 48 "protoc is not installed nor found in ../src. Please compile it " | 58 "protoc is not installed nor found in ../src. Please compile it " |
| 49 "or install the binary package.\n") | 59 "or install the binary package.\n") |
| 50 sys.exit(-1) | 60 sys.exit(-1) |
| 51 | 61 |
| 52 protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] | 62 protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] |
| 53 if subprocess.call(protoc_command) != 0: | 63 if subprocess.call(protoc_command) != 0: |
| 54 sys.exit(-1) | 64 sys.exit(-1) |
| 55 | 65 |
| 66 def GenerateUnittestProtos(): |
| 67 generate_proto("../src/google/protobuf/unittest.proto") |
| 68 generate_proto("../src/google/protobuf/unittest_custom_options.proto") |
| 69 generate_proto("../src/google/protobuf/unittest_import.proto") |
| 70 generate_proto("../src/google/protobuf/unittest_import_public.proto") |
| 71 generate_proto("../src/google/protobuf/unittest_mset.proto") |
| 72 generate_proto("../src/google/protobuf/unittest_no_generic_services.proto") |
| 73 generate_proto("google/protobuf/internal/test_bad_identifiers.proto") |
| 74 generate_proto("google/protobuf/internal/more_extensions.proto") |
| 75 generate_proto("google/protobuf/internal/more_extensions_dynamic.proto") |
| 76 generate_proto("google/protobuf/internal/more_messages.proto") |
| 77 generate_proto("google/protobuf/internal/factory_test1.proto") |
| 78 generate_proto("google/protobuf/internal/factory_test2.proto") |
| 79 |
| 56 def MakeTestSuite(): | 80 def MakeTestSuite(): |
| 57 # This is apparently needed on some systems to make sure that the tests | 81 # This is apparently needed on some systems to make sure that the tests |
| 58 # work even if a previous version is already installed. | 82 # work even if a previous version is already installed. |
| 59 if 'google' in sys.modules: | 83 if 'google' in sys.modules: |
| 60 del sys.modules['google'] | 84 del sys.modules['google'] |
| 61 | 85 GenerateUnittestProtos() |
| 62 generate_proto("../src/google/protobuf/unittest.proto") | |
| 63 generate_proto("../src/google/protobuf/unittest_custom_options.proto") | |
| 64 generate_proto("../src/google/protobuf/unittest_import.proto") | |
| 65 generate_proto("../src/google/protobuf/unittest_mset.proto") | |
| 66 generate_proto("../src/google/protobuf/unittest_no_generic_services.proto") | |
| 67 generate_proto("google/protobuf/internal/more_extensions.proto") | |
| 68 generate_proto("google/protobuf/internal/more_messages.proto") | |
| 69 | 86 |
| 70 import unittest | 87 import unittest |
| 71 import google.protobuf.internal.generator_test as generator_test | 88 import google.protobuf.internal.generator_test as generator_test |
| 72 import google.protobuf.internal.descriptor_test as descriptor_test | 89 import google.protobuf.internal.descriptor_test as descriptor_test |
| 73 import google.protobuf.internal.reflection_test as reflection_test | 90 import google.protobuf.internal.reflection_test as reflection_test |
| 74 import google.protobuf.internal.service_reflection_test \ | 91 import google.protobuf.internal.service_reflection_test \ |
| 75 as service_reflection_test | 92 as service_reflection_test |
| 76 import google.protobuf.internal.text_format_test as text_format_test | 93 import google.protobuf.internal.text_format_test as text_format_test |
| 77 import google.protobuf.internal.wire_format_test as wire_format_test | 94 import google.protobuf.internal.wire_format_test as wire_format_test |
| 95 import google.protobuf.internal.unknown_fields_test as unknown_fields_test |
| 96 import google.protobuf.internal.descriptor_database_test \ |
| 97 as descriptor_database_test |
| 98 import google.protobuf.internal.descriptor_pool_test as descriptor_pool_test |
| 99 import google.protobuf.internal.message_factory_test as message_factory_test |
| 100 import google.protobuf.internal.message_cpp_test as message_cpp_test |
| 101 import google.protobuf.internal.reflection_cpp_generated_test \ |
| 102 as reflection_cpp_generated_test |
| 78 | 103 |
| 79 loader = unittest.defaultTestLoader | 104 loader = unittest.defaultTestLoader |
| 80 suite = unittest.TestSuite() | 105 suite = unittest.TestSuite() |
| 81 for test in [ generator_test, | 106 for test in [ generator_test, |
| 82 descriptor_test, | 107 descriptor_test, |
| 83 reflection_test, | 108 reflection_test, |
| 84 service_reflection_test, | 109 service_reflection_test, |
| 85 text_format_test, | 110 text_format_test, |
| 86 wire_format_test ]: | 111 wire_format_test ]: |
| 87 suite.addTest(loader.loadTestsFromModule(test)) | 112 suite.addTest(loader.loadTestsFromModule(test)) |
| 88 | 113 |
| 89 return suite | 114 return suite |
| 90 | 115 |
| 91 if __name__ == '__main__': | 116 |
| 92 # TODO(kenton): Integrate this into setuptools somehow? | 117 class clean(_clean): |
| 93 if len(sys.argv) >= 2 and sys.argv[1] == "clean": | 118 def run(self): |
| 94 # Delete generated _pb2.py files and .pyc files in the code tree. | 119 # Delete generated files in the code tree. |
| 95 for (dirpath, dirnames, filenames) in os.walk("."): | 120 for (dirpath, dirnames, filenames) in os.walk("."): |
| 96 for filename in filenames: | 121 for filename in filenames: |
| 97 filepath = os.path.join(dirpath, filename) | 122 filepath = os.path.join(dirpath, filename) |
| 98 if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \ | 123 if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \ |
| 99 filepath.endswith(".so") or filepath.endswith(".o"): | 124 filepath.endswith(".so") or filepath.endswith(".o") or \ |
| 125 filepath.endswith('google/protobuf/compiler/__init__.py'): |
| 100 os.remove(filepath) | 126 os.remove(filepath) |
| 101 else: | 127 # _clean is an old-style class, so super() doesn't work. |
| 128 _clean.run(self) |
| 129 |
| 130 class build_py(_build_py): |
| 131 def run(self): |
| 102 # Generate necessary .proto file if it doesn't exist. | 132 # Generate necessary .proto file if it doesn't exist. |
| 103 # TODO(kenton): Maybe we should hook this into a distutils command? | |
| 104 generate_proto("../src/google/protobuf/descriptor.proto") | 133 generate_proto("../src/google/protobuf/descriptor.proto") |
| 105 generate_proto("../src/google/protobuf/compiler/plugin.proto") | 134 generate_proto("../src/google/protobuf/compiler/plugin.proto") |
| 106 | 135 |
| 136 GenerateUnittestProtos() |
| 137 # Make sure google.protobuf.compiler is a valid package. |
| 138 open('google/protobuf/compiler/__init__.py', 'a').close() |
| 139 # _build_py is an old-style class, so super() doesn't work. |
| 140 _build_py.run(self) |
| 141 |
| 142 if __name__ == '__main__': |
| 107 ext_module_list = [] | 143 ext_module_list = [] |
| 108 | 144 |
| 109 # C++ implementation extension | 145 # C++ implementation extension |
| 110 if os.getenv("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python") == "cpp": | 146 if os.getenv("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python") == "cpp": |
| 111 print "Using EXPERIMENTAL C++ Implmenetation." | 147 print "Using EXPERIMENTAL C++ Implmenetation." |
| 112 ext_module_list.append(Extension( | 148 ext_module_list.append(Extension( |
| 113 "google.protobuf.internal._net_proto2___python", | 149 "google.protobuf.internal._net_proto2___python", |
| 114 [ "google/protobuf/pyext/python_descriptor.cc", | 150 [ "google/protobuf/pyext/python_descriptor.cc", |
| 115 "google/protobuf/pyext/python_protobuf.cc", | 151 "google/protobuf/pyext/python_protobuf.cc", |
| 116 "google/protobuf/pyext/python-proto2.cc" ], | 152 "google/protobuf/pyext/python-proto2.cc" ], |
| (...skipping 13 matching lines...) Expand all Loading... |
| 130 'google.protobuf.internal.decoder', | 166 'google.protobuf.internal.decoder', |
| 131 'google.protobuf.internal.encoder', | 167 'google.protobuf.internal.encoder', |
| 132 'google.protobuf.internal.message_listener', | 168 'google.protobuf.internal.message_listener', |
| 133 'google.protobuf.internal.python_message', | 169 'google.protobuf.internal.python_message', |
| 134 'google.protobuf.internal.type_checkers', | 170 'google.protobuf.internal.type_checkers', |
| 135 'google.protobuf.internal.wire_format', | 171 'google.protobuf.internal.wire_format', |
| 136 'google.protobuf.descriptor', | 172 'google.protobuf.descriptor', |
| 137 'google.protobuf.descriptor_pb2', | 173 'google.protobuf.descriptor_pb2', |
| 138 'google.protobuf.compiler.plugin_pb2', | 174 'google.protobuf.compiler.plugin_pb2', |
| 139 'google.protobuf.message', | 175 'google.protobuf.message', |
| 176 'google.protobuf.descriptor_database', |
| 177 'google.protobuf.descriptor_pool', |
| 178 'google.protobuf.message_factory', |
| 140 'google.protobuf.reflection', | 179 'google.protobuf.reflection', |
| 141 'google.protobuf.service', | 180 'google.protobuf.service', |
| 142 'google.protobuf.service_reflection', | 181 'google.protobuf.service_reflection', |
| 143 'google.protobuf.text_format' ], | 182 'google.protobuf.text_format' ], |
| 183 cmdclass = { 'clean': clean, 'build_py': build_py }, |
| 184 install_requires = ['setuptools'], |
| 144 ext_modules = ext_module_list, | 185 ext_modules = ext_module_list, |
| 145 url = 'http://code.google.com/p/protobuf/', | 186 url = 'http://code.google.com/p/protobuf/', |
| 146 maintainer = maintainer_email, | 187 maintainer = maintainer_email, |
| 147 maintainer_email = 'protobuf@googlegroups.com', | 188 maintainer_email = 'protobuf@googlegroups.com', |
| 148 license = 'New BSD License', | 189 license = 'New BSD License', |
| 149 description = 'Protocol Buffers', | 190 description = 'Protocol Buffers', |
| 150 long_description = | 191 long_description = |
| 151 "Protocol Buffers are Google's data interchange format.", | 192 "Protocol Buffers are Google's data interchange format.", |
| 152 ) | 193 ) |
| OLD | NEW |