xref: /aosp_15_r20/external/cronet/third_party/protobuf/proto_library.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker# Compile a protocol buffer.
6*6777b538SAndroid Build Coastguard Worker#
7*6777b538SAndroid Build Coastguard Worker# Protobuf parameters:
8*6777b538SAndroid Build Coastguard Worker#
9*6777b538SAndroid Build Coastguard Worker#   proto_in_dir (optional)
10*6777b538SAndroid Build Coastguard Worker#       Specifies the path relative to the current BUILD.gn file where
11*6777b538SAndroid Build Coastguard Worker#       proto files are located and the directory structure of
12*6777b538SAndroid Build Coastguard Worker#       this proto library starts.
13*6777b538SAndroid Build Coastguard Worker#
14*6777b538SAndroid Build Coastguard Worker#       This option can be calculated automatically but it will raise an
15*6777b538SAndroid Build Coastguard Worker#       assertion error if any nested directories are found.
16*6777b538SAndroid Build Coastguard Worker#
17*6777b538SAndroid Build Coastguard Worker#   proto_out_dir (optional)
18*6777b538SAndroid Build Coastguard Worker#       Specifies the path suffix that output files are generated under.
19*6777b538SAndroid Build Coastguard Worker#       This path will be appended to |root_gen_dir|, but for python stubs
20*6777b538SAndroid Build Coastguard Worker#       it will be appended to |root_build_dir|/pyproto.
21*6777b538SAndroid Build Coastguard Worker#
22*6777b538SAndroid Build Coastguard Worker#   generate_python (optional, default true)
23*6777b538SAndroid Build Coastguard Worker#       Generate Python protobuf stubs.
24*6777b538SAndroid Build Coastguard Worker#
25*6777b538SAndroid Build Coastguard Worker#   generate_cc (optional, default true)
26*6777b538SAndroid Build Coastguard Worker#       Generate C++ protobuf stubs.
27*6777b538SAndroid Build Coastguard Worker#
28*6777b538SAndroid Build Coastguard Worker#   generate_javascript (optional, default false)
29*6777b538SAndroid Build Coastguard Worker#       Generate Javascript protobuf stubs.
30*6777b538SAndroid Build Coastguard Worker#
31*6777b538SAndroid Build Coastguard Worker#   generate_library (optional, default true)
32*6777b538SAndroid Build Coastguard Worker#       Generate a "static_library" target for linking with the generated code.
33*6777b538SAndroid Build Coastguard Worker#
34*6777b538SAndroid Build Coastguard Worker#   generate_py_runtime (optional, default false)
35*6777b538SAndroid Build Coastguard Worker#       Generates a "_py_runtime"-suffixed target for test targets that need the
36*6777b538SAndroid Build Coastguard Worker#       Python stubs available at runtime.
37*6777b538SAndroid Build Coastguard Worker#
38*6777b538SAndroid Build Coastguard Worker#   cc_generator_options (optional)
39*6777b538SAndroid Build Coastguard Worker#       List of extra flags passed to the protocol compiler.  If you need to
40*6777b538SAndroid Build Coastguard Worker#       add an EXPORT macro to a protobuf's C++ header, set the
41*6777b538SAndroid Build Coastguard Worker#       'cc_generator_options' variable with the value:
42*6777b538SAndroid Build Coastguard Worker#       'dllexport_decl=FOO_EXPORT:' (note trailing colon).
43*6777b538SAndroid Build Coastguard Worker#
44*6777b538SAndroid Build Coastguard Worker#       It is likely you also need to #include a file for the above EXPORT
45*6777b538SAndroid Build Coastguard Worker#       macro to work (see cc_include) and set
46*6777b538SAndroid Build Coastguard Worker#       component_build_force_source_set = true.
47*6777b538SAndroid Build Coastguard Worker#
48*6777b538SAndroid Build Coastguard Worker#   cc_include (optional)
49*6777b538SAndroid Build Coastguard Worker#       String listing an extra include that should be passed.
50*6777b538SAndroid Build Coastguard Worker#       Example: cc_include = "foo/bar.h"
51*6777b538SAndroid Build Coastguard Worker#
52*6777b538SAndroid Build Coastguard Worker#   generator_plugin_label (optional)
53*6777b538SAndroid Build Coastguard Worker#       GN label for plugin executable which generates custom cc stubs.
54*6777b538SAndroid Build Coastguard Worker#       Don't specify a toolchain, host toolchain is assumed.
55*6777b538SAndroid Build Coastguard Worker#
56*6777b538SAndroid Build Coastguard Worker#   generator_plugin_script (optional)
57*6777b538SAndroid Build Coastguard Worker#       Path to plugin script. Mutually exclusive with |generator_plugin_label|.
58*6777b538SAndroid Build Coastguard Worker#
59*6777b538SAndroid Build Coastguard Worker#   generator_plugin_script_deps (optional)
60*6777b538SAndroid Build Coastguard Worker#       List of additional files required for generator plugin script.
61*6777b538SAndroid Build Coastguard Worker#
62*6777b538SAndroid Build Coastguard Worker#   generator_plugin_suffix[es] (required if using a plugin)
63*6777b538SAndroid Build Coastguard Worker#       Suffix (before extension) for generated .cc and .h files
64*6777b538SAndroid Build Coastguard Worker#       or list of suffixes for all files (with extensions).
65*6777b538SAndroid Build Coastguard Worker#
66*6777b538SAndroid Build Coastguard Worker#   generator_plugin_options (optional)
67*6777b538SAndroid Build Coastguard Worker#       Extra flags passed to the plugin. See cc_generator_options.
68*6777b538SAndroid Build Coastguard Worker#
69*6777b538SAndroid Build Coastguard Worker#   deps (optional)
70*6777b538SAndroid Build Coastguard Worker#       DEPRECATED: use proto_deps or link_deps instead (crbug.com/938011).
71*6777b538SAndroid Build Coastguard Worker#       Additional dependencies.
72*6777b538SAndroid Build Coastguard Worker#
73*6777b538SAndroid Build Coastguard Worker#   link_deps (optional)
74*6777b538SAndroid Build Coastguard Worker#       Additional dependencies linked to library.
75*6777b538SAndroid Build Coastguard Worker#
76*6777b538SAndroid Build Coastguard Worker#   proto_deps (optional)
77*6777b538SAndroid Build Coastguard Worker#       Additional dependencies required before running protoc.
78*6777b538SAndroid Build Coastguard Worker#       e.g. proto file generating action.
79*6777b538SAndroid Build Coastguard Worker#
80*6777b538SAndroid Build Coastguard Worker#   proto_data_sources (optional)
81*6777b538SAndroid Build Coastguard Worker#       Additional proto sources that will only be used for references
82*6777b538SAndroid Build Coastguard Worker#       and will not be compiled.
83*6777b538SAndroid Build Coastguard Worker#       This should be used in conjunction with import_dirs.
84*6777b538SAndroid Build Coastguard Worker#
85*6777b538SAndroid Build Coastguard Worker#   use_protobuf_full (optional)
86*6777b538SAndroid Build Coastguard Worker#       If adding protobuf library would be required, adds protobuf_full to deps
87*6777b538SAndroid Build Coastguard Worker#       instead of protobuf_lite.
88*6777b538SAndroid Build Coastguard Worker#
89*6777b538SAndroid Build Coastguard Worker#   import_dirs (optional)
90*6777b538SAndroid Build Coastguard Worker#       A list of extra import directories to be passed to protoc compiler.
91*6777b538SAndroid Build Coastguard Worker#       WARNING: This circumvents proto checkdeps, and should only be used when
92*6777b538SAndroid Build Coastguard Worker#       needed, typically when proto files cannot cleanly import through
93*6777b538SAndroid Build Coastguard Worker#       absolute paths, such as for third_party or generated .proto files.
94*6777b538SAndroid Build Coastguard Worker#       http://crbug.com/691451 tracks fixing this.
95*6777b538SAndroid Build Coastguard Worker#
96*6777b538SAndroid Build Coastguard Worker# Parameters for compiling the generated code:
97*6777b538SAndroid Build Coastguard Worker#
98*6777b538SAndroid Build Coastguard Worker#   force_source_set (Default=false)
99*6777b538SAndroid Build Coastguard Worker#       When set true the generated code will be compiled as a source set.
100*6777b538SAndroid Build Coastguard Worker#       This can be useful if you need to export the generated symbols from a
101*6777b538SAndroid Build Coastguard Worker#       shared library. You should use this carefully, as you probably only
102*6777b538SAndroid Build Coastguard Worker#       want this if your dependencies are *always* shared libraries. Most
103*6777b538SAndroid Build Coastguard Worker#       of the time, you probably want `component_build_force_source_set`
104*6777b538SAndroid Build Coastguard Worker#       instead (see the next option).
105*6777b538SAndroid Build Coastguard Worker#   component_build_force_source_set (Default=false)
106*6777b538SAndroid Build Coastguard Worker#       When set true the generated code will be compiled as a source set in
107*6777b538SAndroid Build Coastguard Worker#       the component build. This does not affect static builds.  If you are
108*6777b538SAndroid Build Coastguard Worker#       exporting symbols from a component, this is required to prevent those
109*6777b538SAndroid Build Coastguard Worker#       symbols from being stripped. If you're not using dllexports in
110*6777b538SAndroid Build Coastguard Worker#       cc_generator_options, it's usually best to leave this false.
111*6777b538SAndroid Build Coastguard Worker#
112*6777b538SAndroid Build Coastguard Worker#   defines (optional)
113*6777b538SAndroid Build Coastguard Worker#       Defines to supply to the source set that compiles the generated source
114*6777b538SAndroid Build Coastguard Worker#       code.
115*6777b538SAndroid Build Coastguard Worker#
116*6777b538SAndroid Build Coastguard Worker#   extra_configs (optional)
117*6777b538SAndroid Build Coastguard Worker#       A list of config labels that will be appended to the configs applying
118*6777b538SAndroid Build Coastguard Worker#       to the source set.
119*6777b538SAndroid Build Coastguard Worker#
120*6777b538SAndroid Build Coastguard Worker#   remove_configs (optional)
121*6777b538SAndroid Build Coastguard Worker#       A list of config labels that will be removed from the configs apllying
122*6777b538SAndroid Build Coastguard Worker#       to the source set.
123*6777b538SAndroid Build Coastguard Worker#
124*6777b538SAndroid Build Coastguard Worker#   propagate_imports_configs (optional)
125*6777b538SAndroid Build Coastguard Worker#       A boolean value (defaults to true) that specifies whether the config
126*6777b538SAndroid Build Coastguard Worker#       generated for the library's import directories will be propagated to
127*6777b538SAndroid Build Coastguard Worker#       dependents as one of the library target's public_configs. See
128*6777b538SAndroid Build Coastguard Worker#       crbug.com/1043279#c11 and crbug.com/gn/142 for why this option exists.
129*6777b538SAndroid Build Coastguard Worker#       WARNING: If set to false, the embedder target is responsible for
130*6777b538SAndroid Build Coastguard Worker#       propagating a suitable config, so that any dependent headers can resolve
131*6777b538SAndroid Build Coastguard Worker#       includes generated by proto imports.
132*6777b538SAndroid Build Coastguard Worker#
133*6777b538SAndroid Build Coastguard Worker# Example:
134*6777b538SAndroid Build Coastguard Worker#  proto_library("mylib") {
135*6777b538SAndroid Build Coastguard Worker#    sources = [
136*6777b538SAndroid Build Coastguard Worker#      "foo.proto",
137*6777b538SAndroid Build Coastguard Worker#    ]
138*6777b538SAndroid Build Coastguard Worker#  }
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard Workerimport("//build/config/cronet/config.gni")
141*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni")
142*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/kythe.gni")
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Workerdeclare_args() {
145*6777b538SAndroid Build Coastguard Worker  # Allows subprojects to omit javascript dependencies (e.g.) closure_compiler
146*6777b538SAndroid Build Coastguard Worker  # and google-closure-library.
147*6777b538SAndroid Build Coastguard Worker  enable_js_protobuf = !is_cronet_build
148*6777b538SAndroid Build Coastguard Worker}
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Workerif (enable_js_protobuf) {
151*6777b538SAndroid Build Coastguard Worker  import("//third_party/closure_compiler/compile_js.gni")
152*6777b538SAndroid Build Coastguard Worker}
153*6777b538SAndroid Build Coastguard Worker
154*6777b538SAndroid Build Coastguard Workerif (host_os == "win") {
155*6777b538SAndroid Build Coastguard Worker  _host_executable_suffix = ".exe"
156*6777b538SAndroid Build Coastguard Worker} else {
157*6777b538SAndroid Build Coastguard Worker  _host_executable_suffix = ""
158*6777b538SAndroid Build Coastguard Worker}
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker_protoc_label = "//third_party/protobuf:protoc($host_toolchain)"
161*6777b538SAndroid Build Coastguard Worker_protoc_path = get_label_info(_protoc_label, "root_out_dir") + "/protoc" +
162*6777b538SAndroid Build Coastguard Worker               _host_executable_suffix
163*6777b538SAndroid Build Coastguard Worker_protoc_gen_js_label =
164*6777b538SAndroid Build Coastguard Worker    "//third_party/protobuf-javascript:protoc-gen-js($host_toolchain)"
165*6777b538SAndroid Build Coastguard Worker_protoc_gen_js_path = get_label_info(_protoc_gen_js_label, "root_out_dir") +
166*6777b538SAndroid Build Coastguard Worker                      "/protoc-gen-js" + _host_executable_suffix
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Workertemplate("proto_library") {
169*6777b538SAndroid Build Coastguard Worker  assert(defined(invoker.sources), "Need sources for proto_library")
170*6777b538SAndroid Build Coastguard Worker  proto_sources = invoker.sources
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generate_cc)) {
173*6777b538SAndroid Build Coastguard Worker    generate_cc = invoker.generate_cc
174*6777b538SAndroid Build Coastguard Worker  } else {
175*6777b538SAndroid Build Coastguard Worker    generate_cc = true
176*6777b538SAndroid Build Coastguard Worker  }
177*6777b538SAndroid Build Coastguard Worker
178*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generate_python)) {
179*6777b538SAndroid Build Coastguard Worker    generate_python = invoker.generate_python
180*6777b538SAndroid Build Coastguard Worker  } else {
181*6777b538SAndroid Build Coastguard Worker    generate_python = true
182*6777b538SAndroid Build Coastguard Worker  }
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generate_javascript)) {
185*6777b538SAndroid Build Coastguard Worker    generate_javascript = invoker.generate_javascript
186*6777b538SAndroid Build Coastguard Worker  } else {
187*6777b538SAndroid Build Coastguard Worker    generate_javascript = false
188*6777b538SAndroid Build Coastguard Worker  }
189*6777b538SAndroid Build Coastguard Worker
190*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generate_descriptor)) {
191*6777b538SAndroid Build Coastguard Worker    generate_descriptor = invoker.generate_descriptor
192*6777b538SAndroid Build Coastguard Worker  } else {
193*6777b538SAndroid Build Coastguard Worker    generate_descriptor = ""
194*6777b538SAndroid Build Coastguard Worker  }
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generate_py_runtime)) {
197*6777b538SAndroid Build Coastguard Worker    generate_py_runtime = invoker.generate_py_runtime
198*6777b538SAndroid Build Coastguard Worker  } else {
199*6777b538SAndroid Build Coastguard Worker    generate_py_runtime = false
200*6777b538SAndroid Build Coastguard Worker  }
201*6777b538SAndroid Build Coastguard Worker  if (generate_py_runtime) {
202*6777b538SAndroid Build Coastguard Worker    generate_python = true
203*6777b538SAndroid Build Coastguard Worker  }
204*6777b538SAndroid Build Coastguard Worker
205*6777b538SAndroid Build Coastguard Worker  # exclude_imports is only used for generating the descriptor. Therefore, the
206*6777b538SAndroid Build Coastguard Worker  # check needs to be here to avoid complaints from GN about the unused
207*6777b538SAndroid Build Coastguard Worker  # variable.
208*6777b538SAndroid Build Coastguard Worker  if (generate_descriptor != "") {
209*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.exclude_imports)) {
210*6777b538SAndroid Build Coastguard Worker      exclude_imports = invoker.exclude_imports
211*6777b538SAndroid Build Coastguard Worker    } else {
212*6777b538SAndroid Build Coastguard Worker      exclude_imports = false
213*6777b538SAndroid Build Coastguard Worker    }
214*6777b538SAndroid Build Coastguard Worker  }
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generator_plugin_label)) {
217*6777b538SAndroid Build Coastguard Worker    # Straightforward way to get the name of executable doesn't work because
218*6777b538SAndroid Build Coastguard Worker    # |root_out_dir| and |root_build_dir| may differ in cross-compilation and
219*6777b538SAndroid Build Coastguard Worker    # also Windows executables have .exe at the end.
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker    plugin_host_label = invoker.generator_plugin_label + "($host_toolchain)"
222*6777b538SAndroid Build Coastguard Worker    plugin_path =
223*6777b538SAndroid Build Coastguard Worker        get_label_info(plugin_host_label, "root_out_dir") + "/" +
224*6777b538SAndroid Build Coastguard Worker        get_label_info(plugin_host_label, "name") + _host_executable_suffix
225*6777b538SAndroid Build Coastguard Worker    generate_with_plugin = true
226*6777b538SAndroid Build Coastguard Worker  } else if (defined(invoker.generator_plugin_script)) {
227*6777b538SAndroid Build Coastguard Worker    plugin_path = invoker.generator_plugin_script
228*6777b538SAndroid Build Coastguard Worker    generate_with_plugin = true
229*6777b538SAndroid Build Coastguard Worker  } else {
230*6777b538SAndroid Build Coastguard Worker    generate_with_plugin = false
231*6777b538SAndroid Build Coastguard Worker  }
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker  if (generate_with_plugin) {
234*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.generator_plugin_suffix)) {
235*6777b538SAndroid Build Coastguard Worker      generator_plugin_suffixes = [
236*6777b538SAndroid Build Coastguard Worker        "${invoker.generator_plugin_suffix}.h",
237*6777b538SAndroid Build Coastguard Worker        "${invoker.generator_plugin_suffix}.cc",
238*6777b538SAndroid Build Coastguard Worker      ]
239*6777b538SAndroid Build Coastguard Worker    } else {
240*6777b538SAndroid Build Coastguard Worker      generator_plugin_suffixes = invoker.generator_plugin_suffixes
241*6777b538SAndroid Build Coastguard Worker    }
242*6777b538SAndroid Build Coastguard Worker  }
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.proto_in_dir)) {
245*6777b538SAndroid Build Coastguard Worker    proto_in_dir = invoker.proto_in_dir
246*6777b538SAndroid Build Coastguard Worker    has_nested_dirs = false
247*6777b538SAndroid Build Coastguard Worker    foreach(proto_source, proto_sources) {
248*6777b538SAndroid Build Coastguard Worker      if (get_path_info(proto_source, "dir") != proto_in_dir) {
249*6777b538SAndroid Build Coastguard Worker        has_nested_dirs = true
250*6777b538SAndroid Build Coastguard Worker      }
251*6777b538SAndroid Build Coastguard Worker    }
252*6777b538SAndroid Build Coastguard Worker  } else {
253*6777b538SAndroid Build Coastguard Worker    proto_in_dir = get_path_info(proto_sources[0], "dir")
254*6777b538SAndroid Build Coastguard Worker    has_nested_dirs = false
255*6777b538SAndroid Build Coastguard Worker
256*6777b538SAndroid Build Coastguard Worker    # Sanity check, |proto_in_dir| should be defined to allow sub-directories.
257*6777b538SAndroid Build Coastguard Worker    foreach(proto_source, proto_sources) {
258*6777b538SAndroid Build Coastguard Worker      assert(get_path_info(proto_source, "dir") == proto_in_dir,
259*6777b538SAndroid Build Coastguard Worker             "Please define |proto_in_dir| to allow nested directories.")
260*6777b538SAndroid Build Coastguard Worker    }
261*6777b538SAndroid Build Coastguard Worker  }
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker  # Avoid absolute path because of the assumption that |proto_in_dir| is
264*6777b538SAndroid Build Coastguard Worker  # relative to the directory of current BUILD.gn file.
265*6777b538SAndroid Build Coastguard Worker  proto_in_dir = rebase_path(proto_in_dir, ".")
266*6777b538SAndroid Build Coastguard Worker
267*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.proto_out_dir)) {
268*6777b538SAndroid Build Coastguard Worker    proto_out_dir = invoker.proto_out_dir
269*6777b538SAndroid Build Coastguard Worker  } else {
270*6777b538SAndroid Build Coastguard Worker    # Absolute path to the directory of current BUILD.gn file excluding "//".
271*6777b538SAndroid Build Coastguard Worker    proto_out_dir = rebase_path(".", "//")
272*6777b538SAndroid Build Coastguard Worker    if (proto_in_dir != ".") {
273*6777b538SAndroid Build Coastguard Worker      proto_out_dir += "/$proto_in_dir"
274*6777b538SAndroid Build Coastguard Worker    }
275*6777b538SAndroid Build Coastguard Worker  }
276*6777b538SAndroid Build Coastguard Worker
277*6777b538SAndroid Build Coastguard Worker  # We need both absolute path to use in GN statements and a relative one
278*6777b538SAndroid Build Coastguard Worker  # to pass to external script.
279*6777b538SAndroid Build Coastguard Worker  if (generate_cc || generate_with_plugin) {
280*6777b538SAndroid Build Coastguard Worker    cc_out_dir = "$root_gen_dir/" + proto_out_dir
281*6777b538SAndroid Build Coastguard Worker    rel_cc_out_dir = rebase_path(cc_out_dir, root_build_dir)
282*6777b538SAndroid Build Coastguard Worker  }
283*6777b538SAndroid Build Coastguard Worker  if (generate_python) {
284*6777b538SAndroid Build Coastguard Worker    py_out_dir = "$root_out_dir/pyproto/" + proto_out_dir
285*6777b538SAndroid Build Coastguard Worker    rel_py_out_dir = rebase_path(py_out_dir, root_build_dir)
286*6777b538SAndroid Build Coastguard Worker  }
287*6777b538SAndroid Build Coastguard Worker  if (generate_javascript) {
288*6777b538SAndroid Build Coastguard Worker    js_out_dir = "$root_out_dir/jsproto/" + proto_out_dir
289*6777b538SAndroid Build Coastguard Worker    rel_js_out_dir = rebase_path(js_out_dir, root_build_dir)
290*6777b538SAndroid Build Coastguard Worker  }
291*6777b538SAndroid Build Coastguard Worker  if (generate_descriptor != "") {
292*6777b538SAndroid Build Coastguard Worker    descriptor_out =
293*6777b538SAndroid Build Coastguard Worker        "$root_gen_dir/" + proto_out_dir + "/" + generate_descriptor
294*6777b538SAndroid Build Coastguard Worker    rel_descriptor_out = rebase_path(descriptor_out, root_build_dir)
295*6777b538SAndroid Build Coastguard Worker  }
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Worker  protos = rebase_path(invoker.sources, proto_in_dir)
298*6777b538SAndroid Build Coastguard Worker  protogens = []
299*6777b538SAndroid Build Coastguard Worker  protogens_py = []
300*6777b538SAndroid Build Coastguard Worker  protogens_cc = []
301*6777b538SAndroid Build Coastguard Worker  protogens_js = []
302*6777b538SAndroid Build Coastguard Worker
303*6777b538SAndroid Build Coastguard Worker  # Whether source code bindings should be generated.
304*6777b538SAndroid Build Coastguard Worker  generate_sources = generate_cc || generate_python || generate_with_plugin ||
305*6777b538SAndroid Build Coastguard Worker                     generate_javascript
306*6777b538SAndroid Build Coastguard Worker
307*6777b538SAndroid Build Coastguard Worker  # Whether library should be generated.
308*6777b538SAndroid Build Coastguard Worker  # Library is not needed when proto_library is used to generate binary descriptor, in which case
309*6777b538SAndroid Build Coastguard Worker  # corresponding library target should be omitted entirely.
310*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.generate_library)) {
311*6777b538SAndroid Build Coastguard Worker    generate_library = invoker.generate_library
312*6777b538SAndroid Build Coastguard Worker  } else {
313*6777b538SAndroid Build Coastguard Worker    generate_library = generate_sources
314*6777b538SAndroid Build Coastguard Worker  }
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker  # List output files.
317*6777b538SAndroid Build Coastguard Worker  if (generate_sources) {
318*6777b538SAndroid Build Coastguard Worker    foreach(proto, protos) {
319*6777b538SAndroid Build Coastguard Worker      proto_dir = get_path_info(proto, "dir")
320*6777b538SAndroid Build Coastguard Worker      proto_name = get_path_info(proto, "name")
321*6777b538SAndroid Build Coastguard Worker      proto_path = proto_dir + "/" + proto_name
322*6777b538SAndroid Build Coastguard Worker
323*6777b538SAndroid Build Coastguard Worker      if (generate_cc) {
324*6777b538SAndroid Build Coastguard Worker        protogens_cc += [
325*6777b538SAndroid Build Coastguard Worker          "$cc_out_dir/$proto_path.pb.h",
326*6777b538SAndroid Build Coastguard Worker          "$cc_out_dir/$proto_path.pb.cc",
327*6777b538SAndroid Build Coastguard Worker        ]
328*6777b538SAndroid Build Coastguard Worker      }
329*6777b538SAndroid Build Coastguard Worker      if (generate_python) {
330*6777b538SAndroid Build Coastguard Worker        protogens_py += [ "$py_out_dir/${proto_path}_pb2.py" ]
331*6777b538SAndroid Build Coastguard Worker      }
332*6777b538SAndroid Build Coastguard Worker      if (generate_with_plugin) {
333*6777b538SAndroid Build Coastguard Worker        foreach(suffix, generator_plugin_suffixes) {
334*6777b538SAndroid Build Coastguard Worker          protogens_cc += [ "$cc_out_dir/${proto_path}${suffix}" ]
335*6777b538SAndroid Build Coastguard Worker        }
336*6777b538SAndroid Build Coastguard Worker      }
337*6777b538SAndroid Build Coastguard Worker      if (generate_javascript) {
338*6777b538SAndroid Build Coastguard Worker        protogens_js += [ "$js_out_dir/${proto_path}.js" ]
339*6777b538SAndroid Build Coastguard Worker      }
340*6777b538SAndroid Build Coastguard Worker    }
341*6777b538SAndroid Build Coastguard Worker  }
342*6777b538SAndroid Build Coastguard Worker
343*6777b538SAndroid Build Coastguard Worker  # If descriptor needs to be generated, it should be added to list of outputs once.
344*6777b538SAndroid Build Coastguard Worker  if (generate_descriptor != "") {
345*6777b538SAndroid Build Coastguard Worker    protogens += [ descriptor_out ]
346*6777b538SAndroid Build Coastguard Worker  }
347*6777b538SAndroid Build Coastguard Worker
348*6777b538SAndroid Build Coastguard Worker  action_name = "${target_name}_gen"
349*6777b538SAndroid Build Coastguard Worker  source_set_name = target_name
350*6777b538SAndroid Build Coastguard Worker  javascript_name = "${target_name}_js"
351*6777b538SAndroid Build Coastguard Worker  py_runtime_name = "${target_name}_py_runtime"
352*6777b538SAndroid Build Coastguard Worker
353*6777b538SAndroid Build Coastguard Worker  # Generate protobuf stubs.
354*6777b538SAndroid Build Coastguard Worker  action(action_name) {
355*6777b538SAndroid Build Coastguard Worker    visibility = [
356*6777b538SAndroid Build Coastguard Worker      ":$javascript_name",
357*6777b538SAndroid Build Coastguard Worker      ":$py_runtime_name",
358*6777b538SAndroid Build Coastguard Worker      ":$source_set_name",
359*6777b538SAndroid Build Coastguard Worker    ]
360*6777b538SAndroid Build Coastguard Worker    script = "//tools/protoc_wrapper/protoc_wrapper.py"
361*6777b538SAndroid Build Coastguard Worker    args = protos
362*6777b538SAndroid Build Coastguard Worker
363*6777b538SAndroid Build Coastguard Worker    sources = proto_sources
364*6777b538SAndroid Build Coastguard Worker    outputs =
365*6777b538SAndroid Build Coastguard Worker        get_path_info(protogens + protogens_cc + protogens_js + protogens_py,
366*6777b538SAndroid Build Coastguard Worker                      "abspath")
367*6777b538SAndroid Build Coastguard Worker
368*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.testonly)) {
369*6777b538SAndroid Build Coastguard Worker      testonly = invoker.testonly
370*6777b538SAndroid Build Coastguard Worker    }
371*6777b538SAndroid Build Coastguard Worker
372*6777b538SAndroid Build Coastguard Worker    args += [
373*6777b538SAndroid Build Coastguard Worker      # Wrapper should never pick a system protoc.
374*6777b538SAndroid Build Coastguard Worker      # Path should be rebased because |root_build_dir| for current toolchain
375*6777b538SAndroid Build Coastguard Worker      # may be different from |root_out_dir| of protoc built on host toolchain.
376*6777b538SAndroid Build Coastguard Worker      "--protoc",
377*6777b538SAndroid Build Coastguard Worker      "./" + rebase_path(_protoc_path, root_build_dir),
378*6777b538SAndroid Build Coastguard Worker      "--proto-in-dir",
379*6777b538SAndroid Build Coastguard Worker      rebase_path(proto_in_dir, root_build_dir),
380*6777b538SAndroid Build Coastguard Worker    ]
381*6777b538SAndroid Build Coastguard Worker
382*6777b538SAndroid Build Coastguard Worker    if (generate_cc) {
383*6777b538SAndroid Build Coastguard Worker      args += [
384*6777b538SAndroid Build Coastguard Worker        "--cc-out-dir",
385*6777b538SAndroid Build Coastguard Worker        rel_cc_out_dir,
386*6777b538SAndroid Build Coastguard Worker      ]
387*6777b538SAndroid Build Coastguard Worker      if (enable_kythe_annotations) {
388*6777b538SAndroid Build Coastguard Worker        args += [ "--enable-kythe-annotation" ]
389*6777b538SAndroid Build Coastguard Worker      }
390*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.cc_generator_options)) {
391*6777b538SAndroid Build Coastguard Worker        args += [
392*6777b538SAndroid Build Coastguard Worker          "--cc-options",
393*6777b538SAndroid Build Coastguard Worker          invoker.cc_generator_options,
394*6777b538SAndroid Build Coastguard Worker        ]
395*6777b538SAndroid Build Coastguard Worker      }
396*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.cc_include)) {
397*6777b538SAndroid Build Coastguard Worker        args += [
398*6777b538SAndroid Build Coastguard Worker          "--include",
399*6777b538SAndroid Build Coastguard Worker          invoker.cc_include,
400*6777b538SAndroid Build Coastguard Worker        ]
401*6777b538SAndroid Build Coastguard Worker      }
402*6777b538SAndroid Build Coastguard Worker    }
403*6777b538SAndroid Build Coastguard Worker
404*6777b538SAndroid Build Coastguard Worker    if (generate_python) {
405*6777b538SAndroid Build Coastguard Worker      args += [
406*6777b538SAndroid Build Coastguard Worker        "--py-out-dir",
407*6777b538SAndroid Build Coastguard Worker        rel_py_out_dir,
408*6777b538SAndroid Build Coastguard Worker      ]
409*6777b538SAndroid Build Coastguard Worker    }
410*6777b538SAndroid Build Coastguard Worker
411*6777b538SAndroid Build Coastguard Worker    if (generate_javascript) {
412*6777b538SAndroid Build Coastguard Worker      args += [
413*6777b538SAndroid Build Coastguard Worker        "--js-out-dir",
414*6777b538SAndroid Build Coastguard Worker        rel_js_out_dir,
415*6777b538SAndroid Build Coastguard Worker        "--protoc-gen-js",
416*6777b538SAndroid Build Coastguard Worker        "./" + rebase_path(_protoc_gen_js_path, root_build_dir),
417*6777b538SAndroid Build Coastguard Worker      ]
418*6777b538SAndroid Build Coastguard Worker    }
419*6777b538SAndroid Build Coastguard Worker
420*6777b538SAndroid Build Coastguard Worker    if (generate_with_plugin) {
421*6777b538SAndroid Build Coastguard Worker      args += [
422*6777b538SAndroid Build Coastguard Worker        "--plugin",
423*6777b538SAndroid Build Coastguard Worker        rebase_path(plugin_path, root_build_dir),
424*6777b538SAndroid Build Coastguard Worker        "--plugin-out-dir",
425*6777b538SAndroid Build Coastguard Worker        rel_cc_out_dir,
426*6777b538SAndroid Build Coastguard Worker      ]
427*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.generator_plugin_options)) {
428*6777b538SAndroid Build Coastguard Worker        args += [
429*6777b538SAndroid Build Coastguard Worker          "--plugin-options",
430*6777b538SAndroid Build Coastguard Worker          invoker.generator_plugin_options,
431*6777b538SAndroid Build Coastguard Worker        ]
432*6777b538SAndroid Build Coastguard Worker      }
433*6777b538SAndroid Build Coastguard Worker    }
434*6777b538SAndroid Build Coastguard Worker
435*6777b538SAndroid Build Coastguard Worker    if (generate_descriptor != "") {
436*6777b538SAndroid Build Coastguard Worker      depfile =
437*6777b538SAndroid Build Coastguard Worker          "$root_gen_dir/" + proto_out_dir + "/" + generate_descriptor + ".d"
438*6777b538SAndroid Build Coastguard Worker      rel_depfile = rebase_path(depfile, root_build_dir)
439*6777b538SAndroid Build Coastguard Worker
440*6777b538SAndroid Build Coastguard Worker      if (exclude_imports) {
441*6777b538SAndroid Build Coastguard Worker        args += [ "--exclude-imports" ]
442*6777b538SAndroid Build Coastguard Worker      }
443*6777b538SAndroid Build Coastguard Worker
444*6777b538SAndroid Build Coastguard Worker      args += [
445*6777b538SAndroid Build Coastguard Worker        "--descriptor-set-out",
446*6777b538SAndroid Build Coastguard Worker        rel_descriptor_out,
447*6777b538SAndroid Build Coastguard Worker        "--descriptor-set-dependency-file",
448*6777b538SAndroid Build Coastguard Worker        rel_depfile,
449*6777b538SAndroid Build Coastguard Worker      ]
450*6777b538SAndroid Build Coastguard Worker    }
451*6777b538SAndroid Build Coastguard Worker    inputs = []
452*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.proto_data_sources)) {
453*6777b538SAndroid Build Coastguard Worker      inputs += invoker.proto_data_sources
454*6777b538SAndroid Build Coastguard Worker    }
455*6777b538SAndroid Build Coastguard Worker
456*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.import_dirs)) {
457*6777b538SAndroid Build Coastguard Worker      foreach(path, invoker.import_dirs) {
458*6777b538SAndroid Build Coastguard Worker        args += [ "--import-dir=" + rebase_path(path, root_build_dir) ]
459*6777b538SAndroid Build Coastguard Worker      }
460*6777b538SAndroid Build Coastguard Worker    }
461*6777b538SAndroid Build Coastguard Worker
462*6777b538SAndroid Build Coastguard Worker    # System protoc is not used so it's necessary to build a chromium one.
463*6777b538SAndroid Build Coastguard Worker    inputs += [ _protoc_path ]
464*6777b538SAndroid Build Coastguard Worker    deps = [ _protoc_label ]
465*6777b538SAndroid Build Coastguard Worker
466*6777b538SAndroid Build Coastguard Worker    if (enable_js_protobuf) {
467*6777b538SAndroid Build Coastguard Worker      inputs += [ _protoc_gen_js_path ]
468*6777b538SAndroid Build Coastguard Worker      deps += [ _protoc_gen_js_label ]
469*6777b538SAndroid Build Coastguard Worker    }
470*6777b538SAndroid Build Coastguard Worker
471*6777b538SAndroid Build Coastguard Worker    if (generate_with_plugin) {
472*6777b538SAndroid Build Coastguard Worker      inputs += [ plugin_path ]
473*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.generator_plugin_script_deps)) {
474*6777b538SAndroid Build Coastguard Worker        # Additional scripts for plugin.
475*6777b538SAndroid Build Coastguard Worker        inputs += invoker.generator_plugin_script_deps
476*6777b538SAndroid Build Coastguard Worker      }
477*6777b538SAndroid Build Coastguard Worker      if (defined(plugin_host_label)) {
478*6777b538SAndroid Build Coastguard Worker        # Action depends on native generator plugin but for host toolchain only.
479*6777b538SAndroid Build Coastguard Worker        deps += [ plugin_host_label ]
480*6777b538SAndroid Build Coastguard Worker      }
481*6777b538SAndroid Build Coastguard Worker    }
482*6777b538SAndroid Build Coastguard Worker
483*6777b538SAndroid Build Coastguard Worker    # The deps may have steps that have to run before running protoc.
484*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.proto_deps)) {
485*6777b538SAndroid Build Coastguard Worker      deps += invoker.proto_deps
486*6777b538SAndroid Build Coastguard Worker    }
487*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
488*6777b538SAndroid Build Coastguard Worker      deps += invoker.deps
489*6777b538SAndroid Build Coastguard Worker    }
490*6777b538SAndroid Build Coastguard Worker  }
491*6777b538SAndroid Build Coastguard Worker
492*6777b538SAndroid Build Coastguard Worker  if (!generate_library) {
493*6777b538SAndroid Build Coastguard Worker    # If only descriptor is required, just generate a group wrapper for action output.
494*6777b538SAndroid Build Coastguard Worker    link_target_type = "group"
495*6777b538SAndroid Build Coastguard Worker  } else if ((defined(invoker.force_source_set) && invoker.force_source_set) ||
496*6777b538SAndroid Build Coastguard Worker             (defined(invoker.component_build_force_source_set) &&
497*6777b538SAndroid Build Coastguard Worker              invoker.component_build_force_source_set && is_component_build)) {
498*6777b538SAndroid Build Coastguard Worker    # Option to disable building a library in component build.
499*6777b538SAndroid Build Coastguard Worker    link_target_type = "source_set"
500*6777b538SAndroid Build Coastguard Worker  } else {
501*6777b538SAndroid Build Coastguard Worker    link_target_type = "static_library"
502*6777b538SAndroid Build Coastguard Worker  }
503*6777b538SAndroid Build Coastguard Worker
504*6777b538SAndroid Build Coastguard Worker  # Generated files may include other generated headers. These includes always
505*6777b538SAndroid Build Coastguard Worker  # use relative paths starting at |cc_out_dir|.
506*6777b538SAndroid Build Coastguard Worker  # However there is no necessity to add an additional directory, if all protos
507*6777b538SAndroid Build Coastguard Worker  # are located in the same directory which is in the search path by default.
508*6777b538SAndroid Build Coastguard Worker  config_name = "${target_name}_config"
509*6777b538SAndroid Build Coastguard Worker  config(config_name) {
510*6777b538SAndroid Build Coastguard Worker    include_dirs = []
511*6777b538SAndroid Build Coastguard Worker    if (has_nested_dirs && generate_cc) {
512*6777b538SAndroid Build Coastguard Worker      include_dirs += [ cc_out_dir ]
513*6777b538SAndroid Build Coastguard Worker    }
514*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.import_dirs)) {
515*6777b538SAndroid Build Coastguard Worker      foreach(path, invoker.import_dirs) {
516*6777b538SAndroid Build Coastguard Worker        include_dirs += [ "$root_gen_dir/" + rebase_path(path, "//") ]
517*6777b538SAndroid Build Coastguard Worker      }
518*6777b538SAndroid Build Coastguard Worker    }
519*6777b538SAndroid Build Coastguard Worker  }
520*6777b538SAndroid Build Coastguard Worker
521*6777b538SAndroid Build Coastguard Worker  # Build generated javascript stubs.
522*6777b538SAndroid Build Coastguard Worker  if (generate_javascript) {
523*6777b538SAndroid Build Coastguard Worker    js_library(javascript_name) {
524*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
525*6777b538SAndroid Build Coastguard Worker                             [
526*6777b538SAndroid Build Coastguard Worker                               "testonly",
527*6777b538SAndroid Build Coastguard Worker                               "visibility",
528*6777b538SAndroid Build Coastguard Worker                             ])
529*6777b538SAndroid Build Coastguard Worker
530*6777b538SAndroid Build Coastguard Worker      sources = protogens_js
531*6777b538SAndroid Build Coastguard Worker
532*6777b538SAndroid Build Coastguard Worker      deps = [ "//third_party/protobuf:js_proto" ]
533*6777b538SAndroid Build Coastguard Worker
534*6777b538SAndroid Build Coastguard Worker      extra_deps = [ ":$action_name" ]
535*6777b538SAndroid Build Coastguard Worker    }
536*6777b538SAndroid Build Coastguard Worker  }
537*6777b538SAndroid Build Coastguard Worker
538*6777b538SAndroid Build Coastguard Worker  # Build generated protobuf stubs as libary or source set.
539*6777b538SAndroid Build Coastguard Worker  target(link_target_type, target_name) {
540*6777b538SAndroid Build Coastguard Worker    forward_variables_from(invoker,
541*6777b538SAndroid Build Coastguard Worker                           [
542*6777b538SAndroid Build Coastguard Worker                             "defines",
543*6777b538SAndroid Build Coastguard Worker                             "testonly",
544*6777b538SAndroid Build Coastguard Worker                             "visibility",
545*6777b538SAndroid Build Coastguard Worker                           ])
546*6777b538SAndroid Build Coastguard Worker
547*6777b538SAndroid Build Coastguard Worker    if (generate_library) {
548*6777b538SAndroid Build Coastguard Worker      sources = get_path_info(protogens_cc, "abspath")
549*6777b538SAndroid Build Coastguard Worker
550*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.remove_configs)) {
551*6777b538SAndroid Build Coastguard Worker        configs -= invoker.remove_configs
552*6777b538SAndroid Build Coastguard Worker      }
553*6777b538SAndroid Build Coastguard Worker
554*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.extra_configs)) {
555*6777b538SAndroid Build Coastguard Worker        configs += invoker.extra_configs
556*6777b538SAndroid Build Coastguard Worker      }
557*6777b538SAndroid Build Coastguard Worker
558*6777b538SAndroid Build Coastguard Worker      # Remove Sanitizer and coverage instrumentation for a performance boost when
559*6777b538SAndroid Build Coastguard Worker      # fuzzing, since the only fuzzers that use protobuf are libprotobuf-mutator
560*6777b538SAndroid Build Coastguard Worker      # based fuzzers, and they don't actually target protobuf code.
561*6777b538SAndroid Build Coastguard Worker      configs -= not_fuzzed_remove_configs
562*6777b538SAndroid Build Coastguard Worker      configs += [ "//build/config/sanitizers:not_fuzzed" ]
563*6777b538SAndroid Build Coastguard Worker    }
564*6777b538SAndroid Build Coastguard Worker
565*6777b538SAndroid Build Coastguard Worker    public_configs = [
566*6777b538SAndroid Build Coastguard Worker      "//third_party/protobuf:using_proto",
567*6777b538SAndroid Build Coastguard Worker      "//third_party/protobuf:allow_deprecated_proto_fields",
568*6777b538SAndroid Build Coastguard Worker    ]
569*6777b538SAndroid Build Coastguard Worker    public_deps = []
570*6777b538SAndroid Build Coastguard Worker
571*6777b538SAndroid Build Coastguard Worker    if (generate_cc || generate_with_plugin) {
572*6777b538SAndroid Build Coastguard Worker      # Not necessary if all protos are located in the same directory.
573*6777b538SAndroid Build Coastguard Worker      if (has_nested_dirs || defined(invoker.import_dirs)) {
574*6777b538SAndroid Build Coastguard Worker        # By default, propagate the config for |include_dirs| to dependent
575*6777b538SAndroid Build Coastguard Worker        # targets, so that public imports can be resolved to corresponding
576*6777b538SAndroid Build Coastguard Worker        # header files. In some cases, the embedder target handles include
577*6777b538SAndroid Build Coastguard Worker        # directory propagation itself, e.g. via a common config.
578*6777b538SAndroid Build Coastguard Worker        propagate_imports_configs =
579*6777b538SAndroid Build Coastguard Worker            !defined(invoker.propagate_imports_configs) ||
580*6777b538SAndroid Build Coastguard Worker            invoker.propagate_imports_configs
581*6777b538SAndroid Build Coastguard Worker        if (propagate_imports_configs) {
582*6777b538SAndroid Build Coastguard Worker          public_configs += [ ":$config_name" ]
583*6777b538SAndroid Build Coastguard Worker        } else {
584*6777b538SAndroid Build Coastguard Worker          # Embedder handles include directory propagation to dependents.
585*6777b538SAndroid Build Coastguard Worker          configs += [ ":$config_name" ]
586*6777b538SAndroid Build Coastguard Worker        }
587*6777b538SAndroid Build Coastguard Worker      }
588*6777b538SAndroid Build Coastguard Worker
589*6777b538SAndroid Build Coastguard Worker      # If using built-in cc generator, the resulting headers reference headers
590*6777b538SAndroid Build Coastguard Worker      # within protobuf_lite. Hence, dependencies require those headers too.
591*6777b538SAndroid Build Coastguard Worker      # If using generator plugin, extra deps should be resolved by the invoker.
592*6777b538SAndroid Build Coastguard Worker      if (generate_cc) {
593*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.use_protobuf_full) &&
594*6777b538SAndroid Build Coastguard Worker            invoker.use_protobuf_full == true) {
595*6777b538SAndroid Build Coastguard Worker          public_deps += [ "//third_party/protobuf:protobuf_full" ]
596*6777b538SAndroid Build Coastguard Worker        } else {
597*6777b538SAndroid Build Coastguard Worker          public_deps += [ "//third_party/protobuf:protobuf_lite" ]
598*6777b538SAndroid Build Coastguard Worker        }
599*6777b538SAndroid Build Coastguard Worker
600*6777b538SAndroid Build Coastguard Worker        if (is_win) {
601*6777b538SAndroid Build Coastguard Worker          cflags = [
602*6777b538SAndroid Build Coastguard Worker            # disable: C4125 decimal digit terminates octal escape sequence
603*6777b538SAndroid Build Coastguard Worker            # Protoc generates such sequences frequently, there's no obvious
604*6777b538SAndroid Build Coastguard Worker            # superior replacement behavior. Since this code is autogenerated,
605*6777b538SAndroid Build Coastguard Worker            # the warning would never catch a legitimate bug.
606*6777b538SAndroid Build Coastguard Worker            "/wd4125",
607*6777b538SAndroid Build Coastguard Worker          ]
608*6777b538SAndroid Build Coastguard Worker        }
609*6777b538SAndroid Build Coastguard Worker      }
610*6777b538SAndroid Build Coastguard Worker    }
611*6777b538SAndroid Build Coastguard Worker
612*6777b538SAndroid Build Coastguard Worker    public_deps += [ ":$action_name" ]
613*6777b538SAndroid Build Coastguard Worker    deps = []
614*6777b538SAndroid Build Coastguard Worker
615*6777b538SAndroid Build Coastguard Worker    # This will link any libraries in the deps (the use of invoker.deps in the
616*6777b538SAndroid Build Coastguard Worker    # action won't link it).
617*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
618*6777b538SAndroid Build Coastguard Worker      deps += invoker.deps
619*6777b538SAndroid Build Coastguard Worker    }
620*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.link_deps)) {
621*6777b538SAndroid Build Coastguard Worker      deps += invoker.link_deps
622*6777b538SAndroid Build Coastguard Worker    }
623*6777b538SAndroid Build Coastguard Worker  }
624*6777b538SAndroid Build Coastguard Worker
625*6777b538SAndroid Build Coastguard Worker  if (generate_py_runtime) {
626*6777b538SAndroid Build Coastguard Worker    group(py_runtime_name) {
627*6777b538SAndroid Build Coastguard Worker      data = protogens_py
628*6777b538SAndroid Build Coastguard Worker      deps = [
629*6777b538SAndroid Build Coastguard Worker        ":$action_name",
630*6777b538SAndroid Build Coastguard Worker        "//third_party/protobuf:py_proto_runtime",
631*6777b538SAndroid Build Coastguard Worker      ]
632*6777b538SAndroid Build Coastguard Worker    }
633*6777b538SAndroid Build Coastguard Worker  }
634*6777b538SAndroid Build Coastguard Worker}
635*6777b538SAndroid Build Coastguard Worker
636*6777b538SAndroid Build Coastguard Worker# Convert a protocol buffer between text and binary formats.
637*6777b538SAndroid Build Coastguard Worker# This can be used to run protoc with the --encode or --decode options.
638*6777b538SAndroid Build Coastguard Worker# Parameters:
639*6777b538SAndroid Build Coastguard Worker#
640*6777b538SAndroid Build Coastguard Worker#   sources: list of string
641*6777b538SAndroid Build Coastguard Worker#       The sources to loop over and run protoc on
642*6777b538SAndroid Build Coastguard Worker#
643*6777b538SAndroid Build Coastguard Worker#   inputs: list of string
644*6777b538SAndroid Build Coastguard Worker#       The file dependencies for the action. This should be the list of .proto
645*6777b538SAndroid Build Coastguard Worker#       files involved in the conversion operation.
646*6777b538SAndroid Build Coastguard Worker#
647*6777b538SAndroid Build Coastguard Worker#   output_pattern: string
648*6777b538SAndroid Build Coastguard Worker#       A path pattern with source expansion variables (like source_name_part)
649*6777b538SAndroid Build Coastguard Worker#       for where the result of conversion should be placed.
650*6777b538SAndroid Build Coastguard Worker#
651*6777b538SAndroid Build Coastguard Worker#   deps: (optional) list of label
652*6777b538SAndroid Build Coastguard Worker#       Additional dependencies for the target.
653*6777b538SAndroid Build Coastguard Worker#
654*6777b538SAndroid Build Coastguard Worker#   args: list of string
655*6777b538SAndroid Build Coastguard Worker#       Arguments to pass to the protoc tool. This could include -I for include
656*6777b538SAndroid Build Coastguard Worker#       paths, as well as the name of the proto file.
657*6777b538SAndroid Build Coastguard Worker#
658*6777b538SAndroid Build Coastguard Worker#
659*6777b538SAndroid Build Coastguard Worker# Example to convert a .textproto to a .binarybp:
660*6777b538SAndroid Build Coastguard Worker#   protoc_convert("convert_foo") {
661*6777b538SAndroid Build Coastguard Worker#     sources = [
662*6777b538SAndroid Build Coastguard Worker#       "test/data/example1.textproto",
663*6777b538SAndroid Build Coastguard Worker#       "test/data/example2.textproto",
664*6777b538SAndroid Build Coastguard Worker#     ]
665*6777b538SAndroid Build Coastguard Worker#     inputs = [
666*6777b538SAndroid Build Coastguard Worker#       "//component/core/foo.proto",
667*6777b538SAndroid Build Coastguard Worker#     ]
668*6777b538SAndroid Build Coastguard Worker#     output_pattern = "$target_gen_dir/foo_data/{{source_name_part}}.binarypb"
669*6777b538SAndroid Build Coastguard Worker#     args = [
670*6777b538SAndroid Build Coastguard Worker#       "--encode=foo.FooMessage",
671*6777b538SAndroid Build Coastguard Worker#       "-I",
672*6777b538SAndroid Build Coastguard Worker#       rebase_path("//"),
673*6777b538SAndroid Build Coastguard Worker#       "component/core/foo.proto",
674*6777b538SAndroid Build Coastguard Worker#     ]
675*6777b538SAndroid Build Coastguard Worker#   }
676*6777b538SAndroid Build Coastguard Workertemplate("protoc_convert") {
677*6777b538SAndroid Build Coastguard Worker  action_foreach(target_name) {
678*6777b538SAndroid Build Coastguard Worker    script = "//tools/protoc_wrapper/protoc_convert.py"
679*6777b538SAndroid Build Coastguard Worker
680*6777b538SAndroid Build Coastguard Worker    sources = invoker.sources
681*6777b538SAndroid Build Coastguard Worker
682*6777b538SAndroid Build Coastguard Worker    inputs = invoker.inputs
683*6777b538SAndroid Build Coastguard Worker
684*6777b538SAndroid Build Coastguard Worker    deps = [ _protoc_label ]
685*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
686*6777b538SAndroid Build Coastguard Worker      deps += invoker.deps
687*6777b538SAndroid Build Coastguard Worker    }
688*6777b538SAndroid Build Coastguard Worker
689*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.testonly)) {
690*6777b538SAndroid Build Coastguard Worker      testonly = invoker.testonly
691*6777b538SAndroid Build Coastguard Worker    }
692*6777b538SAndroid Build Coastguard Worker
693*6777b538SAndroid Build Coastguard Worker    outputs = [ invoker.output_pattern ]
694*6777b538SAndroid Build Coastguard Worker
695*6777b538SAndroid Build Coastguard Worker    args = [
696*6777b538SAndroid Build Coastguard Worker             "--protoc",
697*6777b538SAndroid Build Coastguard Worker             "./" + rebase_path(_protoc_path, root_build_dir),
698*6777b538SAndroid Build Coastguard Worker             "--infile",
699*6777b538SAndroid Build Coastguard Worker             "{{source}}",
700*6777b538SAndroid Build Coastguard Worker             "--outfile",
701*6777b538SAndroid Build Coastguard Worker             rebase_path(invoker.output_pattern),
702*6777b538SAndroid Build Coastguard Worker           ] + invoker.args
703*6777b538SAndroid Build Coastguard Worker  }
704*6777b538SAndroid Build Coastguard Worker}
705