|  | #!/usr/bin/env python3 | 
|  | # Copyright 2012 The Chromium Authors | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """Generate java source files from protobuf files. | 
|  |  | 
|  | This is the action script for the proto_java_library template. | 
|  |  | 
|  | It performs the following steps: | 
|  | 1. Deletes all old sources (ensures deleted classes are not part of new jars). | 
|  | 2. Creates source directory. | 
|  | 3. Generates Java files using protoc (output into either --java-out-dir or | 
|  | --srcjar). | 
|  | 4. Creates a new stamp file. | 
|  | """ | 
|  |  | 
|  |  | 
|  | import argparse | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | import action_helpers | 
|  | import zip_helpers | 
|  |  | 
|  | sys.path.append(os.path.join(os.path.dirname(__file__), 'android', 'gyp')) | 
|  | from util import build_utils | 
|  |  | 
|  |  | 
|  | def _HasJavaPackage(proto_lines): | 
|  | return any(line.strip().startswith('option java_package') | 
|  | for line in proto_lines) | 
|  |  | 
|  |  | 
|  | def _EnforceJavaPackage(proto_srcs): | 
|  | for proto_path in proto_srcs: | 
|  | with open(proto_path) as in_proto: | 
|  | if not _HasJavaPackage(in_proto.readlines()): | 
|  | raise Exception('Proto files for java must contain a "java_package" ' | 
|  | 'line: {}'.format(proto_path)) | 
|  |  | 
|  |  | 
|  | def main(argv): | 
|  | parser = argparse.ArgumentParser() | 
|  | action_helpers.add_depfile_arg(parser) | 
|  | parser.add_argument('--protoc', required=True, help='Path to protoc binary.') | 
|  | parser.add_argument('--plugin', help='Path to plugin executable') | 
|  | parser.add_argument('--proto-path', | 
|  | required=True, | 
|  | help='Path to proto directory.') | 
|  | parser.add_argument('--java-out-dir', | 
|  | help='Path to output directory for java files.') | 
|  | parser.add_argument('--srcjar', help='Path to output srcjar.') | 
|  | parser.add_argument('--stamp', help='File to touch on success.') | 
|  | parser.add_argument( | 
|  | '--import-dir', | 
|  | action='append', | 
|  | default=[], | 
|  | help='Extra import directory for protos, can be repeated.') | 
|  | parser.add_argument('protos', nargs='+', help='proto source files') | 
|  | options = parser.parse_args(argv) | 
|  |  | 
|  | if not options.java_out_dir and not options.srcjar: | 
|  | raise Exception('One of --java-out-dir or --srcjar must be specified.') | 
|  |  | 
|  | _EnforceJavaPackage(options.protos) | 
|  |  | 
|  | with build_utils.TempDir() as temp_dir: | 
|  | protoc_args = [] | 
|  |  | 
|  | generator = 'java' | 
|  | if options.plugin: | 
|  | generator = 'plugin' | 
|  | protoc_args += ['--plugin', 'protoc-gen-plugin=' + options.plugin] | 
|  |  | 
|  | protoc_args += ['--proto_path', options.proto_path] | 
|  | for path in options.import_dir: | 
|  | protoc_args += ['--proto_path', path] | 
|  |  | 
|  | protoc_args += ['--' + generator + '_out=lite:' + temp_dir] | 
|  |  | 
|  | # Generate Java files using protoc. | 
|  | build_utils.CheckOutput( | 
|  | [options.protoc] + protoc_args + options.protos, | 
|  | # protoc generates superfluous warnings about LITE_RUNTIME deprecation | 
|  | # even though we are using the new non-deprecated method. | 
|  | stderr_filter=lambda output: build_utils.FilterLines( | 
|  | output, '|'.join([r'optimize_for = LITE_RUNTIME', r'java/lite\.md']) | 
|  | )) | 
|  |  | 
|  | if options.java_out_dir: | 
|  | build_utils.DeleteDirectory(options.java_out_dir) | 
|  | shutil.copytree(temp_dir, options.java_out_dir) | 
|  | else: | 
|  | with action_helpers.atomic_output(options.srcjar) as f: | 
|  | zip_helpers.zip_directory(f, temp_dir) | 
|  |  | 
|  | if options.depfile: | 
|  | assert options.srcjar | 
|  | deps = options.protos + [options.protoc] | 
|  | action_helpers.write_depfile(options.depfile, options.srcjar, deps) | 
|  |  | 
|  | if options.stamp: | 
|  | build_utils.Touch(options.stamp) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main(sys.argv[1:])) |