xref: /aosp_15_r20/external/libchrome/build/protoc_java.py (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker#!/usr/bin/env python
2*635a8641SAndroid Build Coastguard Worker# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3*635a8641SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*635a8641SAndroid Build Coastguard Worker# found in the LICENSE file.
5*635a8641SAndroid Build Coastguard Worker
6*635a8641SAndroid Build Coastguard Worker"""Generate java source files from protobuf files.
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard WorkerThis is a helper file for the genproto_java action in protoc_java.gypi.
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard WorkerIt performs the following steps:
11*635a8641SAndroid Build Coastguard Worker1. Deletes all old sources (ensures deleted classes are not part of new jars).
12*635a8641SAndroid Build Coastguard Worker2. Creates source directory.
13*635a8641SAndroid Build Coastguard Worker3. Generates Java files using protoc (output into either --java-out-dir or
14*635a8641SAndroid Build Coastguard Worker   --srcjar).
15*635a8641SAndroid Build Coastguard Worker4. Creates a new stamp file.
16*635a8641SAndroid Build Coastguard Worker"""
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Workerimport os
19*635a8641SAndroid Build Coastguard Workerimport optparse
20*635a8641SAndroid Build Coastguard Workerimport shutil
21*635a8641SAndroid Build Coastguard Workerimport subprocess
22*635a8641SAndroid Build Coastguard Workerimport sys
23*635a8641SAndroid Build Coastguard Worker
24*635a8641SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__), "android", "gyp"))
25*635a8641SAndroid Build Coastguard Workerfrom util import build_utils
26*635a8641SAndroid Build Coastguard Worker
27*635a8641SAndroid Build Coastguard Workerdef main(argv):
28*635a8641SAndroid Build Coastguard Worker  parser = optparse.OptionParser()
29*635a8641SAndroid Build Coastguard Worker  build_utils.AddDepfileOption(parser)
30*635a8641SAndroid Build Coastguard Worker  parser.add_option("--protoc", help="Path to protoc binary.")
31*635a8641SAndroid Build Coastguard Worker  parser.add_option("--proto-path", help="Path to proto directory.")
32*635a8641SAndroid Build Coastguard Worker  parser.add_option("--java-out-dir",
33*635a8641SAndroid Build Coastguard Worker      help="Path to output directory for java files.")
34*635a8641SAndroid Build Coastguard Worker  parser.add_option("--srcjar", help="Path to output srcjar.")
35*635a8641SAndroid Build Coastguard Worker  parser.add_option("--stamp", help="File to touch on success.")
36*635a8641SAndroid Build Coastguard Worker  parser.add_option("--nano",
37*635a8641SAndroid Build Coastguard Worker      help="Use to generate nano protos.", action='store_true')
38*635a8641SAndroid Build Coastguard Worker  options, args = parser.parse_args(argv)
39*635a8641SAndroid Build Coastguard Worker
40*635a8641SAndroid Build Coastguard Worker  build_utils.CheckOptions(options, parser, ['protoc', 'proto_path'])
41*635a8641SAndroid Build Coastguard Worker  if not options.java_out_dir and not options.srcjar:
42*635a8641SAndroid Build Coastguard Worker    print('One of --java-out-dir or --srcjar must be specified.')
43*635a8641SAndroid Build Coastguard Worker    return 1
44*635a8641SAndroid Build Coastguard Worker
45*635a8641SAndroid Build Coastguard Worker  with build_utils.TempDir() as temp_dir:
46*635a8641SAndroid Build Coastguard Worker    if options.nano:
47*635a8641SAndroid Build Coastguard Worker      # Specify arguments to the generator.
48*635a8641SAndroid Build Coastguard Worker      generator_args = ['optional_field_style=reftypes',
49*635a8641SAndroid Build Coastguard Worker                        'store_unknown_fields=true']
50*635a8641SAndroid Build Coastguard Worker      out_arg = '--javanano_out=' + ','.join(generator_args) + ':' + temp_dir
51*635a8641SAndroid Build Coastguard Worker    else:
52*635a8641SAndroid Build Coastguard Worker      out_arg = '--java_out=' + temp_dir
53*635a8641SAndroid Build Coastguard Worker
54*635a8641SAndroid Build Coastguard Worker      # Check if all proto files (which are listed in the args) are opting to
55*635a8641SAndroid Build Coastguard Worker      # use the lite runtime, otherwise we'd have to include the much heavier
56*635a8641SAndroid Build Coastguard Worker      # regular proto runtime in Chrome.
57*635a8641SAndroid Build Coastguard Worker      # TODO(jkrcal): Replace this check by '--java_lite_out=' for the out_arg
58*635a8641SAndroid Build Coastguard Worker      # above once this works on the master branch of the protobuf library,
59*635a8641SAndroid Build Coastguard Worker      # expected in version 4.0 (see https://crbug.com/800281).
60*635a8641SAndroid Build Coastguard Worker      for proto_file in args:
61*635a8641SAndroid Build Coastguard Worker        if not 'LITE_RUNTIME' in open(proto_file).read():
62*635a8641SAndroid Build Coastguard Worker          raise Exception(
63*635a8641SAndroid Build Coastguard Worker              'Chrome only supports lite protos. Please add "optimize_for = '
64*635a8641SAndroid Build Coastguard Worker              'LITE_RUNTIME" to your proto file to enable the lite runtime.')
65*635a8641SAndroid Build Coastguard Worker    # Generate Java files using protoc.
66*635a8641SAndroid Build Coastguard Worker    build_utils.CheckOutput(
67*635a8641SAndroid Build Coastguard Worker        [options.protoc, '--proto_path', options.proto_path, out_arg]
68*635a8641SAndroid Build Coastguard Worker        + args)
69*635a8641SAndroid Build Coastguard Worker
70*635a8641SAndroid Build Coastguard Worker    if options.java_out_dir:
71*635a8641SAndroid Build Coastguard Worker      build_utils.DeleteDirectory(options.java_out_dir)
72*635a8641SAndroid Build Coastguard Worker      shutil.copytree(temp_dir, options.java_out_dir)
73*635a8641SAndroid Build Coastguard Worker    else:
74*635a8641SAndroid Build Coastguard Worker      build_utils.ZipDir(options.srcjar, temp_dir)
75*635a8641SAndroid Build Coastguard Worker
76*635a8641SAndroid Build Coastguard Worker  if options.depfile:
77*635a8641SAndroid Build Coastguard Worker    assert options.srcjar
78*635a8641SAndroid Build Coastguard Worker    deps = args + [options.protoc]
79*635a8641SAndroid Build Coastguard Worker    build_utils.WriteDepfile(options.depfile, options.srcjar, deps)
80*635a8641SAndroid Build Coastguard Worker
81*635a8641SAndroid Build Coastguard Worker  if options.stamp:
82*635a8641SAndroid Build Coastguard Worker    build_utils.Touch(options.stamp)
83*635a8641SAndroid Build Coastguard Worker
84*635a8641SAndroid Build Coastguard Workerif __name__ == '__main__':
85*635a8641SAndroid Build Coastguard Worker  sys.exit(main(sys.argv[1:]))
86