1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#! /usr/bin/python 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# See README for usage instructions. 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# We must use setuptools, not distutils, because we need to use the 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# namespace_packages option for the "google" package. 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom ez_setup import use_setuptools 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleuse_setuptools() 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom setuptools import setup 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom distutils.spawn import find_executable 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport os 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport subprocess 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemaintainer_email = "protobuf@googlegroups.com" 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Find the Protocol Compiler. 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif os.path.exists("../src/protoc"): 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protoc = "../src/protoc" 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelif os.path.exists("../src/protoc.exe"): 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protoc = "../src/protoc.exe" 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelse: 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protoc = find_executable("protoc") 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef generate_proto(source): 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Invokes the Protocol Compiler to generate a _pb2.py from the given 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville .proto file. Does nothing if the output already exists and is newer than 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville the input.""" 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = source.replace(".proto", "_pb2.py").replace("../src/", "") 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if not os.path.exists(source): 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville print "Can't find required file: " + source 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sys.exit(-1) 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (not os.path.exists(output) or 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (os.path.exists(source) and 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville os.path.getmtime(source) > os.path.getmtime(output))): 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville print "Generating %s..." % output 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if protoc == None: 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sys.stderr.write( 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "protoc is not installed nor found in ../src. Please compile it " 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "or install the binary package.\n") 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sys.exit(-1) 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if subprocess.call(protoc_command) != 0: 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sys.exit(-1) 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef MakeTestSuite(): 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # This is apparently needed on some systems to make sure that the tests 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # work even if a previous version is already installed. 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if 'google' in sys.modules: 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del sys.modules['google'] 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville generate_proto("../src/google/protobuf/unittest.proto") 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville generate_proto("../src/google/protobuf/unittest_import.proto") 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville generate_proto("../src/google/protobuf/unittest_mset.proto") 61d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville generate_proto("../src/google/protobuf/unittest_no_generic_services.proto") 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville generate_proto("google/protobuf/internal/more_extensions.proto") 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville generate_proto("google/protobuf/internal/more_messages.proto") 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import unittest 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import google.protobuf.internal.generator_test as generator_test 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import google.protobuf.internal.descriptor_test as descriptor_test 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import google.protobuf.internal.reflection_test as reflection_test 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import google.protobuf.internal.service_reflection_test \ 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville as service_reflection_test 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import google.protobuf.internal.text_format_test as text_format_test 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville import google.protobuf.internal.wire_format_test as wire_format_test 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville loader = unittest.defaultTestLoader 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville suite = unittest.TestSuite() 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for test in [ generator_test, 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville descriptor_test, 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_test, 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville service_reflection_test, 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville text_format_test, 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville wire_format_test ]: 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville suite.addTest(loader.loadTestsFromModule(test)) 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return suite 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__': 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(kenton): Integrate this into setuptools somehow? 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if len(sys.argv) >= 2 and sys.argv[1] == "clean": 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Delete generated _pb2.py files and .pyc files in the code tree. 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (dirpath, dirnames, filenames) in os.walk("."): 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for filename in filenames: 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville filepath = os.path.join(dirpath, filename) 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if filepath.endswith("_pb2.py") or filepath.endswith(".pyc"): 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville os.remove(filepath) 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Generate necessary .proto file if it doesn't exist. 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(kenton): Maybe we should hook this into a distutils command? 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville generate_proto("../src/google/protobuf/descriptor.proto") 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setup(name = 'protobuf', 101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville version = '2.3.0', 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville packages = [ 'google' ], 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville namespace_packages = [ 'google' ], 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_suite = 'setup.MakeTestSuite', 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Must list modules explicitly so that we don't install tests. 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville py_modules = [ 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.internal.containers', 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.internal.decoder', 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.internal.encoder', 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.internal.message_listener', 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.internal.type_checkers', 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.internal.wire_format', 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.descriptor', 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.descriptor_pb2', 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.message', 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.reflection', 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.service', 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.service_reflection', 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'google.protobuf.text_format' ], 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville url = 'http://code.google.com/p/protobuf/', 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville maintainer = maintainer_email, 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville maintainer_email = 'protobuf@googlegroups.com', 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville license = 'New BSD License', 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville description = 'Protocol Buffers', 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville long_description = 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffers are Google's data interchange format.", 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ) 128