xref: /aosp_15_r20/external/angle/build/protoc_java.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*8975f5c5SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors
3*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker
6*8975f5c5SAndroid Build Coastguard Worker"""Generate java source files from protobuf files.
7*8975f5c5SAndroid Build Coastguard Worker
8*8975f5c5SAndroid Build Coastguard WorkerThis is the action script for the proto_java_library template.
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard WorkerIt performs the following steps:
11*8975f5c5SAndroid Build Coastguard Worker1. Deletes all old sources (ensures deleted classes are not part of new jars).
12*8975f5c5SAndroid Build Coastguard Worker2. Creates source directory.
13*8975f5c5SAndroid Build Coastguard Worker3. Generates Java files using protoc (output into either --java-out-dir or
14*8975f5c5SAndroid Build Coastguard Worker   --srcjar).
15*8975f5c5SAndroid Build Coastguard Worker4. Creates a new stamp file.
16*8975f5c5SAndroid Build Coastguard Worker"""
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Workerimport argparse
20*8975f5c5SAndroid Build Coastguard Workerimport os
21*8975f5c5SAndroid Build Coastguard Workerimport shutil
22*8975f5c5SAndroid Build Coastguard Workerimport subprocess
23*8975f5c5SAndroid Build Coastguard Workerimport sys
24*8975f5c5SAndroid Build Coastguard Worker
25*8975f5c5SAndroid Build Coastguard Workerimport action_helpers
26*8975f5c5SAndroid Build Coastguard Workerimport zip_helpers
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__), 'android', 'gyp'))
29*8975f5c5SAndroid Build Coastguard Workerfrom util import build_utils
30*8975f5c5SAndroid Build Coastguard Worker
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Workerdef _HasJavaPackage(proto_lines):
33*8975f5c5SAndroid Build Coastguard Worker  return any(line.strip().startswith('option java_package')
34*8975f5c5SAndroid Build Coastguard Worker             for line in proto_lines)
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Worker
37*8975f5c5SAndroid Build Coastguard Workerdef _EnforceJavaPackage(proto_srcs):
38*8975f5c5SAndroid Build Coastguard Worker  for proto_path in proto_srcs:
39*8975f5c5SAndroid Build Coastguard Worker    with open(proto_path) as in_proto:
40*8975f5c5SAndroid Build Coastguard Worker      if not _HasJavaPackage(in_proto.readlines()):
41*8975f5c5SAndroid Build Coastguard Worker        raise Exception('Proto files for java must contain a "java_package" '
42*8975f5c5SAndroid Build Coastguard Worker                        'line: {}'.format(proto_path))
43*8975f5c5SAndroid Build Coastguard Worker
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Workerdef main(argv):
46*8975f5c5SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
47*8975f5c5SAndroid Build Coastguard Worker  action_helpers.add_depfile_arg(parser)
48*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('--protoc', required=True, help='Path to protoc binary.')
49*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('--plugin', help='Path to plugin executable')
50*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('--proto-path',
51*8975f5c5SAndroid Build Coastguard Worker                      required=True,
52*8975f5c5SAndroid Build Coastguard Worker                      help='Path to proto directory.')
53*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('--java-out-dir',
54*8975f5c5SAndroid Build Coastguard Worker                      help='Path to output directory for java files.')
55*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('--srcjar', help='Path to output srcjar.')
56*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('--stamp', help='File to touch on success.')
57*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
58*8975f5c5SAndroid Build Coastguard Worker      '--import-dir',
59*8975f5c5SAndroid Build Coastguard Worker      action='append',
60*8975f5c5SAndroid Build Coastguard Worker      default=[],
61*8975f5c5SAndroid Build Coastguard Worker      help='Extra import directory for protos, can be repeated.')
62*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument('protos', nargs='+', help='proto source files')
63*8975f5c5SAndroid Build Coastguard Worker  options = parser.parse_args(argv)
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker  if not options.java_out_dir and not options.srcjar:
66*8975f5c5SAndroid Build Coastguard Worker    raise Exception('One of --java-out-dir or --srcjar must be specified.')
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker  _EnforceJavaPackage(options.protos)
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker  with build_utils.TempDir() as temp_dir:
71*8975f5c5SAndroid Build Coastguard Worker    protoc_args = []
72*8975f5c5SAndroid Build Coastguard Worker
73*8975f5c5SAndroid Build Coastguard Worker    generator = 'java'
74*8975f5c5SAndroid Build Coastguard Worker    if options.plugin:
75*8975f5c5SAndroid Build Coastguard Worker      generator = 'plugin'
76*8975f5c5SAndroid Build Coastguard Worker      protoc_args += ['--plugin', 'protoc-gen-plugin=' + options.plugin]
77*8975f5c5SAndroid Build Coastguard Worker
78*8975f5c5SAndroid Build Coastguard Worker    protoc_args += ['--proto_path', options.proto_path]
79*8975f5c5SAndroid Build Coastguard Worker    for path in options.import_dir:
80*8975f5c5SAndroid Build Coastguard Worker      protoc_args += ['--proto_path', path]
81*8975f5c5SAndroid Build Coastguard Worker
82*8975f5c5SAndroid Build Coastguard Worker    protoc_args += ['--' + generator + '_out=lite:' + temp_dir]
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker    # Generate Java files using protoc.
85*8975f5c5SAndroid Build Coastguard Worker    build_utils.CheckOutput(
86*8975f5c5SAndroid Build Coastguard Worker        [options.protoc] + protoc_args + options.protos,
87*8975f5c5SAndroid Build Coastguard Worker        # protoc generates superfluous warnings about LITE_RUNTIME deprecation
88*8975f5c5SAndroid Build Coastguard Worker        # even though we are using the new non-deprecated method.
89*8975f5c5SAndroid Build Coastguard Worker        stderr_filter=lambda output: build_utils.FilterLines(
90*8975f5c5SAndroid Build Coastguard Worker            output, '|'.join([r'optimize_for = LITE_RUNTIME', r'java/lite\.md'])
91*8975f5c5SAndroid Build Coastguard Worker        ))
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker    if options.java_out_dir:
94*8975f5c5SAndroid Build Coastguard Worker      build_utils.DeleteDirectory(options.java_out_dir)
95*8975f5c5SAndroid Build Coastguard Worker      shutil.copytree(temp_dir, options.java_out_dir)
96*8975f5c5SAndroid Build Coastguard Worker    else:
97*8975f5c5SAndroid Build Coastguard Worker      with action_helpers.atomic_output(options.srcjar) as f:
98*8975f5c5SAndroid Build Coastguard Worker        zip_helpers.zip_directory(f, temp_dir)
99*8975f5c5SAndroid Build Coastguard Worker
100*8975f5c5SAndroid Build Coastguard Worker  if options.depfile:
101*8975f5c5SAndroid Build Coastguard Worker    assert options.srcjar
102*8975f5c5SAndroid Build Coastguard Worker    deps = options.protos + [options.protoc]
103*8975f5c5SAndroid Build Coastguard Worker    action_helpers.write_depfile(options.depfile, options.srcjar, deps)
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker  if options.stamp:
106*8975f5c5SAndroid Build Coastguard Worker    build_utils.Touch(options.stamp)
107*8975f5c5SAndroid Build Coastguard Worker
108*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
109*8975f5c5SAndroid Build Coastguard Worker  sys.exit(main(sys.argv[1:]))
110