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