xref: /aosp_15_r20/external/libchrome/mojo/public/tools/bindings/mojom.gni (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker# found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Workerimport("//build/config/jumbo.gni")
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker# TODO(rockot): Maybe we can factor these dependencies out of //mojo. They're
8*635a8641SAndroid Build Coastguard Worker# used to conditionally enable message ID scrambling in a way which is
9*635a8641SAndroid Build Coastguard Worker# consistent across toolchains and which is affected by branded vs non-branded
10*635a8641SAndroid Build Coastguard Worker# Chrome builds. Ideally we could create some generic knobs here that could be
11*635a8641SAndroid Build Coastguard Worker# flipped elsewhere though.
12*635a8641SAndroid Build Coastguard Workerimport("//build/config/chrome_build.gni")
13*635a8641SAndroid Build Coastguard Workerimport("//build/config/nacl/config.gni")
14*635a8641SAndroid Build Coastguard Workerimport("//components/nacl/features.gni")
15*635a8641SAndroid Build Coastguard Workerimport("//third_party/jinja2/jinja2.gni")
16*635a8641SAndroid Build Coastguard Workerimport("//tools/ipc_fuzzer/ipc_fuzzer.gni")
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Workerdeclare_args() {
19*635a8641SAndroid Build Coastguard Worker  # Indicates whether typemapping should be supported in this build
20*635a8641SAndroid Build Coastguard Worker  # configuration. This may be disabled when building external projects which
21*635a8641SAndroid Build Coastguard Worker  # depend on //mojo but which do not need/want all of the Chromium tree
22*635a8641SAndroid Build Coastguard Worker  # dependencies that come with typemapping.
23*635a8641SAndroid Build Coastguard Worker  #
24*635a8641SAndroid Build Coastguard Worker  # Note that (perhaps obviously) a huge amount of Chromium code will not build
25*635a8641SAndroid Build Coastguard Worker  # with typemapping disabled, so it is never valid to set this to |false| in
26*635a8641SAndroid Build Coastguard Worker  # any Chromium build configuration.
27*635a8641SAndroid Build Coastguard Worker  enable_mojom_typemapping = true
28*635a8641SAndroid Build Coastguard Worker
29*635a8641SAndroid Build Coastguard Worker  # Controls message ID scrambling behavior. If |true|, message IDs are
30*635a8641SAndroid Build Coastguard Worker  # scrambled (i.e. randomized based on the contents of //chrome/VERSION) on
31*635a8641SAndroid Build Coastguard Worker  # non-Chrome OS desktop platforms. Set to |false| to disable message ID
32*635a8641SAndroid Build Coastguard Worker  # scrambling on all platforms.
33*635a8641SAndroid Build Coastguard Worker  enable_mojom_message_id_scrambling = true
34*635a8641SAndroid Build Coastguard Worker}
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker# NOTE: We would like to avoid scrambling message IDs where it doesn't add
37*635a8641SAndroid Build Coastguard Worker# value, so we limit the behavior to desktop builds for now. There is some
38*635a8641SAndroid Build Coastguard Worker# redundancy in the conditions here, but it is tolerated for clarity:
39*635a8641SAndroid Build Coastguard Worker# We're explicit about Mac, Windows, and Linux desktop support, but it's
40*635a8641SAndroid Build Coastguard Worker# also necessary to ensure that bindings in alternate toolchains (e.g.
41*635a8641SAndroid Build Coastguard Worker# NaCl IRT) are always consistent with the default toolchain; for that
42*635a8641SAndroid Build Coastguard Worker# reason we always enable scrambling within NaCl toolchains when possible,
43*635a8641SAndroid Build Coastguard Worker# as well as within the default toolchain when NaCl is enabled.
44*635a8641SAndroid Build Coastguard Worker#
45*635a8641SAndroid Build Coastguard Worker# Finally, because we *cannot* enable scrambling on Chrome OS (it would break
46*635a8641SAndroid Build Coastguard Worker# ARC) we have to explicitly opt out there even when NaCl is enabled (and
47*635a8641SAndroid Build Coastguard Worker# consequently also when building for NaCl toolchains.) For this reason we
48*635a8641SAndroid Build Coastguard Worker# check |target_os| explicitly, as it's consistent across all toolchains.
49*635a8641SAndroid Build Coastguard Workerenable_scrambled_message_ids =
50*635a8641SAndroid Build Coastguard Worker    enable_mojom_message_id_scrambling &&
51*635a8641SAndroid Build Coastguard Worker    (is_mac || is_win || (is_linux && !is_chromeos) ||
52*635a8641SAndroid Build Coastguard Worker     ((enable_nacl || is_nacl || is_nacl_nonsfi) && target_os != "chromeos"))
53*635a8641SAndroid Build Coastguard Worker
54*635a8641SAndroid Build Coastguard Workermojom_generator_root = "//mojo/public/tools/bindings"
55*635a8641SAndroid Build Coastguard Workermojom_generator_script = "$mojom_generator_root/mojom_bindings_generator.py"
56*635a8641SAndroid Build Coastguard Workermojom_generator_sources = [
57*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/generators/mojom_cpp_generator.py",
58*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/generators/mojom_js_generator.py",
59*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/generators/mojom_java_generator.py",
60*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/__init__.py",
61*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/error.py",
62*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/__init__.py",
63*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/constant_resolver.py",
64*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/generator.py",
65*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/module.py",
66*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/pack.py",
67*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/template_expander.py",
68*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/generate/translate.py",
69*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/parse/__init__.py",
70*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/parse/ast.py",
71*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/parse/lexer.py",
72*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_root/pylib/mojom/parse/parser.py",
73*635a8641SAndroid Build Coastguard Worker  "$mojom_generator_script",
74*635a8641SAndroid Build Coastguard Worker]
75*635a8641SAndroid Build Coastguard Worker
76*635a8641SAndroid Build Coastguard Workerif (enable_scrambled_message_ids) {
77*635a8641SAndroid Build Coastguard Worker  declare_args() {
78*635a8641SAndroid Build Coastguard Worker    # The path to a file whose contents can be used as the basis for a message
79*635a8641SAndroid Build Coastguard Worker    # ID scrambling salt.
80*635a8641SAndroid Build Coastguard Worker    mojom_message_id_salt_path = "//chrome/VERSION"
81*635a8641SAndroid Build Coastguard Worker
82*635a8641SAndroid Build Coastguard Worker    # The path to a file whose contents will be concatenated to the contents of
83*635a8641SAndroid Build Coastguard Worker    # the file at |mojom_message_id_salt_path| to form a complete salt for
84*635a8641SAndroid Build Coastguard Worker    # message ID scrambling. May be the empty string, in which case the contents
85*635a8641SAndroid Build Coastguard Worker    # of the above file alone are used as the complete salt.
86*635a8641SAndroid Build Coastguard Worker    if (is_chrome_branded) {
87*635a8641SAndroid Build Coastguard Worker      mojom_message_id_salt_suffix_path =
88*635a8641SAndroid Build Coastguard Worker          "//mojo/internal/chrome-message-id-salt-suffix"
89*635a8641SAndroid Build Coastguard Worker    } else {
90*635a8641SAndroid Build Coastguard Worker      mojom_message_id_salt_suffix_path = ""
91*635a8641SAndroid Build Coastguard Worker    }
92*635a8641SAndroid Build Coastguard Worker  }
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Worker  assert(mojom_message_id_salt_path != "")
95*635a8641SAndroid Build Coastguard Worker  message_scrambling_args = [
96*635a8641SAndroid Build Coastguard Worker    "--scrambled_message_id_salt_path",
97*635a8641SAndroid Build Coastguard Worker    rebase_path(mojom_message_id_salt_path, root_build_dir),
98*635a8641SAndroid Build Coastguard Worker  ]
99*635a8641SAndroid Build Coastguard Worker  message_scrambling_inputs = [ mojom_message_id_salt_path ]
100*635a8641SAndroid Build Coastguard Worker
101*635a8641SAndroid Build Coastguard Worker  if (mojom_message_id_salt_suffix_path != "") {
102*635a8641SAndroid Build Coastguard Worker    message_scrambling_args += [
103*635a8641SAndroid Build Coastguard Worker      "--scrambled_message_id_salt_path",
104*635a8641SAndroid Build Coastguard Worker      rebase_path(mojom_message_id_salt_suffix_path, root_build_dir),
105*635a8641SAndroid Build Coastguard Worker    ]
106*635a8641SAndroid Build Coastguard Worker    message_scrambling_inputs += [ mojom_message_id_salt_suffix_path ]
107*635a8641SAndroid Build Coastguard Worker  }
108*635a8641SAndroid Build Coastguard Worker} else {
109*635a8641SAndroid Build Coastguard Worker  message_scrambling_args = []
110*635a8641SAndroid Build Coastguard Worker  message_scrambling_inputs = []
111*635a8641SAndroid Build Coastguard Worker}
112*635a8641SAndroid Build Coastguard Worker
113*635a8641SAndroid Build Coastguard Workerif (enable_mojom_typemapping) {
114*635a8641SAndroid Build Coastguard Worker  if (!is_ios) {
115*635a8641SAndroid Build Coastguard Worker    _bindings_configuration_files = [
116*635a8641SAndroid Build Coastguard Worker      "//mojo/public/tools/bindings/chromium_bindings_configuration.gni",
117*635a8641SAndroid Build Coastguard Worker      "//mojo/public/tools/bindings/blink_bindings_configuration.gni",
118*635a8641SAndroid Build Coastguard Worker    ]
119*635a8641SAndroid Build Coastguard Worker  } else {
120*635a8641SAndroid Build Coastguard Worker    _bindings_configuration_files =
121*635a8641SAndroid Build Coastguard Worker        [ "//mojo/public/tools/bindings/chromium_bindings_configuration.gni" ]
122*635a8641SAndroid Build Coastguard Worker  }
123*635a8641SAndroid Build Coastguard Worker  _bindings_configurations = []
124*635a8641SAndroid Build Coastguard Worker  foreach(config_file, _bindings_configuration_files) {
125*635a8641SAndroid Build Coastguard Worker    _bindings_configurations += [ read_file(config_file, "scope") ]
126*635a8641SAndroid Build Coastguard Worker  }
127*635a8641SAndroid Build Coastguard Worker  foreach(configuration, _bindings_configurations) {
128*635a8641SAndroid Build Coastguard Worker    # Check that the mojom field of each typemap refers to a mojom that exists.
129*635a8641SAndroid Build Coastguard Worker    foreach(typemap, configuration.typemaps) {
130*635a8641SAndroid Build Coastguard Worker      _typemap_config = {
131*635a8641SAndroid Build Coastguard Worker      }
132*635a8641SAndroid Build Coastguard Worker      _typemap_config = typemap.config
133*635a8641SAndroid Build Coastguard Worker      read_file(_typemap_config.mojom, "")
134*635a8641SAndroid Build Coastguard Worker    }
135*635a8641SAndroid Build Coastguard Worker  }
136*635a8641SAndroid Build Coastguard Worker} else {
137*635a8641SAndroid Build Coastguard Worker  _bindings_configuration_files = []
138*635a8641SAndroid Build Coastguard Worker  _bindings_configurations = [
139*635a8641SAndroid Build Coastguard Worker    {
140*635a8641SAndroid Build Coastguard Worker      typemaps = []
141*635a8641SAndroid Build Coastguard Worker      component_macro_suffix = ""
142*635a8641SAndroid Build Coastguard Worker    },
143*635a8641SAndroid Build Coastguard Worker    {
144*635a8641SAndroid Build Coastguard Worker      variant = "blink"
145*635a8641SAndroid Build Coastguard Worker      component_macro_suffix = "_BLINK"
146*635a8641SAndroid Build Coastguard Worker      for_blink = true
147*635a8641SAndroid Build Coastguard Worker      typemaps = []
148*635a8641SAndroid Build Coastguard Worker    },
149*635a8641SAndroid Build Coastguard Worker  ]
150*635a8641SAndroid Build Coastguard Worker}
151*635a8641SAndroid Build Coastguard Worker
152*635a8641SAndroid Build Coastguard Worker# Generates targets for building C++, JavaScript and Java bindings from mojom
153*635a8641SAndroid Build Coastguard Worker# files. The output files will go under the generated file directory tree with
154*635a8641SAndroid Build Coastguard Worker# the same path as each input file.
155*635a8641SAndroid Build Coastguard Worker#
156*635a8641SAndroid Build Coastguard Worker# Other targets should depend on one of these generated targets (where "foo"
157*635a8641SAndroid Build Coastguard Worker# is the target name):
158*635a8641SAndroid Build Coastguard Worker#
159*635a8641SAndroid Build Coastguard Worker#   foo
160*635a8641SAndroid Build Coastguard Worker#       C++ bindings.
161*635a8641SAndroid Build Coastguard Worker#
162*635a8641SAndroid Build Coastguard Worker#   foo_blink
163*635a8641SAndroid Build Coastguard Worker#       C++ bindings using Blink standard types.
164*635a8641SAndroid Build Coastguard Worker#
165*635a8641SAndroid Build Coastguard Worker#   foo_java
166*635a8641SAndroid Build Coastguard Worker#       Java bindings.
167*635a8641SAndroid Build Coastguard Worker#
168*635a8641SAndroid Build Coastguard Worker#   foo_js
169*635a8641SAndroid Build Coastguard Worker#       JavaScript bindings; used as compile-time dependency.
170*635a8641SAndroid Build Coastguard Worker#
171*635a8641SAndroid Build Coastguard Worker#   foo_js_data_deps
172*635a8641SAndroid Build Coastguard Worker#       JavaScript bindings; used as run-time dependency.
173*635a8641SAndroid Build Coastguard Worker#
174*635a8641SAndroid Build Coastguard Worker# Parameters:
175*635a8641SAndroid Build Coastguard Worker#
176*635a8641SAndroid Build Coastguard Worker#   sources (optional if one of the deps sets listed below is present)
177*635a8641SAndroid Build Coastguard Worker#       List of source .mojom files to compile.
178*635a8641SAndroid Build Coastguard Worker#
179*635a8641SAndroid Build Coastguard Worker#   deps (optional)
180*635a8641SAndroid Build Coastguard Worker#       Note: this can contain only other mojom targets.
181*635a8641SAndroid Build Coastguard Worker#
182*635a8641SAndroid Build Coastguard Worker#       DEPRECATED: This is synonymous with public_deps because all mojom
183*635a8641SAndroid Build Coastguard Worker#       dependencies must be public by design. Please use public_deps.
184*635a8641SAndroid Build Coastguard Worker#
185*635a8641SAndroid Build Coastguard Worker#   public_deps (optional)
186*635a8641SAndroid Build Coastguard Worker#       Note: this can contain only other mojom targets.
187*635a8641SAndroid Build Coastguard Worker#
188*635a8641SAndroid Build Coastguard Worker#   import_dirs (optional)
189*635a8641SAndroid Build Coastguard Worker#       List of import directories that will get added when processing sources.
190*635a8641SAndroid Build Coastguard Worker#
191*635a8641SAndroid Build Coastguard Worker#   testonly (optional)
192*635a8641SAndroid Build Coastguard Worker#
193*635a8641SAndroid Build Coastguard Worker#   visibility (optional)
194*635a8641SAndroid Build Coastguard Worker#
195*635a8641SAndroid Build Coastguard Worker#   visibility_blink (optional)
196*635a8641SAndroid Build Coastguard Worker#       The value to use for visibility for the blink variant. If unset,
197*635a8641SAndroid Build Coastguard Worker#       |visibility| is used.
198*635a8641SAndroid Build Coastguard Worker#
199*635a8641SAndroid Build Coastguard Worker#   use_once_callback (optional)
200*635a8641SAndroid Build Coastguard Worker#       If set to true, generated classes will use base::OnceCallback instead of
201*635a8641SAndroid Build Coastguard Worker#       base::RepeatingCallback.
202*635a8641SAndroid Build Coastguard Worker#       Default value is true.
203*635a8641SAndroid Build Coastguard Worker#       TODO(dcheng):
204*635a8641SAndroid Build Coastguard Worker#           - Convert everything to use OnceCallback.
205*635a8641SAndroid Build Coastguard Worker#           - Remove support for the old mode.
206*635a8641SAndroid Build Coastguard Worker#
207*635a8641SAndroid Build Coastguard Worker#   cpp_only (optional)
208*635a8641SAndroid Build Coastguard Worker#       If set to true, only the C++ bindings targets will be generated.
209*635a8641SAndroid Build Coastguard Worker#
210*635a8641SAndroid Build Coastguard Worker#   support_lazy_serialization (optional)
211*635a8641SAndroid Build Coastguard Worker#       If set to |true|, generated C++ bindings will effectively prefer to
212*635a8641SAndroid Build Coastguard Worker#       transmit messages in an unserialized form when going between endpoints
213*635a8641SAndroid Build Coastguard Worker#       in the same process. This avoids the runtime cost of serialization,
214*635a8641SAndroid Build Coastguard Worker#       deserialization, and validation logic at the expensive of increased
215*635a8641SAndroid Build Coastguard Worker#       code size. Defaults to |false|.
216*635a8641SAndroid Build Coastguard Worker#
217*635a8641SAndroid Build Coastguard Worker#   disable_variants (optional)
218*635a8641SAndroid Build Coastguard Worker#       If |true|, no variant sources will be generated for the target. Defaults
219*635a8641SAndroid Build Coastguard Worker#       to |false|.
220*635a8641SAndroid Build Coastguard Worker#
221*635a8641SAndroid Build Coastguard Worker#   disallow_native_types (optional)
222*635a8641SAndroid Build Coastguard Worker#       If set to |true|, mojoms in this target may not apply the [Native]
223*635a8641SAndroid Build Coastguard Worker#       attribute to struct or enum declarations. This avoids emitting code
224*635a8641SAndroid Build Coastguard Worker#       which depends on legacy IPC serialization. Default is |false|, meaning
225*635a8641SAndroid Build Coastguard Worker#       [Native] types are allowed.
226*635a8641SAndroid Build Coastguard Worker#
227*635a8641SAndroid Build Coastguard Worker#   disallow_interfaces (optional)
228*635a8641SAndroid Build Coastguard Worker#       If set to |true|, mojoms in this target may not define interfaces.
229*635a8641SAndroid Build Coastguard Worker#       Generates bindings with a smaller set of dependencies. Defaults to
230*635a8641SAndroid Build Coastguard Worker#       |false|.
231*635a8641SAndroid Build Coastguard Worker#
232*635a8641SAndroid Build Coastguard Worker#   scramble_message_ids (optional)
233*635a8641SAndroid Build Coastguard Worker#       If set to |true| (the default), generated mojom interfaces will use
234*635a8641SAndroid Build Coastguard Worker#       scrambled ordinal identifiers in encoded messages.
235*635a8641SAndroid Build Coastguard Worker#
236*635a8641SAndroid Build Coastguard Worker#   component_output_prefix (optional)
237*635a8641SAndroid Build Coastguard Worker#       The prefix to use for the output_name of any component library emitted
238*635a8641SAndroid Build Coastguard Worker#       for generated C++ bindings. If this is omitted, C++ bindings targets are
239*635a8641SAndroid Build Coastguard Worker#       emitted as source_sets instead. Because this controls the name of the
240*635a8641SAndroid Build Coastguard Worker#       output shared library binary in the root output directory, it must be
241*635a8641SAndroid Build Coastguard Worker#       unique across the entire build configuration.
242*635a8641SAndroid Build Coastguard Worker#
243*635a8641SAndroid Build Coastguard Worker#       This is required if |component_macro_prefix| is specified.
244*635a8641SAndroid Build Coastguard Worker#
245*635a8641SAndroid Build Coastguard Worker#   component_macro_prefix (optional)
246*635a8641SAndroid Build Coastguard Worker#       This specifies a macro prefix to use for component export macros and
247*635a8641SAndroid Build Coastguard Worker#       should therefore be globally unique in the project. For example if this
248*635a8641SAndroid Build Coastguard Worker#       is "FOO_BAR", then the generated C++ sources will be built with
249*635a8641SAndroid Build Coastguard Worker#       IS_FOO_BAR_{suffix}_IMPL defined, and the generated public headers will
250*635a8641SAndroid Build Coastguard Worker#       annotate public symbol definitions with
251*635a8641SAndroid Build Coastguard Worker#       COMPONENT_EXPORT(FOO_BAR_{suffix}). "suffix" in this case depends on
252*635a8641SAndroid Build Coastguard Worker#       which internal subtarget is generating the code (e.g. "SHARED", or a
253*635a8641SAndroid Build Coastguard Worker#       variant name like "BLINK").
254*635a8641SAndroid Build Coastguard Worker#
255*635a8641SAndroid Build Coastguard Worker#   enabled_features (optional)
256*635a8641SAndroid Build Coastguard Worker#       Definitions in a mojom file can be guarded by an EnableIf attribute. If
257*635a8641SAndroid Build Coastguard Worker#       the value specified by the attribute does not match any items in the
258*635a8641SAndroid Build Coastguard Worker#       list of enabled_features, the definition will be disabled, with no code
259*635a8641SAndroid Build Coastguard Worker#       emitted for it.
260*635a8641SAndroid Build Coastguard Worker#
261*635a8641SAndroid Build Coastguard Worker# The following parameters are used to support the component build. They are
262*635a8641SAndroid Build Coastguard Worker# needed so that bindings which are linked with a component can use the same
263*635a8641SAndroid Build Coastguard Worker# export settings for classes. The first three are for the chromium variant, and
264*635a8641SAndroid Build Coastguard Worker# the last three are for the blink variant. These parameters are mutually
265*635a8641SAndroid Build Coastguard Worker# exclusive to |component_macro_prefix|, but |component_output_prefix| may still
266*635a8641SAndroid Build Coastguard Worker# be used to uniqueify the generated invariant (i.e. shared) output component.
267*635a8641SAndroid Build Coastguard Worker#   export_class_attribute (optional)
268*635a8641SAndroid Build Coastguard Worker#       The attribute to add to the class declaration. e.g. "CONTENT_EXPORT"
269*635a8641SAndroid Build Coastguard Worker#   export_define (optional)
270*635a8641SAndroid Build Coastguard Worker#       A define to be added to the source_set which is needed by the export
271*635a8641SAndroid Build Coastguard Worker#       header. e.g. "CONTENT_IMPLEMENTATION=1"
272*635a8641SAndroid Build Coastguard Worker#   export_header (optional)
273*635a8641SAndroid Build Coastguard Worker#       A header to be added to the generated bindings to support the component
274*635a8641SAndroid Build Coastguard Worker#       build. e.g. "content/common/content_export.h"
275*635a8641SAndroid Build Coastguard Worker#   export_class_attribute_blink (optional)
276*635a8641SAndroid Build Coastguard Worker#   export_define_blink (optional)
277*635a8641SAndroid Build Coastguard Worker#   export_header_blink (optional)
278*635a8641SAndroid Build Coastguard Worker#       These three parameters are the blink variants of the previous 3.
279*635a8641SAndroid Build Coastguard Worker#
280*635a8641SAndroid Build Coastguard Worker# The following parameters are used to correct component build dependencies.
281*635a8641SAndroid Build Coastguard Worker# They are needed so mojom-mojom dependencies follow the rule that dependencies
282*635a8641SAndroid Build Coastguard Worker# on a source set in another component are replaced by a dependency on the
283*635a8641SAndroid Build Coastguard Worker# containing component. The first two are for the chromium variant; the other
284*635a8641SAndroid Build Coastguard Worker# two are for the blink variant.
285*635a8641SAndroid Build Coastguard Worker#   overridden_deps (optional)
286*635a8641SAndroid Build Coastguard Worker#       The list of mojom deps to be overridden.
287*635a8641SAndroid Build Coastguard Worker#   component_deps (optional)
288*635a8641SAndroid Build Coastguard Worker#       The list of component deps to add to replace overridden_deps.
289*635a8641SAndroid Build Coastguard Worker#   overridden_deps_blink (optional)
290*635a8641SAndroid Build Coastguard Worker#   component_deps_blink (optional)
291*635a8641SAndroid Build Coastguard Worker#       These two parameters are the blink variants of the previous two.
292*635a8641SAndroid Build Coastguard Worker#
293*635a8641SAndroid Build Coastguard Worker# check_includes_blink (optional)
294*635a8641SAndroid Build Coastguard Worker#     Overrides the check_includes variable for the blink variant.
295*635a8641SAndroid Build Coastguard Worker#     If check_includes_blink is not defined, the check_includes variable
296*635a8641SAndroid Build Coastguard Worker#     retains its original value.
297*635a8641SAndroid Build Coastguard Workertemplate("mojom") {
298*635a8641SAndroid Build Coastguard Worker  assert(
299*635a8641SAndroid Build Coastguard Worker      defined(invoker.sources) || defined(invoker.deps) ||
300*635a8641SAndroid Build Coastguard Worker          defined(invoker.public_deps),
301*635a8641SAndroid Build Coastguard Worker      "\"sources\" or \"deps\" must be defined for the $target_name template.")
302*635a8641SAndroid Build Coastguard Worker
303*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.export_class_attribute) ||
304*635a8641SAndroid Build Coastguard Worker      defined(invoker.export_define) || defined(invoker.export_header)) {
305*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.export_class_attribute))
306*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.export_define))
307*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.export_header))
308*635a8641SAndroid Build Coastguard Worker    assert(!defined(invoker.component_macro_prefix))
309*635a8641SAndroid Build Coastguard Worker  }
310*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.export_class_attribute_blink) ||
311*635a8641SAndroid Build Coastguard Worker      defined(invoker.export_define_blink) ||
312*635a8641SAndroid Build Coastguard Worker      defined(invoker.export_header_blink)) {
313*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.export_class_attribute_blink))
314*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.export_define_blink))
315*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.export_header_blink))
316*635a8641SAndroid Build Coastguard Worker    assert(!defined(invoker.component_macro_prefix))
317*635a8641SAndroid Build Coastguard Worker  }
318*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.overridden_deps) || defined(invoker.component_deps)) {
319*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.overridden_deps))
320*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.component_deps))
321*635a8641SAndroid Build Coastguard Worker  }
322*635a8641SAndroid Build Coastguard Worker
323*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.overridden_deps_blink) ||
324*635a8641SAndroid Build Coastguard Worker      defined(invoker.component_deps_blink)) {
325*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.overridden_deps_blink))
326*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.component_deps_blink))
327*635a8641SAndroid Build Coastguard Worker  }
328*635a8641SAndroid Build Coastguard Worker
329*635a8641SAndroid Build Coastguard Worker  require_full_cpp_deps =
330*635a8641SAndroid Build Coastguard Worker      !defined(invoker.disallow_native_types) ||
331*635a8641SAndroid Build Coastguard Worker      !invoker.disallow_native_types || !defined(invoker.disallow_interfaces) ||
332*635a8641SAndroid Build Coastguard Worker      !invoker.disallow_interfaces
333*635a8641SAndroid Build Coastguard Worker
334*635a8641SAndroid Build Coastguard Worker  all_deps = []
335*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.deps)) {
336*635a8641SAndroid Build Coastguard Worker    all_deps += invoker.deps
337*635a8641SAndroid Build Coastguard Worker  }
338*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.public_deps)) {
339*635a8641SAndroid Build Coastguard Worker    all_deps += invoker.public_deps
340*635a8641SAndroid Build Coastguard Worker  }
341*635a8641SAndroid Build Coastguard Worker
342*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.component_macro_prefix)) {
343*635a8641SAndroid Build Coastguard Worker    assert(defined(invoker.component_output_prefix))
344*635a8641SAndroid Build Coastguard Worker  }
345*635a8641SAndroid Build Coastguard Worker
346*635a8641SAndroid Build Coastguard Worker  group("${target_name}__is_mojom") {
347*635a8641SAndroid Build Coastguard Worker  }
348*635a8641SAndroid Build Coastguard Worker
349*635a8641SAndroid Build Coastguard Worker  # Explicitly ensure that all dependencies (invoker.deps and
350*635a8641SAndroid Build Coastguard Worker  # invoker.public_deps) are mojom targets.
351*635a8641SAndroid Build Coastguard Worker  group("${target_name}__check_deps_are_all_mojom") {
352*635a8641SAndroid Build Coastguard Worker    deps = []
353*635a8641SAndroid Build Coastguard Worker    foreach(d, all_deps) {
354*635a8641SAndroid Build Coastguard Worker      name = get_label_info(d, "label_no_toolchain")
355*635a8641SAndroid Build Coastguard Worker      toolchain = get_label_info(d, "toolchain")
356*635a8641SAndroid Build Coastguard Worker      deps += [ "${name}__is_mojom(${toolchain})" ]
357*635a8641SAndroid Build Coastguard Worker    }
358*635a8641SAndroid Build Coastguard Worker  }
359*635a8641SAndroid Build Coastguard Worker
360*635a8641SAndroid Build Coastguard Worker  target_sources_list = "$target_gen_dir/$target_name.sources_list"
361*635a8641SAndroid Build Coastguard Worker  sources_list = []
362*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.sources)) {
363*635a8641SAndroid Build Coastguard Worker    sources_list = invoker.sources
364*635a8641SAndroid Build Coastguard Worker  }
365*635a8641SAndroid Build Coastguard Worker  write_file(target_sources_list, sources_list)
366*635a8641SAndroid Build Coastguard Worker
367*635a8641SAndroid Build Coastguard Worker  # a target implicitly depends on its own sources
368*635a8641SAndroid Build Coastguard Worker  deps_sources = [ rebase_path(target_sources_list, root_build_dir) ]
369*635a8641SAndroid Build Coastguard Worker  foreach(d, all_deps) {
370*635a8641SAndroid Build Coastguard Worker    dep_dir = get_label_info("$d", "target_gen_dir")
371*635a8641SAndroid Build Coastguard Worker    dep_short_name = get_label_info("$d", "name")
372*635a8641SAndroid Build Coastguard Worker    deps_sources +=
373*635a8641SAndroid Build Coastguard Worker        [ rebase_path("$dep_dir/$dep_short_name.sources_list", root_build_dir) ]
374*635a8641SAndroid Build Coastguard Worker  }
375*635a8641SAndroid Build Coastguard Worker
376*635a8641SAndroid Build Coastguard Worker  write_file("$target_gen_dir/$target_name.deps_sources_list", deps_sources)
377*635a8641SAndroid Build Coastguard Worker
378*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.sources)) {
379*635a8641SAndroid Build Coastguard Worker    parser_target_name = "${target_name}__parser"
380*635a8641SAndroid Build Coastguard Worker    enabled_features = []
381*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.enabled_features)) {
382*635a8641SAndroid Build Coastguard Worker      enabled_features += invoker.enabled_features
383*635a8641SAndroid Build Coastguard Worker    }
384*635a8641SAndroid Build Coastguard Worker    if (is_posix) {
385*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_posix" ]
386*635a8641SAndroid Build Coastguard Worker    }
387*635a8641SAndroid Build Coastguard Worker    if (is_android) {
388*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_android" ]
389*635a8641SAndroid Build Coastguard Worker    } else if (is_chromeos) {
390*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_chromeos" ]
391*635a8641SAndroid Build Coastguard Worker    } else if (is_fuchsia) {
392*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_fuchsia" ]
393*635a8641SAndroid Build Coastguard Worker    } else if (is_ios) {
394*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_ios" ]
395*635a8641SAndroid Build Coastguard Worker    } else if (is_linux) {
396*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_linux" ]
397*635a8641SAndroid Build Coastguard Worker    } else if (is_mac) {
398*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_mac" ]
399*635a8641SAndroid Build Coastguard Worker    } else if (is_win) {
400*635a8641SAndroid Build Coastguard Worker      enabled_features += [ "is_win" ]
401*635a8641SAndroid Build Coastguard Worker    }
402*635a8641SAndroid Build Coastguard Worker
403*635a8641SAndroid Build Coastguard Worker    action(parser_target_name) {
404*635a8641SAndroid Build Coastguard Worker      script = mojom_generator_script
405*635a8641SAndroid Build Coastguard Worker      inputs = mojom_generator_sources + jinja2_sources
406*635a8641SAndroid Build Coastguard Worker      sources = invoker.sources
407*635a8641SAndroid Build Coastguard Worker      outputs = []
408*635a8641SAndroid Build Coastguard Worker      filelist = []
409*635a8641SAndroid Build Coastguard Worker      foreach(source, invoker.sources) {
410*635a8641SAndroid Build Coastguard Worker        filename = get_path_info("$source", "name")
411*635a8641SAndroid Build Coastguard Worker        dirname = get_path_info("$source", "gen_dir")
412*635a8641SAndroid Build Coastguard Worker        outputs += [ "$dirname/$filename.p" ]
413*635a8641SAndroid Build Coastguard Worker        filelist += [ rebase_path("$source", root_build_dir) ]
414*635a8641SAndroid Build Coastguard Worker      }
415*635a8641SAndroid Build Coastguard Worker
416*635a8641SAndroid Build Coastguard Worker      response_file_contents = filelist
417*635a8641SAndroid Build Coastguard Worker
418*635a8641SAndroid Build Coastguard Worker      args = [
419*635a8641SAndroid Build Coastguard Worker        "parse",
420*635a8641SAndroid Build Coastguard Worker        "--filelist={{response_file_name}}",
421*635a8641SAndroid Build Coastguard Worker        "-o",
422*635a8641SAndroid Build Coastguard Worker        rebase_path(root_gen_dir, root_build_dir),
423*635a8641SAndroid Build Coastguard Worker        "-d",
424*635a8641SAndroid Build Coastguard Worker        rebase_path("//", root_build_dir),
425*635a8641SAndroid Build Coastguard Worker      ]
426*635a8641SAndroid Build Coastguard Worker      foreach(enabled_feature, enabled_features) {
427*635a8641SAndroid Build Coastguard Worker        args += [
428*635a8641SAndroid Build Coastguard Worker          "--enable_feature",
429*635a8641SAndroid Build Coastguard Worker          enabled_feature,
430*635a8641SAndroid Build Coastguard Worker        ]
431*635a8641SAndroid Build Coastguard Worker      }
432*635a8641SAndroid Build Coastguard Worker    }
433*635a8641SAndroid Build Coastguard Worker  }
434*635a8641SAndroid Build Coastguard Worker
435*635a8641SAndroid Build Coastguard Worker  parsed_target_name = "${target_name}__parsed"
436*635a8641SAndroid Build Coastguard Worker  group(parsed_target_name) {
437*635a8641SAndroid Build Coastguard Worker    public_deps = []
438*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
439*635a8641SAndroid Build Coastguard Worker      public_deps += [ ":$parser_target_name" ]
440*635a8641SAndroid Build Coastguard Worker    }
441*635a8641SAndroid Build Coastguard Worker    foreach(d, all_deps) {
442*635a8641SAndroid Build Coastguard Worker      # Resolve the name, so that a target //mojo/something becomes
443*635a8641SAndroid Build Coastguard Worker      # //mojo/something:something and we can append the parsed
444*635a8641SAndroid Build Coastguard Worker      # suffix to get the mojom dependency name.
445*635a8641SAndroid Build Coastguard Worker      full_name = get_label_info("$d", "label_no_toolchain")
446*635a8641SAndroid Build Coastguard Worker      public_deps += [ "${full_name}__parsed" ]
447*635a8641SAndroid Build Coastguard Worker    }
448*635a8641SAndroid Build Coastguard Worker  }
449*635a8641SAndroid Build Coastguard Worker
450*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.sources)) {
451*635a8641SAndroid Build Coastguard Worker    verify_deps_target_names = []
452*635a8641SAndroid Build Coastguard Worker    if (!defined(invoker.skip_deps_check) || !invoker.skip_deps_check) {
453*635a8641SAndroid Build Coastguard Worker      verify_deps_target_name = "${target_name}__verify_deps"
454*635a8641SAndroid Build Coastguard Worker      verify_deps_target_names += [ ":$verify_deps_target_name" ]
455*635a8641SAndroid Build Coastguard Worker      source_file_name = target_name
456*635a8641SAndroid Build Coastguard Worker
457*635a8641SAndroid Build Coastguard Worker      action(verify_deps_target_name) {
458*635a8641SAndroid Build Coastguard Worker        script = mojom_generator_script
459*635a8641SAndroid Build Coastguard Worker        inputs = mojom_generator_sources + jinja2_sources
460*635a8641SAndroid Build Coastguard Worker        sources = invoker.sources
461*635a8641SAndroid Build Coastguard Worker        deps = [
462*635a8641SAndroid Build Coastguard Worker          ":$parsed_target_name",
463*635a8641SAndroid Build Coastguard Worker        ]
464*635a8641SAndroid Build Coastguard Worker        outputs = []
465*635a8641SAndroid Build Coastguard Worker        filelist = []
466*635a8641SAndroid Build Coastguard Worker        foreach(source, invoker.sources) {
467*635a8641SAndroid Build Coastguard Worker          filename = get_path_info("$source", "name")
468*635a8641SAndroid Build Coastguard Worker          dirname = get_path_info("$source", "gen_dir")
469*635a8641SAndroid Build Coastguard Worker          outputs += [ "$dirname/$filename.v" ]
470*635a8641SAndroid Build Coastguard Worker          filelist += [ rebase_path("$source", root_build_dir) ]
471*635a8641SAndroid Build Coastguard Worker        }
472*635a8641SAndroid Build Coastguard Worker
473*635a8641SAndroid Build Coastguard Worker        response_file_contents = filelist
474*635a8641SAndroid Build Coastguard Worker
475*635a8641SAndroid Build Coastguard Worker        args = [
476*635a8641SAndroid Build Coastguard Worker          "verify",
477*635a8641SAndroid Build Coastguard Worker          "--filelist={{response_file_name}}",
478*635a8641SAndroid Build Coastguard Worker          "-f",
479*635a8641SAndroid Build Coastguard Worker          rebase_path("$target_gen_dir/$source_file_name.deps_sources_list",
480*635a8641SAndroid Build Coastguard Worker                      root_build_dir),
481*635a8641SAndroid Build Coastguard Worker          "--gen_dir",
482*635a8641SAndroid Build Coastguard Worker          rebase_path(root_gen_dir, root_build_dir),
483*635a8641SAndroid Build Coastguard Worker          "--depth",
484*635a8641SAndroid Build Coastguard Worker          rebase_path("//", root_build_dir),
485*635a8641SAndroid Build Coastguard Worker        ]
486*635a8641SAndroid Build Coastguard Worker      }
487*635a8641SAndroid Build Coastguard Worker    }
488*635a8641SAndroid Build Coastguard Worker  }
489*635a8641SAndroid Build Coastguard Worker
490*635a8641SAndroid Build Coastguard Worker  generator_cpp_message_ids_target_name = "${target_name}__generate_message_ids"
491*635a8641SAndroid Build Coastguard Worker
492*635a8641SAndroid Build Coastguard Worker  # Generate code that is shared by different variants.
493*635a8641SAndroid Build Coastguard Worker  if (defined(invoker.sources)) {
494*635a8641SAndroid Build Coastguard Worker    common_generator_args = [
495*635a8641SAndroid Build Coastguard Worker      "--use_bundled_pylibs",
496*635a8641SAndroid Build Coastguard Worker      "generate",
497*635a8641SAndroid Build Coastguard Worker      "-d",
498*635a8641SAndroid Build Coastguard Worker      rebase_path("//", root_build_dir),
499*635a8641SAndroid Build Coastguard Worker      "-I",
500*635a8641SAndroid Build Coastguard Worker      rebase_path("//", root_build_dir),
501*635a8641SAndroid Build Coastguard Worker      "-o",
502*635a8641SAndroid Build Coastguard Worker      rebase_path(root_gen_dir, root_build_dir),
503*635a8641SAndroid Build Coastguard Worker      "--bytecode_path",
504*635a8641SAndroid Build Coastguard Worker      rebase_path("$root_gen_dir/mojo/public/tools/bindings", root_build_dir),
505*635a8641SAndroid Build Coastguard Worker    ]
506*635a8641SAndroid Build Coastguard Worker
507*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.disallow_native_types) &&
508*635a8641SAndroid Build Coastguard Worker        invoker.disallow_native_types) {
509*635a8641SAndroid Build Coastguard Worker      common_generator_args += [ "--disallow_native_types" ]
510*635a8641SAndroid Build Coastguard Worker    }
511*635a8641SAndroid Build Coastguard Worker
512*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.disallow_interfaces) && invoker.disallow_interfaces) {
513*635a8641SAndroid Build Coastguard Worker      common_generator_args += [ "--disallow_interfaces" ]
514*635a8641SAndroid Build Coastguard Worker    }
515*635a8641SAndroid Build Coastguard Worker
516*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.import_dirs)) {
517*635a8641SAndroid Build Coastguard Worker      foreach(import_dir, invoker.import_dirs) {
518*635a8641SAndroid Build Coastguard Worker        common_generator_args += [
519*635a8641SAndroid Build Coastguard Worker          "-I",
520*635a8641SAndroid Build Coastguard Worker          rebase_path(import_dir, root_build_dir),
521*635a8641SAndroid Build Coastguard Worker        ]
522*635a8641SAndroid Build Coastguard Worker      }
523*635a8641SAndroid Build Coastguard Worker    }
524*635a8641SAndroid Build Coastguard Worker
525*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.component_macro_prefix)) {
526*635a8641SAndroid Build Coastguard Worker      shared_component_export_macro =
527*635a8641SAndroid Build Coastguard Worker          "COMPONENT_EXPORT(${invoker.component_macro_prefix}_SHARED)"
528*635a8641SAndroid Build Coastguard Worker      shared_component_impl_macro =
529*635a8641SAndroid Build Coastguard Worker          "IS_${invoker.component_macro_prefix}_SHARED_IMPL"
530*635a8641SAndroid Build Coastguard Worker      shared_component_output_name = "${invoker.component_output_prefix}_shared"
531*635a8641SAndroid Build Coastguard Worker    } else if (defined(invoker.export_class_attribute_shared) ||
532*635a8641SAndroid Build Coastguard Worker               defined(invoker.export_class_attribute)) {
533*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.export_class_attribute_shared)) {
534*635a8641SAndroid Build Coastguard Worker        assert(defined(invoker.export_header_shared))
535*635a8641SAndroid Build Coastguard Worker        shared_component_export_macro = invoker.export_class_attribute_shared
536*635a8641SAndroid Build Coastguard Worker        shared_component_impl_macro = invoker.export_define_shared
537*635a8641SAndroid Build Coastguard Worker      } else {
538*635a8641SAndroid Build Coastguard Worker        assert(!defined(invoker.export_header_shared))
539*635a8641SAndroid Build Coastguard Worker
540*635a8641SAndroid Build Coastguard Worker        # If no explicit shared attribute/define was provided by the invoker,
541*635a8641SAndroid Build Coastguard Worker        # we derive some reasonable settings frorm the default variant.
542*635a8641SAndroid Build Coastguard Worker        shared_component_export_macro = "COMPONENT_EXPORT(MOJOM_SHARED_" +
543*635a8641SAndroid Build Coastguard Worker                                        invoker.export_class_attribute + ")"
544*635a8641SAndroid Build Coastguard Worker        shared_component_impl_macro =
545*635a8641SAndroid Build Coastguard Worker            "IS_MOJOM_SHARED_" + invoker.export_class_attribute + "_IMPL"
546*635a8641SAndroid Build Coastguard Worker      }
547*635a8641SAndroid Build Coastguard Worker
548*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.component_output_prefix)) {
549*635a8641SAndroid Build Coastguard Worker        shared_component_output_name =
550*635a8641SAndroid Build Coastguard Worker            "${invoker.component_output_prefix}_shared"
551*635a8641SAndroid Build Coastguard Worker      } else {
552*635a8641SAndroid Build Coastguard Worker        shared_component_output_name = "${target_name}_shared"
553*635a8641SAndroid Build Coastguard Worker      }
554*635a8641SAndroid Build Coastguard Worker    }
555*635a8641SAndroid Build Coastguard Worker
556*635a8641SAndroid Build Coastguard Worker    action(generator_cpp_message_ids_target_name) {
557*635a8641SAndroid Build Coastguard Worker      script = mojom_generator_script
558*635a8641SAndroid Build Coastguard Worker      inputs = mojom_generator_sources + jinja2_sources
559*635a8641SAndroid Build Coastguard Worker      sources = invoker.sources
560*635a8641SAndroid Build Coastguard Worker      deps = [
561*635a8641SAndroid Build Coastguard Worker        ":$parsed_target_name",
562*635a8641SAndroid Build Coastguard Worker        "//mojo/public/tools/bindings:precompile_templates",
563*635a8641SAndroid Build Coastguard Worker      ]
564*635a8641SAndroid Build Coastguard Worker      outputs = []
565*635a8641SAndroid Build Coastguard Worker      args = common_generator_args
566*635a8641SAndroid Build Coastguard Worker      filelist = []
567*635a8641SAndroid Build Coastguard Worker      foreach(source, invoker.sources) {
568*635a8641SAndroid Build Coastguard Worker        outputs += [ "$target_gen_dir/$source-shared-message-ids.h" ]
569*635a8641SAndroid Build Coastguard Worker        filelist += [ rebase_path("$source", root_build_dir) ]
570*635a8641SAndroid Build Coastguard Worker      }
571*635a8641SAndroid Build Coastguard Worker
572*635a8641SAndroid Build Coastguard Worker      response_file_contents = filelist
573*635a8641SAndroid Build Coastguard Worker
574*635a8641SAndroid Build Coastguard Worker      args += [
575*635a8641SAndroid Build Coastguard Worker        "--filelist={{response_file_name}}",
576*635a8641SAndroid Build Coastguard Worker        "--generate_non_variant_code",
577*635a8641SAndroid Build Coastguard Worker        "--generate_message_ids",
578*635a8641SAndroid Build Coastguard Worker        "-g",
579*635a8641SAndroid Build Coastguard Worker        "c++",
580*635a8641SAndroid Build Coastguard Worker      ]
581*635a8641SAndroid Build Coastguard Worker
582*635a8641SAndroid Build Coastguard Worker      if (!defined(invoker.scramble_message_ids) ||
583*635a8641SAndroid Build Coastguard Worker          invoker.scramble_message_ids) {
584*635a8641SAndroid Build Coastguard Worker        inputs += message_scrambling_inputs
585*635a8641SAndroid Build Coastguard Worker        args += message_scrambling_args
586*635a8641SAndroid Build Coastguard Worker      }
587*635a8641SAndroid Build Coastguard Worker    }
588*635a8641SAndroid Build Coastguard Worker
589*635a8641SAndroid Build Coastguard Worker    generator_shared_cpp_outputs = [
590*635a8641SAndroid Build Coastguard Worker      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared-internal.h",
591*635a8641SAndroid Build Coastguard Worker      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared.cc",
592*635a8641SAndroid Build Coastguard Worker      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared.h",
593*635a8641SAndroid Build Coastguard Worker    ]
594*635a8641SAndroid Build Coastguard Worker    generator_shared_target_name = "${target_name}_shared__generator"
595*635a8641SAndroid Build Coastguard Worker    action(generator_shared_target_name) {
596*635a8641SAndroid Build Coastguard Worker      script = mojom_generator_script
597*635a8641SAndroid Build Coastguard Worker      inputs = mojom_generator_sources + jinja2_sources
598*635a8641SAndroid Build Coastguard Worker      sources = invoker.sources
599*635a8641SAndroid Build Coastguard Worker      deps = [
600*635a8641SAndroid Build Coastguard Worker               ":$parsed_target_name",
601*635a8641SAndroid Build Coastguard Worker               "//mojo/public/tools/bindings:precompile_templates",
602*635a8641SAndroid Build Coastguard Worker             ] + verify_deps_target_names
603*635a8641SAndroid Build Coastguard Worker
604*635a8641SAndroid Build Coastguard Worker      outputs = []
605*635a8641SAndroid Build Coastguard Worker      args = common_generator_args
606*635a8641SAndroid Build Coastguard Worker      filelist = []
607*635a8641SAndroid Build Coastguard Worker      foreach(source, invoker.sources) {
608*635a8641SAndroid Build Coastguard Worker        filelist += [ rebase_path("$source", root_build_dir) ]
609*635a8641SAndroid Build Coastguard Worker        outputs += [
610*635a8641SAndroid Build Coastguard Worker          "$target_gen_dir/$source-shared-internal.h",
611*635a8641SAndroid Build Coastguard Worker          "$target_gen_dir/$source-shared.cc",
612*635a8641SAndroid Build Coastguard Worker          "$target_gen_dir/$source-shared.h",
613*635a8641SAndroid Build Coastguard Worker        ]
614*635a8641SAndroid Build Coastguard Worker      }
615*635a8641SAndroid Build Coastguard Worker
616*635a8641SAndroid Build Coastguard Worker      response_file_contents = filelist
617*635a8641SAndroid Build Coastguard Worker
618*635a8641SAndroid Build Coastguard Worker      args += [
619*635a8641SAndroid Build Coastguard Worker        "--filelist={{response_file_name}}",
620*635a8641SAndroid Build Coastguard Worker        "--generate_non_variant_code",
621*635a8641SAndroid Build Coastguard Worker        "-g",
622*635a8641SAndroid Build Coastguard Worker        "c++",
623*635a8641SAndroid Build Coastguard Worker      ]
624*635a8641SAndroid Build Coastguard Worker
625*635a8641SAndroid Build Coastguard Worker      if (defined(shared_component_export_macro)) {
626*635a8641SAndroid Build Coastguard Worker        args += [
627*635a8641SAndroid Build Coastguard Worker          "--export_attribute",
628*635a8641SAndroid Build Coastguard Worker          shared_component_export_macro,
629*635a8641SAndroid Build Coastguard Worker          "--export_header",
630*635a8641SAndroid Build Coastguard Worker          "base/component_export.h",
631*635a8641SAndroid Build Coastguard Worker        ]
632*635a8641SAndroid Build Coastguard Worker      }
633*635a8641SAndroid Build Coastguard Worker    }
634*635a8641SAndroid Build Coastguard Worker  } else {
635*635a8641SAndroid Build Coastguard Worker    group(generator_cpp_message_ids_target_name) {
636*635a8641SAndroid Build Coastguard Worker    }
637*635a8641SAndroid Build Coastguard Worker  }
638*635a8641SAndroid Build Coastguard Worker
639*635a8641SAndroid Build Coastguard Worker  shared_cpp_sources_target_name = "${target_name}_shared_cpp_sources"
640*635a8641SAndroid Build Coastguard Worker  jumbo_source_set(shared_cpp_sources_target_name) {
641*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.testonly)) {
642*635a8641SAndroid Build Coastguard Worker      testonly = invoker.testonly
643*635a8641SAndroid Build Coastguard Worker    }
644*635a8641SAndroid Build Coastguard Worker    deps = []
645*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
646*635a8641SAndroid Build Coastguard Worker      sources =
647*635a8641SAndroid Build Coastguard Worker          process_file_template(invoker.sources, generator_shared_cpp_outputs)
648*635a8641SAndroid Build Coastguard Worker      deps += [ ":$generator_shared_target_name" ]
649*635a8641SAndroid Build Coastguard Worker    }
650*635a8641SAndroid Build Coastguard Worker    if (require_full_cpp_deps) {
651*635a8641SAndroid Build Coastguard Worker      public_deps = [
652*635a8641SAndroid Build Coastguard Worker        "//mojo/public/cpp/bindings",
653*635a8641SAndroid Build Coastguard Worker      ]
654*635a8641SAndroid Build Coastguard Worker    } else {
655*635a8641SAndroid Build Coastguard Worker      public_deps = [
656*635a8641SAndroid Build Coastguard Worker        "//mojo/public/cpp/bindings:bindings_base",
657*635a8641SAndroid Build Coastguard Worker      ]
658*635a8641SAndroid Build Coastguard Worker    }
659*635a8641SAndroid Build Coastguard Worker    foreach(d, all_deps) {
660*635a8641SAndroid Build Coastguard Worker      # Resolve the name, so that a target //mojo/something becomes
661*635a8641SAndroid Build Coastguard Worker      # //mojo/something:something and we can append shared_cpp_sources_suffix
662*635a8641SAndroid Build Coastguard Worker      # to get the cpp dependency name.
663*635a8641SAndroid Build Coastguard Worker      full_name = get_label_info("$d", "label_no_toolchain")
664*635a8641SAndroid Build Coastguard Worker      public_deps += [ "${full_name}_shared" ]
665*635a8641SAndroid Build Coastguard Worker    }
666*635a8641SAndroid Build Coastguard Worker    if (defined(shared_component_impl_macro)) {
667*635a8641SAndroid Build Coastguard Worker      defines = [ shared_component_impl_macro ]
668*635a8641SAndroid Build Coastguard Worker    }
669*635a8641SAndroid Build Coastguard Worker  }
670*635a8641SAndroid Build Coastguard Worker
671*635a8641SAndroid Build Coastguard Worker  shared_cpp_library_target_name = "${target_name}_shared"
672*635a8641SAndroid Build Coastguard Worker  if (defined(shared_component_output_name)) {
673*635a8641SAndroid Build Coastguard Worker    component(shared_cpp_library_target_name) {
674*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.testonly)) {
675*635a8641SAndroid Build Coastguard Worker        testonly = invoker.testonly
676*635a8641SAndroid Build Coastguard Worker      }
677*635a8641SAndroid Build Coastguard Worker      output_name = "$shared_component_output_name"
678*635a8641SAndroid Build Coastguard Worker      public_deps = [
679*635a8641SAndroid Build Coastguard Worker        ":$shared_cpp_sources_target_name",
680*635a8641SAndroid Build Coastguard Worker      ]
681*635a8641SAndroid Build Coastguard Worker    }
682*635a8641SAndroid Build Coastguard Worker  } else {
683*635a8641SAndroid Build Coastguard Worker    group(shared_cpp_library_target_name) {
684*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.testonly)) {
685*635a8641SAndroid Build Coastguard Worker        testonly = invoker.testonly
686*635a8641SAndroid Build Coastguard Worker      }
687*635a8641SAndroid Build Coastguard Worker      public_deps = [
688*635a8641SAndroid Build Coastguard Worker        ":$shared_cpp_sources_target_name",
689*635a8641SAndroid Build Coastguard Worker      ]
690*635a8641SAndroid Build Coastguard Worker    }
691*635a8641SAndroid Build Coastguard Worker  }
692*635a8641SAndroid Build Coastguard Worker
693*635a8641SAndroid Build Coastguard Worker  # Generate code for variants.
694*635a8641SAndroid Build Coastguard Worker  if (!defined(invoker.disable_variants) || !invoker.disable_variants) {
695*635a8641SAndroid Build Coastguard Worker    enabled_configurations = _bindings_configurations
696*635a8641SAndroid Build Coastguard Worker  } else {
697*635a8641SAndroid Build Coastguard Worker    first_config = _bindings_configurations[0]
698*635a8641SAndroid Build Coastguard Worker    assert(!defined(first_config.variant))
699*635a8641SAndroid Build Coastguard Worker    enabled_configurations = [ first_config ]
700*635a8641SAndroid Build Coastguard Worker  }
701*635a8641SAndroid Build Coastguard Worker  foreach(bindings_configuration, enabled_configurations) {
702*635a8641SAndroid Build Coastguard Worker    cpp_only = false
703*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.cpp_only)) {
704*635a8641SAndroid Build Coastguard Worker      cpp_only = invoker.cpp_only
705*635a8641SAndroid Build Coastguard Worker    }
706*635a8641SAndroid Build Coastguard Worker    variant_suffix = ""
707*635a8641SAndroid Build Coastguard Worker    if (defined(bindings_configuration.variant)) {
708*635a8641SAndroid Build Coastguard Worker      variant = bindings_configuration.variant
709*635a8641SAndroid Build Coastguard Worker      variant_suffix = "_${variant}"
710*635a8641SAndroid Build Coastguard Worker      cpp_only = true
711*635a8641SAndroid Build Coastguard Worker    }
712*635a8641SAndroid Build Coastguard Worker    type_mappings_target_name = "${target_name}${variant_suffix}__type_mappings"
713*635a8641SAndroid Build Coastguard Worker    type_mappings_path =
714*635a8641SAndroid Build Coastguard Worker        "$target_gen_dir/${target_name}${variant_suffix}__type_mappings"
715*635a8641SAndroid Build Coastguard Worker    active_typemaps = []
716*635a8641SAndroid Build Coastguard Worker    enabled_sources = []
717*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
718*635a8641SAndroid Build Coastguard Worker      generator_cpp_outputs = []
719*635a8641SAndroid Build Coastguard Worker      variant_dash_suffix = ""
720*635a8641SAndroid Build Coastguard Worker      if (defined(variant)) {
721*635a8641SAndroid Build Coastguard Worker        variant_dash_suffix = "-${variant}"
722*635a8641SAndroid Build Coastguard Worker      }
723*635a8641SAndroid Build Coastguard Worker      generator_cpp_outputs += [
724*635a8641SAndroid Build Coastguard Worker        "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.cc",
725*635a8641SAndroid Build Coastguard Worker        "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.h",
726*635a8641SAndroid Build Coastguard Worker      ]
727*635a8641SAndroid Build Coastguard Worker      enabled_sources = []
728*635a8641SAndroid Build Coastguard Worker      if (defined(bindings_configuration.blacklist)) {
729*635a8641SAndroid Build Coastguard Worker        foreach(source, invoker.sources) {
730*635a8641SAndroid Build Coastguard Worker          blacklisted = false
731*635a8641SAndroid Build Coastguard Worker          foreach(blacklisted_source, bindings_configuration.blacklist) {
732*635a8641SAndroid Build Coastguard Worker            if (get_path_info(source, "abspath") == blacklisted_source) {
733*635a8641SAndroid Build Coastguard Worker              blacklisted = true
734*635a8641SAndroid Build Coastguard Worker            }
735*635a8641SAndroid Build Coastguard Worker          }
736*635a8641SAndroid Build Coastguard Worker          if (!blacklisted) {
737*635a8641SAndroid Build Coastguard Worker            enabled_sources += [ source ]
738*635a8641SAndroid Build Coastguard Worker          }
739*635a8641SAndroid Build Coastguard Worker        }
740*635a8641SAndroid Build Coastguard Worker      } else {
741*635a8641SAndroid Build Coastguard Worker        enabled_sources = invoker.sources
742*635a8641SAndroid Build Coastguard Worker      }
743*635a8641SAndroid Build Coastguard Worker      foreach(source, enabled_sources) {
744*635a8641SAndroid Build Coastguard Worker        # TODO(sammc): Use a map instead of a linear scan when GN supports maps.
745*635a8641SAndroid Build Coastguard Worker        foreach(typemap, bindings_configuration.typemaps) {
746*635a8641SAndroid Build Coastguard Worker          _typemap_config = {
747*635a8641SAndroid Build Coastguard Worker          }
748*635a8641SAndroid Build Coastguard Worker          _typemap_config = typemap.config
749*635a8641SAndroid Build Coastguard Worker          if (get_path_info(source, "abspath") == _typemap_config.mojom) {
750*635a8641SAndroid Build Coastguard Worker            enabled = false
751*635a8641SAndroid Build Coastguard Worker            if (!defined(_typemap_config.os_whitelist)) {
752*635a8641SAndroid Build Coastguard Worker              enabled = true
753*635a8641SAndroid Build Coastguard Worker            } else {
754*635a8641SAndroid Build Coastguard Worker              foreach(os, _typemap_config.os_whitelist) {
755*635a8641SAndroid Build Coastguard Worker                if (os == "android" && is_android) {
756*635a8641SAndroid Build Coastguard Worker                  enabled = true
757*635a8641SAndroid Build Coastguard Worker                } else if (os == "chromeos" && is_chromeos) {
758*635a8641SAndroid Build Coastguard Worker                  enabled = true
759*635a8641SAndroid Build Coastguard Worker                } else if (os == "fuchsia" && is_fuchsia) {
760*635a8641SAndroid Build Coastguard Worker                  enabled = true
761*635a8641SAndroid Build Coastguard Worker                } else if (os == "ios" && is_ios) {
762*635a8641SAndroid Build Coastguard Worker                  enabled = true
763*635a8641SAndroid Build Coastguard Worker                } else if (os == "linux" && is_linux) {
764*635a8641SAndroid Build Coastguard Worker                  enabled = true
765*635a8641SAndroid Build Coastguard Worker                } else if (os == "mac" && is_mac) {
766*635a8641SAndroid Build Coastguard Worker                  enabled = true
767*635a8641SAndroid Build Coastguard Worker                } else if (os == "posix" && is_posix) {
768*635a8641SAndroid Build Coastguard Worker                  enabled = true
769*635a8641SAndroid Build Coastguard Worker                } else if (os == "win" && is_win) {
770*635a8641SAndroid Build Coastguard Worker                  enabled = true
771*635a8641SAndroid Build Coastguard Worker                }
772*635a8641SAndroid Build Coastguard Worker              }
773*635a8641SAndroid Build Coastguard Worker            }
774*635a8641SAndroid Build Coastguard Worker            if (enabled) {
775*635a8641SAndroid Build Coastguard Worker              active_typemaps += [ typemap ]
776*635a8641SAndroid Build Coastguard Worker            }
777*635a8641SAndroid Build Coastguard Worker          }
778*635a8641SAndroid Build Coastguard Worker        }
779*635a8641SAndroid Build Coastguard Worker      }
780*635a8641SAndroid Build Coastguard Worker
781*635a8641SAndroid Build Coastguard Worker      generator_target_name = "${target_name}${variant_suffix}__generator"
782*635a8641SAndroid Build Coastguard Worker      action(generator_target_name) {
783*635a8641SAndroid Build Coastguard Worker        script = mojom_generator_script
784*635a8641SAndroid Build Coastguard Worker        inputs = mojom_generator_sources + jinja2_sources
785*635a8641SAndroid Build Coastguard Worker        sources = invoker.sources
786*635a8641SAndroid Build Coastguard Worker        deps = [
787*635a8641SAndroid Build Coastguard Worker                 ":$parsed_target_name",
788*635a8641SAndroid Build Coastguard Worker                 ":$type_mappings_target_name",
789*635a8641SAndroid Build Coastguard Worker                 "//mojo/public/tools/bindings:precompile_templates",
790*635a8641SAndroid Build Coastguard Worker               ] + verify_deps_target_names
791*635a8641SAndroid Build Coastguard Worker        outputs = []
792*635a8641SAndroid Build Coastguard Worker        args = common_generator_args
793*635a8641SAndroid Build Coastguard Worker        filelist = []
794*635a8641SAndroid Build Coastguard Worker        foreach(source, invoker.sources) {
795*635a8641SAndroid Build Coastguard Worker          filelist += [ rebase_path("$source", root_build_dir) ]
796*635a8641SAndroid Build Coastguard Worker          outputs += [
797*635a8641SAndroid Build Coastguard Worker            "$target_gen_dir/${source}${variant_dash_suffix}.cc",
798*635a8641SAndroid Build Coastguard Worker            "$target_gen_dir/${source}${variant_dash_suffix}.h",
799*635a8641SAndroid Build Coastguard Worker          ]
800*635a8641SAndroid Build Coastguard Worker        }
801*635a8641SAndroid Build Coastguard Worker
802*635a8641SAndroid Build Coastguard Worker        response_file_contents = filelist
803*635a8641SAndroid Build Coastguard Worker
804*635a8641SAndroid Build Coastguard Worker        args += [
805*635a8641SAndroid Build Coastguard Worker          "--filelist={{response_file_name}}",
806*635a8641SAndroid Build Coastguard Worker          "-g",
807*635a8641SAndroid Build Coastguard Worker          "c++",
808*635a8641SAndroid Build Coastguard Worker        ]
809*635a8641SAndroid Build Coastguard Worker
810*635a8641SAndroid Build Coastguard Worker        if (defined(bindings_configuration.variant)) {
811*635a8641SAndroid Build Coastguard Worker          args += [
812*635a8641SAndroid Build Coastguard Worker            "--variant",
813*635a8641SAndroid Build Coastguard Worker            bindings_configuration.variant,
814*635a8641SAndroid Build Coastguard Worker          ]
815*635a8641SAndroid Build Coastguard Worker        }
816*635a8641SAndroid Build Coastguard Worker
817*635a8641SAndroid Build Coastguard Worker        args += [
818*635a8641SAndroid Build Coastguard Worker          "--typemap",
819*635a8641SAndroid Build Coastguard Worker          rebase_path(type_mappings_path, root_build_dir),
820*635a8641SAndroid Build Coastguard Worker        ]
821*635a8641SAndroid Build Coastguard Worker
822*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.component_macro_prefix)) {
823*635a8641SAndroid Build Coastguard Worker          args += [
824*635a8641SAndroid Build Coastguard Worker            "--export_attribute",
825*635a8641SAndroid Build Coastguard Worker            "COMPONENT_EXPORT(${invoker.component_macro_prefix}" +
826*635a8641SAndroid Build Coastguard Worker                "${bindings_configuration.component_macro_suffix})",
827*635a8641SAndroid Build Coastguard Worker            "--export_header",
828*635a8641SAndroid Build Coastguard Worker            "base/component_export.h",
829*635a8641SAndroid Build Coastguard Worker          ]
830*635a8641SAndroid Build Coastguard Worker        }
831*635a8641SAndroid Build Coastguard Worker
832*635a8641SAndroid Build Coastguard Worker        if (defined(bindings_configuration.for_blink) &&
833*635a8641SAndroid Build Coastguard Worker            bindings_configuration.for_blink) {
834*635a8641SAndroid Build Coastguard Worker          args += [ "--for_blink" ]
835*635a8641SAndroid Build Coastguard Worker          if (defined(invoker.export_class_attribute_blink)) {
836*635a8641SAndroid Build Coastguard Worker            args += [
837*635a8641SAndroid Build Coastguard Worker              "--export_attribute",
838*635a8641SAndroid Build Coastguard Worker              invoker.export_class_attribute_blink,
839*635a8641SAndroid Build Coastguard Worker              "--export_header",
840*635a8641SAndroid Build Coastguard Worker              invoker.export_header_blink,
841*635a8641SAndroid Build Coastguard Worker            ]
842*635a8641SAndroid Build Coastguard Worker          }
843*635a8641SAndroid Build Coastguard Worker        } else {
844*635a8641SAndroid Build Coastguard Worker          if (defined(invoker.export_class_attribute)) {
845*635a8641SAndroid Build Coastguard Worker            args += [
846*635a8641SAndroid Build Coastguard Worker              "--export_attribute",
847*635a8641SAndroid Build Coastguard Worker              invoker.export_class_attribute,
848*635a8641SAndroid Build Coastguard Worker              "--export_header",
849*635a8641SAndroid Build Coastguard Worker              invoker.export_header,
850*635a8641SAndroid Build Coastguard Worker            ]
851*635a8641SAndroid Build Coastguard Worker          }
852*635a8641SAndroid Build Coastguard Worker        }
853*635a8641SAndroid Build Coastguard Worker
854*635a8641SAndroid Build Coastguard Worker        if (!defined(invoker.use_once_callback) || invoker.use_once_callback) {
855*635a8641SAndroid Build Coastguard Worker          args += [ "--use_once_callback" ]
856*635a8641SAndroid Build Coastguard Worker        }
857*635a8641SAndroid Build Coastguard Worker
858*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.support_lazy_serialization) &&
859*635a8641SAndroid Build Coastguard Worker            invoker.support_lazy_serialization) {
860*635a8641SAndroid Build Coastguard Worker          args += [ "--support_lazy_serialization" ]
861*635a8641SAndroid Build Coastguard Worker        }
862*635a8641SAndroid Build Coastguard Worker      }
863*635a8641SAndroid Build Coastguard Worker    }
864*635a8641SAndroid Build Coastguard Worker
865*635a8641SAndroid Build Coastguard Worker    action(type_mappings_target_name) {
866*635a8641SAndroid Build Coastguard Worker      inputs = _bindings_configuration_files + mojom_generator_sources +
867*635a8641SAndroid Build Coastguard Worker               jinja2_sources
868*635a8641SAndroid Build Coastguard Worker      outputs = [
869*635a8641SAndroid Build Coastguard Worker        type_mappings_path,
870*635a8641SAndroid Build Coastguard Worker      ]
871*635a8641SAndroid Build Coastguard Worker      script = "$mojom_generator_root/generate_type_mappings.py"
872*635a8641SAndroid Build Coastguard Worker      deps = []
873*635a8641SAndroid Build Coastguard Worker      args = [
874*635a8641SAndroid Build Coastguard Worker        "--output",
875*635a8641SAndroid Build Coastguard Worker        rebase_path(type_mappings_path, root_build_dir),
876*635a8641SAndroid Build Coastguard Worker      ]
877*635a8641SAndroid Build Coastguard Worker
878*635a8641SAndroid Build Coastguard Worker      foreach(d, all_deps) {
879*635a8641SAndroid Build Coastguard Worker        name = get_label_info(d, "label_no_toolchain")
880*635a8641SAndroid Build Coastguard Worker        toolchain = get_label_info(d, "toolchain")
881*635a8641SAndroid Build Coastguard Worker        dependency_output = "${name}${variant_suffix}__type_mappings"
882*635a8641SAndroid Build Coastguard Worker        dependency_target = "${dependency_output}(${toolchain})"
883*635a8641SAndroid Build Coastguard Worker        deps += [ dependency_target ]
884*635a8641SAndroid Build Coastguard Worker        dependency_output_dir =
885*635a8641SAndroid Build Coastguard Worker            get_label_info(dependency_output, "target_gen_dir")
886*635a8641SAndroid Build Coastguard Worker        dependency_name = get_label_info(dependency_output, "name")
887*635a8641SAndroid Build Coastguard Worker        dependency_path =
888*635a8641SAndroid Build Coastguard Worker            rebase_path("$dependency_output_dir/${dependency_name}",
889*635a8641SAndroid Build Coastguard Worker                        root_build_dir)
890*635a8641SAndroid Build Coastguard Worker        args += [
891*635a8641SAndroid Build Coastguard Worker          "--dependency",
892*635a8641SAndroid Build Coastguard Worker          dependency_path,
893*635a8641SAndroid Build Coastguard Worker        ]
894*635a8641SAndroid Build Coastguard Worker      }
895*635a8641SAndroid Build Coastguard Worker
896*635a8641SAndroid Build Coastguard Worker      if (enabled_sources != []) {
897*635a8641SAndroid Build Coastguard Worker        # TODO(sammc): Pass the typemap description in a file to avoid command
898*635a8641SAndroid Build Coastguard Worker        # line length limitations.
899*635a8641SAndroid Build Coastguard Worker        typemap_description = []
900*635a8641SAndroid Build Coastguard Worker        foreach(typemap, active_typemaps) {
901*635a8641SAndroid Build Coastguard Worker          _typemap_config = {
902*635a8641SAndroid Build Coastguard Worker          }
903*635a8641SAndroid Build Coastguard Worker          _typemap_config = typemap.config
904*635a8641SAndroid Build Coastguard Worker          typemap_description += [ "--start-typemap" ]
905*635a8641SAndroid Build Coastguard Worker          if (defined(_typemap_config.public_headers)) {
906*635a8641SAndroid Build Coastguard Worker            foreach(value, _typemap_config.public_headers) {
907*635a8641SAndroid Build Coastguard Worker              typemap_description += [ "public_headers=$value" ]
908*635a8641SAndroid Build Coastguard Worker            }
909*635a8641SAndroid Build Coastguard Worker          }
910*635a8641SAndroid Build Coastguard Worker          if (defined(_typemap_config.traits_headers)) {
911*635a8641SAndroid Build Coastguard Worker            foreach(value, _typemap_config.traits_headers) {
912*635a8641SAndroid Build Coastguard Worker              typemap_description += [ "traits_headers=$value" ]
913*635a8641SAndroid Build Coastguard Worker            }
914*635a8641SAndroid Build Coastguard Worker          }
915*635a8641SAndroid Build Coastguard Worker          foreach(value, _typemap_config.type_mappings) {
916*635a8641SAndroid Build Coastguard Worker            typemap_description += [ "type_mappings=$value" ]
917*635a8641SAndroid Build Coastguard Worker          }
918*635a8641SAndroid Build Coastguard Worker
919*635a8641SAndroid Build Coastguard Worker          # The typemap configuration files are not actually used as inputs here
920*635a8641SAndroid Build Coastguard Worker          # but this establishes a necessary build dependency to ensure that
921*635a8641SAndroid Build Coastguard Worker          # typemap changes force a rebuild of affected targets.
922*635a8641SAndroid Build Coastguard Worker          inputs += [ typemap.filename ]
923*635a8641SAndroid Build Coastguard Worker        }
924*635a8641SAndroid Build Coastguard Worker        args += typemap_description
925*635a8641SAndroid Build Coastguard Worker      }
926*635a8641SAndroid Build Coastguard Worker    }
927*635a8641SAndroid Build Coastguard Worker
928*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.component_macro_prefix)) {
929*635a8641SAndroid Build Coastguard Worker      output_target_type = "component"
930*635a8641SAndroid Build Coastguard Worker    } else {
931*635a8641SAndroid Build Coastguard Worker      output_target_type = "source_set"
932*635a8641SAndroid Build Coastguard Worker    }
933*635a8641SAndroid Build Coastguard Worker
934*635a8641SAndroid Build Coastguard Worker    js_data_deps_target_name = target_name + "_js_data_deps"
935*635a8641SAndroid Build Coastguard Worker    not_needed([ "js_data_deps_target_name" ])
936*635a8641SAndroid Build Coastguard Worker
937*635a8641SAndroid Build Coastguard Worker    target("jumbo_" + output_target_type, "${target_name}${variant_suffix}") {
938*635a8641SAndroid Build Coastguard Worker      if (defined(bindings_configuration.for_blink) &&
939*635a8641SAndroid Build Coastguard Worker          bindings_configuration.for_blink &&
940*635a8641SAndroid Build Coastguard Worker          defined(invoker.visibility_blink)) {
941*635a8641SAndroid Build Coastguard Worker        visibility = invoker.visibility_blink
942*635a8641SAndroid Build Coastguard Worker      } else if (defined(invoker.visibility)) {
943*635a8641SAndroid Build Coastguard Worker        visibility = invoker.visibility
944*635a8641SAndroid Build Coastguard Worker      }
945*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.testonly)) {
946*635a8641SAndroid Build Coastguard Worker        testonly = invoker.testonly
947*635a8641SAndroid Build Coastguard Worker      }
948*635a8641SAndroid Build Coastguard Worker      defines = []
949*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.export_define)) {
950*635a8641SAndroid Build Coastguard Worker        defines += [ invoker.export_define ]
951*635a8641SAndroid Build Coastguard Worker      }
952*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.export_define_blink)) {
953*635a8641SAndroid Build Coastguard Worker        defines += [ invoker.export_define_blink ]
954*635a8641SAndroid Build Coastguard Worker      }
955*635a8641SAndroid Build Coastguard Worker      if (enabled_sources != []) {
956*635a8641SAndroid Build Coastguard Worker        sources = process_file_template(enabled_sources, generator_cpp_outputs)
957*635a8641SAndroid Build Coastguard Worker      }
958*635a8641SAndroid Build Coastguard Worker      deps = [
959*635a8641SAndroid Build Coastguard Worker        ":$generator_cpp_message_ids_target_name",
960*635a8641SAndroid Build Coastguard Worker        "//mojo/public/cpp/bindings:struct_traits",
961*635a8641SAndroid Build Coastguard Worker        "//mojo/public/interfaces/bindings:bindings__generator",
962*635a8641SAndroid Build Coastguard Worker        "//mojo/public/interfaces/bindings:bindings_shared__generator",
963*635a8641SAndroid Build Coastguard Worker      ]
964*635a8641SAndroid Build Coastguard Worker      public_deps = [
965*635a8641SAndroid Build Coastguard Worker        ":$shared_cpp_library_target_name",
966*635a8641SAndroid Build Coastguard Worker        "//base",
967*635a8641SAndroid Build Coastguard Worker      ]
968*635a8641SAndroid Build Coastguard Worker      if (require_full_cpp_deps) {
969*635a8641SAndroid Build Coastguard Worker        public_deps += [ "//mojo/public/cpp/bindings" ]
970*635a8641SAndroid Build Coastguard Worker      } else {
971*635a8641SAndroid Build Coastguard Worker        public_deps += [ "//mojo/public/cpp/bindings:bindings_base" ]
972*635a8641SAndroid Build Coastguard Worker      }
973*635a8641SAndroid Build Coastguard Worker
974*635a8641SAndroid Build Coastguard Worker      if (enabled_sources != []) {
975*635a8641SAndroid Build Coastguard Worker        public_deps += [ ":$generator_target_name" ]
976*635a8641SAndroid Build Coastguard Worker      }
977*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.component_macro_prefix)) {
978*635a8641SAndroid Build Coastguard Worker        output_name = "${invoker.component_output_prefix}${variant_suffix}"
979*635a8641SAndroid Build Coastguard Worker        defines += [ "IS_${invoker.component_macro_prefix}" +
980*635a8641SAndroid Build Coastguard Worker                     "${bindings_configuration.component_macro_suffix}_IMPL" ]
981*635a8641SAndroid Build Coastguard Worker      }
982*635a8641SAndroid Build Coastguard Worker      foreach(d, all_deps) {
983*635a8641SAndroid Build Coastguard Worker        # Resolve the name, so that a target //mojo/something becomes
984*635a8641SAndroid Build Coastguard Worker        # //mojo/something:something and we can append variant_suffix to
985*635a8641SAndroid Build Coastguard Worker        # get the cpp dependency name.
986*635a8641SAndroid Build Coastguard Worker        full_name = get_label_info("$d", "label_no_toolchain")
987*635a8641SAndroid Build Coastguard Worker        public_deps += [ "${full_name}${variant_suffix}" ]
988*635a8641SAndroid Build Coastguard Worker      }
989*635a8641SAndroid Build Coastguard Worker      if (defined(bindings_configuration.for_blink) &&
990*635a8641SAndroid Build Coastguard Worker          bindings_configuration.for_blink) {
991*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.overridden_deps_blink)) {
992*635a8641SAndroid Build Coastguard Worker          foreach(d, invoker.overridden_deps_blink) {
993*635a8641SAndroid Build Coastguard Worker            # Resolve the name, so that a target //mojo/something becomes
994*635a8641SAndroid Build Coastguard Worker            # //mojo/something:something and we can append variant_suffix
995*635a8641SAndroid Build Coastguard Worker            # to get the cpp dependency name.
996*635a8641SAndroid Build Coastguard Worker            full_name = get_label_info("$d", "label_no_toolchain")
997*635a8641SAndroid Build Coastguard Worker            public_deps -= [ "${full_name}${variant_suffix}" ]
998*635a8641SAndroid Build Coastguard Worker          }
999*635a8641SAndroid Build Coastguard Worker          public_deps += invoker.component_deps_blink
1000*635a8641SAndroid Build Coastguard Worker        }
1001*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.check_includes_blink)) {
1002*635a8641SAndroid Build Coastguard Worker          check_includes = invoker.check_includes_blink
1003*635a8641SAndroid Build Coastguard Worker        }
1004*635a8641SAndroid Build Coastguard Worker      } else {
1005*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.check_includes_blink)) {
1006*635a8641SAndroid Build Coastguard Worker          not_needed(invoker, [ "check_includes_blink" ])
1007*635a8641SAndroid Build Coastguard Worker        }
1008*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.overridden_deps)) {
1009*635a8641SAndroid Build Coastguard Worker          foreach(d, invoker.overridden_deps) {
1010*635a8641SAndroid Build Coastguard Worker            # Resolve the name, so that a target //mojo/something becomes
1011*635a8641SAndroid Build Coastguard Worker            # //mojo/something:something and we can append variant_suffix
1012*635a8641SAndroid Build Coastguard Worker            # to get the cpp dependency name.
1013*635a8641SAndroid Build Coastguard Worker            full_name = get_label_info("$d", "label_no_toolchain")
1014*635a8641SAndroid Build Coastguard Worker            public_deps -= [ "${full_name}${variant_suffix}" ]
1015*635a8641SAndroid Build Coastguard Worker          }
1016*635a8641SAndroid Build Coastguard Worker          public_deps += invoker.component_deps
1017*635a8641SAndroid Build Coastguard Worker        }
1018*635a8641SAndroid Build Coastguard Worker      }
1019*635a8641SAndroid Build Coastguard Worker      foreach(typemap, active_typemaps) {
1020*635a8641SAndroid Build Coastguard Worker        _typemap_config = {
1021*635a8641SAndroid Build Coastguard Worker        }
1022*635a8641SAndroid Build Coastguard Worker        _typemap_config = typemap.config
1023*635a8641SAndroid Build Coastguard Worker        if (defined(_typemap_config.sources)) {
1024*635a8641SAndroid Build Coastguard Worker          sources += _typemap_config.sources
1025*635a8641SAndroid Build Coastguard Worker        }
1026*635a8641SAndroid Build Coastguard Worker        if (defined(_typemap_config.public_deps)) {
1027*635a8641SAndroid Build Coastguard Worker          public_deps += _typemap_config.public_deps
1028*635a8641SAndroid Build Coastguard Worker        }
1029*635a8641SAndroid Build Coastguard Worker        if (defined(_typemap_config.deps)) {
1030*635a8641SAndroid Build Coastguard Worker          deps += _typemap_config.deps
1031*635a8641SAndroid Build Coastguard Worker        }
1032*635a8641SAndroid Build Coastguard Worker      }
1033*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.export_header)) {
1034*635a8641SAndroid Build Coastguard Worker        sources += [ "//" + invoker.export_header ]
1035*635a8641SAndroid Build Coastguard Worker      }
1036*635a8641SAndroid Build Coastguard Worker      if (defined(bindings_configuration.for_blink) &&
1037*635a8641SAndroid Build Coastguard Worker          bindings_configuration.for_blink) {
1038*635a8641SAndroid Build Coastguard Worker        public_deps += [ "//mojo/public/cpp/bindings:wtf_support" ]
1039*635a8641SAndroid Build Coastguard Worker      }
1040*635a8641SAndroid Build Coastguard Worker
1041*635a8641SAndroid Build Coastguard Worker      if (enable_ipc_fuzzer) {
1042*635a8641SAndroid Build Coastguard Worker        # Generate JS bindings by default if IPC fuzzer is enabled.
1043*635a8641SAndroid Build Coastguard Worker        public_deps += [ ":$js_data_deps_target_name" ]
1044*635a8641SAndroid Build Coastguard Worker      }
1045*635a8641SAndroid Build Coastguard Worker    }
1046*635a8641SAndroid Build Coastguard Worker
1047*635a8641SAndroid Build Coastguard Worker    if (!cpp_only && is_android) {
1048*635a8641SAndroid Build Coastguard Worker      import("//build/config/android/rules.gni")
1049*635a8641SAndroid Build Coastguard Worker
1050*635a8641SAndroid Build Coastguard Worker      java_generator_target_name = target_name + "_java__generator"
1051*635a8641SAndroid Build Coastguard Worker      if (enabled_sources != []) {
1052*635a8641SAndroid Build Coastguard Worker        generator_java_outputs =
1053*635a8641SAndroid Build Coastguard Worker            [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ]
1054*635a8641SAndroid Build Coastguard Worker        action(java_generator_target_name) {
1055*635a8641SAndroid Build Coastguard Worker          script = mojom_generator_script
1056*635a8641SAndroid Build Coastguard Worker          inputs = mojom_generator_sources + jinja2_sources
1057*635a8641SAndroid Build Coastguard Worker          sources = enabled_sources
1058*635a8641SAndroid Build Coastguard Worker          deps = [
1059*635a8641SAndroid Build Coastguard Worker                   ":$parsed_target_name",
1060*635a8641SAndroid Build Coastguard Worker                   ":$type_mappings_target_name",
1061*635a8641SAndroid Build Coastguard Worker                   "//mojo/public/tools/bindings:precompile_templates",
1062*635a8641SAndroid Build Coastguard Worker                 ] + verify_deps_target_names
1063*635a8641SAndroid Build Coastguard Worker          outputs = []
1064*635a8641SAndroid Build Coastguard Worker          args = common_generator_args
1065*635a8641SAndroid Build Coastguard Worker          filelist = []
1066*635a8641SAndroid Build Coastguard Worker          foreach(source, invoker.sources) {
1067*635a8641SAndroid Build Coastguard Worker            filelist += [ rebase_path("$source", root_build_dir) ]
1068*635a8641SAndroid Build Coastguard Worker            outputs += [ "$target_gen_dir/$source.srcjar" ]
1069*635a8641SAndroid Build Coastguard Worker          }
1070*635a8641SAndroid Build Coastguard Worker
1071*635a8641SAndroid Build Coastguard Worker          response_file_contents = filelist
1072*635a8641SAndroid Build Coastguard Worker
1073*635a8641SAndroid Build Coastguard Worker          args += [
1074*635a8641SAndroid Build Coastguard Worker            "--filelist={{response_file_name}}",
1075*635a8641SAndroid Build Coastguard Worker            "-g",
1076*635a8641SAndroid Build Coastguard Worker            "java",
1077*635a8641SAndroid Build Coastguard Worker          ]
1078*635a8641SAndroid Build Coastguard Worker
1079*635a8641SAndroid Build Coastguard Worker          if (!defined(invoker.scramble_message_ids) ||
1080*635a8641SAndroid Build Coastguard Worker              invoker.scramble_message_ids) {
1081*635a8641SAndroid Build Coastguard Worker            inputs += message_scrambling_inputs
1082*635a8641SAndroid Build Coastguard Worker            args += message_scrambling_args
1083*635a8641SAndroid Build Coastguard Worker          }
1084*635a8641SAndroid Build Coastguard Worker        }
1085*635a8641SAndroid Build Coastguard Worker      } else {
1086*635a8641SAndroid Build Coastguard Worker        group(java_generator_target_name) {
1087*635a8641SAndroid Build Coastguard Worker        }
1088*635a8641SAndroid Build Coastguard Worker      }
1089*635a8641SAndroid Build Coastguard Worker
1090*635a8641SAndroid Build Coastguard Worker      java_srcjar_target_name = target_name + "_java_sources"
1091*635a8641SAndroid Build Coastguard Worker      action(java_srcjar_target_name) {
1092*635a8641SAndroid Build Coastguard Worker        script = "//mojo/public/tools/gn/zip.py"
1093*635a8641SAndroid Build Coastguard Worker        inputs = []
1094*635a8641SAndroid Build Coastguard Worker        if (enabled_sources != []) {
1095*635a8641SAndroid Build Coastguard Worker          inputs =
1096*635a8641SAndroid Build Coastguard Worker              process_file_template(enabled_sources, generator_java_outputs)
1097*635a8641SAndroid Build Coastguard Worker        }
1098*635a8641SAndroid Build Coastguard Worker        output = "$target_gen_dir/$target_name.srcjar"
1099*635a8641SAndroid Build Coastguard Worker        outputs = [
1100*635a8641SAndroid Build Coastguard Worker          output,
1101*635a8641SAndroid Build Coastguard Worker        ]
1102*635a8641SAndroid Build Coastguard Worker        rebase_inputs = rebase_path(inputs, root_build_dir)
1103*635a8641SAndroid Build Coastguard Worker        rebase_output = rebase_path(output, root_build_dir)
1104*635a8641SAndroid Build Coastguard Worker        args = [
1105*635a8641SAndroid Build Coastguard Worker          "--zip-inputs=$rebase_inputs",
1106*635a8641SAndroid Build Coastguard Worker          "--output=$rebase_output",
1107*635a8641SAndroid Build Coastguard Worker        ]
1108*635a8641SAndroid Build Coastguard Worker        deps = []
1109*635a8641SAndroid Build Coastguard Worker        if (enabled_sources != []) {
1110*635a8641SAndroid Build Coastguard Worker          deps = [
1111*635a8641SAndroid Build Coastguard Worker            ":$java_generator_target_name",
1112*635a8641SAndroid Build Coastguard Worker          ]
1113*635a8641SAndroid Build Coastguard Worker        }
1114*635a8641SAndroid Build Coastguard Worker      }
1115*635a8641SAndroid Build Coastguard Worker
1116*635a8641SAndroid Build Coastguard Worker      java_target_name = target_name + "_java"
1117*635a8641SAndroid Build Coastguard Worker      android_library(java_target_name) {
1118*635a8641SAndroid Build Coastguard Worker        deps = [
1119*635a8641SAndroid Build Coastguard Worker          "//base:base_java",
1120*635a8641SAndroid Build Coastguard Worker          "//mojo/public/java:bindings_java",
1121*635a8641SAndroid Build Coastguard Worker          "//mojo/public/java:system_java",
1122*635a8641SAndroid Build Coastguard Worker        ]
1123*635a8641SAndroid Build Coastguard Worker
1124*635a8641SAndroid Build Coastguard Worker        # Disable warnings/checks on these generated files.
1125*635a8641SAndroid Build Coastguard Worker        chromium_code = false
1126*635a8641SAndroid Build Coastguard Worker
1127*635a8641SAndroid Build Coastguard Worker        foreach(d, all_deps) {
1128*635a8641SAndroid Build Coastguard Worker          # Resolve the name, so that a target //mojo/something becomes
1129*635a8641SAndroid Build Coastguard Worker          # //mojo/something:something and we can append "_java" to get the java
1130*635a8641SAndroid Build Coastguard Worker          # dependency name.
1131*635a8641SAndroid Build Coastguard Worker          full_name = get_label_info(d, "label_no_toolchain")
1132*635a8641SAndroid Build Coastguard Worker          deps += [ "${full_name}_java" ]
1133*635a8641SAndroid Build Coastguard Worker        }
1134*635a8641SAndroid Build Coastguard Worker
1135*635a8641SAndroid Build Coastguard Worker        srcjar_deps = [ ":$java_srcjar_target_name" ]
1136*635a8641SAndroid Build Coastguard Worker      }
1137*635a8641SAndroid Build Coastguard Worker    }
1138*635a8641SAndroid Build Coastguard Worker  }
1139*635a8641SAndroid Build Coastguard Worker
1140*635a8641SAndroid Build Coastguard Worker  if (enable_ipc_fuzzer || !defined(invoker.cpp_only) || !invoker.cpp_only) {
1141*635a8641SAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
1142*635a8641SAndroid Build Coastguard Worker      generator_js_target_name = "${target_name}_js__generator"
1143*635a8641SAndroid Build Coastguard Worker      generator_js_outputs = [
1144*635a8641SAndroid Build Coastguard Worker        "{{source_gen_dir}}/{{source_name_part}}.mojom.js",
1145*635a8641SAndroid Build Coastguard Worker        "{{source_gen_dir}}/{{source_name_part}}.mojom.externs.js",
1146*635a8641SAndroid Build Coastguard Worker      ]
1147*635a8641SAndroid Build Coastguard Worker      action(generator_js_target_name) {
1148*635a8641SAndroid Build Coastguard Worker        script = mojom_generator_script
1149*635a8641SAndroid Build Coastguard Worker        inputs = mojom_generator_sources + jinja2_sources
1150*635a8641SAndroid Build Coastguard Worker        sources = []
1151*635a8641SAndroid Build Coastguard Worker        if (defined(invoker.sources)) {
1152*635a8641SAndroid Build Coastguard Worker          sources += invoker.sources
1153*635a8641SAndroid Build Coastguard Worker        }
1154*635a8641SAndroid Build Coastguard Worker        deps = [
1155*635a8641SAndroid Build Coastguard Worker                 ":$parsed_target_name",
1156*635a8641SAndroid Build Coastguard Worker                 "//mojo/public/tools/bindings:precompile_templates",
1157*635a8641SAndroid Build Coastguard Worker               ] + verify_deps_target_names
1158*635a8641SAndroid Build Coastguard Worker        outputs = []
1159*635a8641SAndroid Build Coastguard Worker        args = common_generator_args
1160*635a8641SAndroid Build Coastguard Worker        filelist = []
1161*635a8641SAndroid Build Coastguard Worker        foreach(source, invoker.sources) {
1162*635a8641SAndroid Build Coastguard Worker          filelist += [ rebase_path("$source", root_build_dir) ]
1163*635a8641SAndroid Build Coastguard Worker          outputs += [
1164*635a8641SAndroid Build Coastguard Worker            "$target_gen_dir/$source.js",
1165*635a8641SAndroid Build Coastguard Worker            "$target_gen_dir/$source.externs.js",
1166*635a8641SAndroid Build Coastguard Worker          ]
1167*635a8641SAndroid Build Coastguard Worker        }
1168*635a8641SAndroid Build Coastguard Worker
1169*635a8641SAndroid Build Coastguard Worker        response_file_contents = filelist
1170*635a8641SAndroid Build Coastguard Worker
1171*635a8641SAndroid Build Coastguard Worker        args += [
1172*635a8641SAndroid Build Coastguard Worker          "--filelist={{response_file_name}}",
1173*635a8641SAndroid Build Coastguard Worker          "-g",
1174*635a8641SAndroid Build Coastguard Worker          "javascript",
1175*635a8641SAndroid Build Coastguard Worker        ]
1176*635a8641SAndroid Build Coastguard Worker
1177*635a8641SAndroid Build Coastguard Worker        if (!defined(invoker.scramble_message_ids) ||
1178*635a8641SAndroid Build Coastguard Worker            invoker.scramble_message_ids) {
1179*635a8641SAndroid Build Coastguard Worker          inputs += message_scrambling_inputs
1180*635a8641SAndroid Build Coastguard Worker          args += message_scrambling_args
1181*635a8641SAndroid Build Coastguard Worker        }
1182*635a8641SAndroid Build Coastguard Worker
1183*635a8641SAndroid Build Coastguard Worker        if (enable_ipc_fuzzer) {
1184*635a8641SAndroid Build Coastguard Worker          args += [ "--generate_fuzzing" ]
1185*635a8641SAndroid Build Coastguard Worker        }
1186*635a8641SAndroid Build Coastguard Worker      }
1187*635a8641SAndroid Build Coastguard Worker    }
1188*635a8641SAndroid Build Coastguard Worker
1189*635a8641SAndroid Build Coastguard Worker    js_target_name = target_name + "_js"
1190*635a8641SAndroid Build Coastguard Worker    group(js_target_name) {
1191*635a8641SAndroid Build Coastguard Worker      public_deps = []
1192*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.sources)) {
1193*635a8641SAndroid Build Coastguard Worker        public_deps += [ ":$generator_js_target_name" ]
1194*635a8641SAndroid Build Coastguard Worker      }
1195*635a8641SAndroid Build Coastguard Worker
1196*635a8641SAndroid Build Coastguard Worker      foreach(d, all_deps) {
1197*635a8641SAndroid Build Coastguard Worker        full_name = get_label_info(d, "label_no_toolchain")
1198*635a8641SAndroid Build Coastguard Worker        public_deps += [ "${full_name}_js" ]
1199*635a8641SAndroid Build Coastguard Worker      }
1200*635a8641SAndroid Build Coastguard Worker    }
1201*635a8641SAndroid Build Coastguard Worker
1202*635a8641SAndroid Build Coastguard Worker    group(js_data_deps_target_name) {
1203*635a8641SAndroid Build Coastguard Worker      deps = []
1204*635a8641SAndroid Build Coastguard Worker      if (defined(invoker.sources)) {
1205*635a8641SAndroid Build Coastguard Worker        data = process_file_template(invoker.sources, generator_js_outputs)
1206*635a8641SAndroid Build Coastguard Worker        deps += [ ":$generator_js_target_name" ]
1207*635a8641SAndroid Build Coastguard Worker      }
1208*635a8641SAndroid Build Coastguard Worker
1209*635a8641SAndroid Build Coastguard Worker      data_deps = []
1210*635a8641SAndroid Build Coastguard Worker      foreach(d, all_deps) {
1211*635a8641SAndroid Build Coastguard Worker        full_name = get_label_info(d, "label_no_toolchain")
1212*635a8641SAndroid Build Coastguard Worker        data_deps += [ "${full_name}_js_data_deps" ]
1213*635a8641SAndroid Build Coastguard Worker      }
1214*635a8641SAndroid Build Coastguard Worker    }
1215*635a8641SAndroid Build Coastguard Worker  }
1216*635a8641SAndroid Build Coastguard Worker}
1217*635a8641SAndroid Build Coastguard Worker
1218*635a8641SAndroid Build Coastguard Worker# A helper for the mojom() template above when component libraries are desired
1219*635a8641SAndroid Build Coastguard Worker# for generated C++ bindings units. Supports all the same arguments as mojom()
1220*635a8641SAndroid Build Coastguard Worker# except for the optional |component_output_prefix| and |component_macro_prefix|
1221*635a8641SAndroid Build Coastguard Worker# arguments. These are instead shortened to |output_prefix| and |macro_prefix|
1222*635a8641SAndroid Build Coastguard Worker# and are *required*.
1223*635a8641SAndroid Build Coastguard Workertemplate("mojom_component") {
1224*635a8641SAndroid Build Coastguard Worker  assert(defined(invoker.output_prefix) && defined(invoker.macro_prefix))
1225*635a8641SAndroid Build Coastguard Worker
1226*635a8641SAndroid Build Coastguard Worker  mojom(target_name) {
1227*635a8641SAndroid Build Coastguard Worker    forward_variables_from(invoker,
1228*635a8641SAndroid Build Coastguard Worker                           "*",
1229*635a8641SAndroid Build Coastguard Worker                           [
1230*635a8641SAndroid Build Coastguard Worker                             "output_prefix",
1231*635a8641SAndroid Build Coastguard Worker                             "macro_prefix",
1232*635a8641SAndroid Build Coastguard Worker                           ])
1233*635a8641SAndroid Build Coastguard Worker    component_output_prefix = invoker.output_prefix
1234*635a8641SAndroid Build Coastguard Worker    component_macro_prefix = invoker.macro_prefix
1235*635a8641SAndroid Build Coastguard Worker  }
1236*635a8641SAndroid Build Coastguard Worker}
1237