protoc_java.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/usr/bin/env python
  2. # Copyright (c) 2012 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. """Generate java source files from protobuf files.
  6. This is the action script for the proto_java_library template.
  7. It performs the following steps:
  8. 1. Deletes all old sources (ensures deleted classes are not part of new jars).
  9. 2. Creates source directory.
  10. 3. Generates Java files using protoc (output into either --java-out-dir or
  11. --srcjar).
  12. 4. Creates a new stamp file.
  13. """
  14. from __future__ import print_function
  15. import argparse
  16. import os
  17. import shutil
  18. import subprocess
  19. import sys
  20. sys.path.append(os.path.join(os.path.dirname(__file__), 'android', 'gyp'))
  21. from util import build_utils
  22. def _HasJavaPackage(proto_lines):
  23. return any(line.strip().startswith('option java_package')
  24. for line in proto_lines)
  25. def _EnforceJavaPackage(proto_srcs):
  26. for proto_path in proto_srcs:
  27. with open(proto_path) as in_proto:
  28. if not _HasJavaPackage(in_proto.readlines()):
  29. raise Exception('Proto files for java must contain a "java_package" '
  30. 'line: {}'.format(proto_path))
  31. def main(argv):
  32. parser = argparse.ArgumentParser()
  33. build_utils.AddDepfileOption(parser)
  34. parser.add_argument('--protoc', required=True, help='Path to protoc binary.')
  35. parser.add_argument('--proto-path',
  36. required=True,
  37. help='Path to proto directory.')
  38. parser.add_argument('--java-out-dir',
  39. help='Path to output directory for java files.')
  40. parser.add_argument('--srcjar', help='Path to output srcjar.')
  41. parser.add_argument('--stamp', help='File to touch on success.')
  42. parser.add_argument(
  43. '--import-dir',
  44. action='append',
  45. default=[],
  46. help='Extra import directory for protos, can be repeated.')
  47. parser.add_argument('protos', nargs='+', help='proto source files')
  48. options = parser.parse_args(argv)
  49. if not options.java_out_dir and not options.srcjar:
  50. raise Exception('One of --java-out-dir or --srcjar must be specified.')
  51. _EnforceJavaPackage(options.protos)
  52. with build_utils.TempDir() as temp_dir:
  53. out_arg = '--java_out=lite:' + temp_dir
  54. proto_path_args = ['--proto_path', options.proto_path]
  55. for path in options.import_dir:
  56. proto_path_args += ["--proto_path", path]
  57. # Generate Java files using protoc.
  58. build_utils.CheckOutput(
  59. [options.protoc] + proto_path_args + [out_arg] + options.protos,
  60. # protoc generates superfluous warnings about LITE_RUNTIME deprecation
  61. # even though we are using the new non-deprecated method.
  62. stderr_filter=lambda output: build_utils.FilterLines(
  63. output, '|'.join([r'optimize_for = LITE_RUNTIME', r'java/lite\.md'])
  64. ))
  65. if options.java_out_dir:
  66. build_utils.DeleteDirectory(options.java_out_dir)
  67. shutil.copytree(temp_dir, options.java_out_dir)
  68. else:
  69. build_utils.ZipDir(options.srcjar, temp_dir)
  70. if options.depfile:
  71. assert options.srcjar
  72. deps = options.protos + [options.protoc]
  73. build_utils.WriteDepfile(options.depfile, options.srcjar, deps)
  74. if options.stamp:
  75. build_utils.Touch(options.stamp)
  76. if __name__ == '__main__':
  77. sys.exit(main(sys.argv[1:]))