xref: /aosp_15_r20/external/perfetto/gn/proto_library.gni (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker#
3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker#
7*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker#
9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport("perfetto.gni")
16*6dbdd20aSAndroid Build Coastguard Workerimport("perfetto_component.gni")
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Worker# This gni file defines rules for proto generation. There are various types of
19*6dbdd20aSAndroid Build Coastguard Worker# proto targets that can be defined in our codebase:
20*6dbdd20aSAndroid Build Coastguard Worker# "lite" targets: these use the standard libprotobuf library. They are used
21*6dbdd20aSAndroid Build Coastguard Worker#     mainly for tests and readback.
22*6dbdd20aSAndroid Build Coastguard Worker# "zero" targets: these use the protozero library and its protoc plugin. They
23*6dbdd20aSAndroid Build Coastguard Worker#     are used pretty much everywhere.
24*6dbdd20aSAndroid Build Coastguard Worker# "descriptor" targets: they are used to generate a proto-encoded reflection
25*6dbdd20aSAndroid Build Coastguard Worker#     descriptor that describes the schema of the proto using protobuf itself.
26*6dbdd20aSAndroid Build Coastguard Worker# All these targets can be generated using the perfetto_proto_library rule. It
27*6dbdd20aSAndroid Build Coastguard Worker# wraps the instantiation of several proto targets using a convenience template.
28*6dbdd20aSAndroid Build Coastguard Worker#
29*6dbdd20aSAndroid Build Coastguard Worker# For instance:
30*6dbdd20aSAndroid Build Coastguard Worker# perfetto_proto_library("xxx_@TYPE@") {
31*6dbdd20aSAndroid Build Coastguard Worker#   proto_generators = [ "lite", "zero" ]  # lite+zero+cpp is the default value.
32*6dbdd20aSAndroid Build Coastguard Worker#   sources = [ "one.proto", "two.proto" ]
33*6dbdd20aSAndroid Build Coastguard Worker#   deps = [ "dep:@TYPE@" ]
34*6dbdd20aSAndroid Build Coastguard Worker# }
35*6dbdd20aSAndroid Build Coastguard Worker#
36*6dbdd20aSAndroid Build Coastguard Worker# Is the equivalent of:
37*6dbdd20aSAndroid Build Coastguard Worker# proto_library("xxx_lite")     { sources = [...], deps = [ "dep:lite"] }
38*6dbdd20aSAndroid Build Coastguard Worker# protozero_library("xxx_zero") { sources = [...], deps = [ "dep:zero"] }
39*6dbdd20aSAndroid Build Coastguard Worker
40*6dbdd20aSAndroid Build Coastguard Worker# Load the protobuf's proto_library() definition.
41*6dbdd20aSAndroid Build Coastguard Workerif (!defined(perfetto_protobuf_target_prefix)) {
42*6dbdd20aSAndroid Build Coastguard Worker  if (perfetto_root_path == "//") {
43*6dbdd20aSAndroid Build Coastguard Worker    perfetto_protobuf_target_prefix = "//buildtools"
44*6dbdd20aSAndroid Build Coastguard Worker  } else {
45*6dbdd20aSAndroid Build Coastguard Worker    perfetto_protobuf_target_prefix = "//third_party/protobuf"
46*6dbdd20aSAndroid Build Coastguard Worker  }
47*6dbdd20aSAndroid Build Coastguard Worker}
48*6dbdd20aSAndroid Build Coastguard Workerif (!defined(perfetto_protobuf_gni)) {
49*6dbdd20aSAndroid Build Coastguard Worker  if (perfetto_root_path == "//") {
50*6dbdd20aSAndroid Build Coastguard Worker    perfetto_protobuf_gni = "//gn/standalone/proto_library.gni"
51*6dbdd20aSAndroid Build Coastguard Worker  } else {
52*6dbdd20aSAndroid Build Coastguard Worker    perfetto_protobuf_gni = "//third_party/protobuf/proto_library.gni"
53*6dbdd20aSAndroid Build Coastguard Worker  }
54*6dbdd20aSAndroid Build Coastguard Worker}
55*6dbdd20aSAndroid Build Coastguard Workerif (!defined(perfetto_protobuf_src_dir)) {
56*6dbdd20aSAndroid Build Coastguard Worker  if (perfetto_root_path == "//") {
57*6dbdd20aSAndroid Build Coastguard Worker    perfetto_protobuf_src_dir = "//buildtools/protobuf/src"
58*6dbdd20aSAndroid Build Coastguard Worker  } else {
59*6dbdd20aSAndroid Build Coastguard Worker    perfetto_protobuf_src_dir = "//third_party/protobuf/src"
60*6dbdd20aSAndroid Build Coastguard Worker  }
61*6dbdd20aSAndroid Build Coastguard Worker}
62*6dbdd20aSAndroid Build Coastguard Workerimport(perfetto_protobuf_gni)
63*6dbdd20aSAndroid Build Coastguard Worker
64*6dbdd20aSAndroid Build Coastguard Worker# Equivalent to proto_library (generation of .h/.cc from .proto files) but
65*6dbdd20aSAndroid Build Coastguard Worker# enables also generation using the protozero plugin.
66*6dbdd20aSAndroid Build Coastguard Worker# The generated files will have the .pbzero.{cc,h} suffix, as opposed to the
67*6dbdd20aSAndroid Build Coastguard Worker# .pb.{cc,h} of the official proto library.
68*6dbdd20aSAndroid Build Coastguard Worker# DO NOT use this target directly, use perfetto_proto_library() below.
69*6dbdd20aSAndroid Build Coastguard Workertemplate("protozero_library") {
70*6dbdd20aSAndroid Build Coastguard Worker  proto_library(target_name) {
71*6dbdd20aSAndroid Build Coastguard Worker    perfetto_root_path = invoker.perfetto_root_path
72*6dbdd20aSAndroid Build Coastguard Worker
73*6dbdd20aSAndroid Build Coastguard Worker    generate_cc = false
74*6dbdd20aSAndroid Build Coastguard Worker    generate_python = false
75*6dbdd20aSAndroid Build Coastguard Worker    generator_plugin_label =
76*6dbdd20aSAndroid Build Coastguard Worker        perfetto_root_path + "src/protozero/protoc_plugin:protozero_plugin"
77*6dbdd20aSAndroid Build Coastguard Worker    generator_plugin_suffix = ".pbzero"
78*6dbdd20aSAndroid Build Coastguard Worker    if (build_with_chromium) {
79*6dbdd20aSAndroid Build Coastguard Worker      component_build_force_source_set = true
80*6dbdd20aSAndroid Build Coastguard Worker    }
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard Worker    # Convert deps to link_deps: the proto_library rule requires that C++ files
83*6dbdd20aSAndroid Build Coastguard Worker    # are passed in as link_deps wheras in Perfetto, we always works with deps.
84*6dbdd20aSAndroid Build Coastguard Worker    link_deps = []
85*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
86*6dbdd20aSAndroid Build Coastguard Worker      link_deps += invoker.deps
87*6dbdd20aSAndroid Build Coastguard Worker    }
88*6dbdd20aSAndroid Build Coastguard Worker
89*6dbdd20aSAndroid Build Coastguard Worker    # omit_protozero_dep is intended to be used when protozero_library
90*6dbdd20aSAndroid Build Coastguard Worker    # is used in Chrome (for generation of code for proto extensions)
91*6dbdd20aSAndroid Build Coastguard Worker    # to avoid ODR violations in case of component builds. The embedder
92*6dbdd20aSAndroid Build Coastguard Worker    # (Chrome) is then responsible for adding the appropriate transitive
93*6dbdd20aSAndroid Build Coastguard Worker    # dependency on Protozero.
94*6dbdd20aSAndroid Build Coastguard Worker    #
95*6dbdd20aSAndroid Build Coastguard Worker    # TODO(b/173041866): use fine-grained components instead when available
96*6dbdd20aSAndroid Build Coastguard Worker    if (!(defined(invoker.omit_protozero_dep) && invoker.omit_protozero_dep)) {
97*6dbdd20aSAndroid Build Coastguard Worker      link_deps += [ perfetto_root_path + "src/protozero" ]
98*6dbdd20aSAndroid Build Coastguard Worker    }
99*6dbdd20aSAndroid Build Coastguard Worker
100*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.link_deps)) {
101*6dbdd20aSAndroid Build Coastguard Worker      link_deps += invoker.link_deps
102*6dbdd20aSAndroid Build Coastguard Worker    }
103*6dbdd20aSAndroid Build Coastguard Worker
104*6dbdd20aSAndroid Build Coastguard Worker    forward_variables_from(invoker,
105*6dbdd20aSAndroid Build Coastguard Worker                           [
106*6dbdd20aSAndroid Build Coastguard Worker                             "defines",
107*6dbdd20aSAndroid Build Coastguard Worker                             "generator_plugin_options",
108*6dbdd20aSAndroid Build Coastguard Worker                             "include_dirs",
109*6dbdd20aSAndroid Build Coastguard Worker                             "proto_data_sources",
110*6dbdd20aSAndroid Build Coastguard Worker                             "proto_deps",
111*6dbdd20aSAndroid Build Coastguard Worker                             "proto_in_dir",
112*6dbdd20aSAndroid Build Coastguard Worker                             "proto_out_dir",
113*6dbdd20aSAndroid Build Coastguard Worker                             "sources",
114*6dbdd20aSAndroid Build Coastguard Worker                             "testonly",
115*6dbdd20aSAndroid Build Coastguard Worker                             "visibility",
116*6dbdd20aSAndroid Build Coastguard Worker                             "generate_descriptor",
117*6dbdd20aSAndroid Build Coastguard Worker                             "propagate_imports_configs",
118*6dbdd20aSAndroid Build Coastguard Worker                             "import_dirs",
119*6dbdd20aSAndroid Build Coastguard Worker                           ])
120*6dbdd20aSAndroid Build Coastguard Worker  }
121*6dbdd20aSAndroid Build Coastguard Worker}
122*6dbdd20aSAndroid Build Coastguard Worker
123*6dbdd20aSAndroid Build Coastguard Worker# This template generates .gen.cc/h files from .proto files. The generated
124*6dbdd20aSAndroid Build Coastguard Worker# sources are actual C++ classes that can be moved and copied around, very
125*6dbdd20aSAndroid Build Coastguard Worker# similar to the libprotobuf generated ones API-wise, but use protozero under
126*6dbdd20aSAndroid Build Coastguard Worker# the hoods, without any zero-copy benefit though.
127*6dbdd20aSAndroid Build Coastguard Worker# They are mainly used for the perfetto IPC layer and tests.
128*6dbdd20aSAndroid Build Coastguard Workertemplate("protozero_cpp_library") {
129*6dbdd20aSAndroid Build Coastguard Worker  proto_library(target_name) {
130*6dbdd20aSAndroid Build Coastguard Worker    perfetto_root_path = invoker.perfetto_root_path
131*6dbdd20aSAndroid Build Coastguard Worker
132*6dbdd20aSAndroid Build Coastguard Worker    generate_cc = false
133*6dbdd20aSAndroid Build Coastguard Worker    generate_python = false
134*6dbdd20aSAndroid Build Coastguard Worker    generator_plugin_label =
135*6dbdd20aSAndroid Build Coastguard Worker        perfetto_root_path + "src/protozero/protoc_plugin:cppgen_plugin"
136*6dbdd20aSAndroid Build Coastguard Worker    generator_plugin_suffix = ".gen"
137*6dbdd20aSAndroid Build Coastguard Worker    if (build_with_chromium) {
138*6dbdd20aSAndroid Build Coastguard Worker      component_build_force_source_set = true
139*6dbdd20aSAndroid Build Coastguard Worker    }
140*6dbdd20aSAndroid Build Coastguard Worker
141*6dbdd20aSAndroid Build Coastguard Worker    link_deps = [
142*6dbdd20aSAndroid Build Coastguard Worker      "$perfetto_root_path/gn:default_deps",
143*6dbdd20aSAndroid Build Coastguard Worker      "$perfetto_root_path/include/perfetto/base",
144*6dbdd20aSAndroid Build Coastguard Worker      "$perfetto_root_path/src/protozero",
145*6dbdd20aSAndroid Build Coastguard Worker    ]
146*6dbdd20aSAndroid Build Coastguard Worker
147*6dbdd20aSAndroid Build Coastguard Worker    # Convert deps to link_deps: the proto_library rule requires that C++ files
148*6dbdd20aSAndroid Build Coastguard Worker    # are passed in as link_deps wheras in Perfetto, we always works with deps.
149*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
150*6dbdd20aSAndroid Build Coastguard Worker      link_deps += invoker.deps
151*6dbdd20aSAndroid Build Coastguard Worker    }
152*6dbdd20aSAndroid Build Coastguard Worker    forward_variables_from(invoker,
153*6dbdd20aSAndroid Build Coastguard Worker                           [
154*6dbdd20aSAndroid Build Coastguard Worker                             "defines",
155*6dbdd20aSAndroid Build Coastguard Worker                             "generator_plugin_options",
156*6dbdd20aSAndroid Build Coastguard Worker                             "include_dirs",
157*6dbdd20aSAndroid Build Coastguard Worker                             "proto_deps",
158*6dbdd20aSAndroid Build Coastguard Worker                             "proto_in_dir",
159*6dbdd20aSAndroid Build Coastguard Worker                             "proto_out_dir",
160*6dbdd20aSAndroid Build Coastguard Worker                             "sources",
161*6dbdd20aSAndroid Build Coastguard Worker                             "testonly",
162*6dbdd20aSAndroid Build Coastguard Worker                             "visibility",
163*6dbdd20aSAndroid Build Coastguard Worker                             "generate_descriptor",
164*6dbdd20aSAndroid Build Coastguard Worker                             "propagate_imports_configs",
165*6dbdd20aSAndroid Build Coastguard Worker                             "import_dirs",
166*6dbdd20aSAndroid Build Coastguard Worker                           ])
167*6dbdd20aSAndroid Build Coastguard Worker  }
168*6dbdd20aSAndroid Build Coastguard Worker}
169*6dbdd20aSAndroid Build Coastguard Worker
170*6dbdd20aSAndroid Build Coastguard Worker# Generates .ipc.{h,cc} stubs for IPC services defined in .proto files.
171*6dbdd20aSAndroid Build Coastguard Workertemplate("ipc_library") {
172*6dbdd20aSAndroid Build Coastguard Worker  proto_library(target_name) {
173*6dbdd20aSAndroid Build Coastguard Worker    perfetto_root_path = invoker.perfetto_root_path
174*6dbdd20aSAndroid Build Coastguard Worker    generate_cc = false
175*6dbdd20aSAndroid Build Coastguard Worker    generate_python = false
176*6dbdd20aSAndroid Build Coastguard Worker    generator_plugin_label =
177*6dbdd20aSAndroid Build Coastguard Worker        "$perfetto_root_path/src/ipc/protoc_plugin:ipc_plugin"
178*6dbdd20aSAndroid Build Coastguard Worker    generator_plugin_suffix = ".ipc"
179*6dbdd20aSAndroid Build Coastguard Worker    link_deps = [ "$perfetto_root_path/gn:default_deps" ]
180*6dbdd20aSAndroid Build Coastguard Worker    if (perfetto_component_type == "static_library") {
181*6dbdd20aSAndroid Build Coastguard Worker      link_deps += [ "$perfetto_root_path/src/ipc:perfetto_ipc" ]
182*6dbdd20aSAndroid Build Coastguard Worker    } else {
183*6dbdd20aSAndroid Build Coastguard Worker      link_deps += [ "$perfetto_root_path/src/ipc:common" ]
184*6dbdd20aSAndroid Build Coastguard Worker    }
185*6dbdd20aSAndroid Build Coastguard Worker    if (is_win) {
186*6dbdd20aSAndroid Build Coastguard Worker      # TODO(primiano): investigate this. In Windows standalone builds, some
187*6dbdd20aSAndroid Build Coastguard Worker      # executable targets end up in a state where no code pulls a dep on the
188*6dbdd20aSAndroid Build Coastguard Worker      # ipc:client (in turn that seems a subtle consequence of not having
189*6dbdd20aSAndroid Build Coastguard Worker      # traced_probes on Windows). This dep here is effectively needed because
190*6dbdd20aSAndroid Build Coastguard Worker      # the client-side code in the generated .ipc.cc effectively depends on the
191*6dbdd20aSAndroid Build Coastguard Worker      # client-side IPC library. Perhaps we just should do this unconditionally
192*6dbdd20aSAndroid Build Coastguard Worker      # on all platforms?
193*6dbdd20aSAndroid Build Coastguard Worker      if (perfetto_component_type == "static_library") {
194*6dbdd20aSAndroid Build Coastguard Worker        link_deps += [ "$perfetto_root_path/src/ipc:perfetto_ipc" ]
195*6dbdd20aSAndroid Build Coastguard Worker      } else {
196*6dbdd20aSAndroid Build Coastguard Worker        link_deps += [ "$perfetto_root_path/src/ipc:client" ]
197*6dbdd20aSAndroid Build Coastguard Worker      }
198*6dbdd20aSAndroid Build Coastguard Worker    }
199*6dbdd20aSAndroid Build Coastguard Worker
200*6dbdd20aSAndroid Build Coastguard Worker    # Convert deps to link_deps: the proto_library rule requires that C++ files
201*6dbdd20aSAndroid Build Coastguard Worker    # are passed in as link_deps wheras in Perfetto, we always works with deps.
202*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
203*6dbdd20aSAndroid Build Coastguard Worker      link_deps += invoker.deps
204*6dbdd20aSAndroid Build Coastguard Worker    }
205*6dbdd20aSAndroid Build Coastguard Worker    forward_variables_from(invoker,
206*6dbdd20aSAndroid Build Coastguard Worker                           [
207*6dbdd20aSAndroid Build Coastguard Worker                             "defines",
208*6dbdd20aSAndroid Build Coastguard Worker                             "extra_configs",
209*6dbdd20aSAndroid Build Coastguard Worker                             "include_dirs",
210*6dbdd20aSAndroid Build Coastguard Worker                             "proto_deps",
211*6dbdd20aSAndroid Build Coastguard Worker                             "proto_in_dir",
212*6dbdd20aSAndroid Build Coastguard Worker                             "proto_out_dir",
213*6dbdd20aSAndroid Build Coastguard Worker                             "generator_plugin_options",
214*6dbdd20aSAndroid Build Coastguard Worker                             "sources",
215*6dbdd20aSAndroid Build Coastguard Worker                             "testonly",
216*6dbdd20aSAndroid Build Coastguard Worker                             "visibility",
217*6dbdd20aSAndroid Build Coastguard Worker                             "propagate_imports_configs",
218*6dbdd20aSAndroid Build Coastguard Worker                             "import_dirs",
219*6dbdd20aSAndroid Build Coastguard Worker                           ])
220*6dbdd20aSAndroid Build Coastguard Worker  }
221*6dbdd20aSAndroid Build Coastguard Worker}
222*6dbdd20aSAndroid Build Coastguard Worker
223*6dbdd20aSAndroid Build Coastguard Worker# Generates .grpc.{h,cc} stubs for services defined in .proto files.
224*6dbdd20aSAndroid Build Coastguard Worker# We require explicit opt-in as gRPC is very heavyweight so we do not
225*6dbdd20aSAndroid Build Coastguard Worker# want accidental dependencies on this.
226*6dbdd20aSAndroid Build Coastguard Workerif (enable_perfetto_grpc) {
227*6dbdd20aSAndroid Build Coastguard Worker  template("perfetto_grpc_library") {
228*6dbdd20aSAndroid Build Coastguard Worker    proto_library(target_name) {
229*6dbdd20aSAndroid Build Coastguard Worker      proto_in_dir = perfetto_root_path
230*6dbdd20aSAndroid Build Coastguard Worker      proto_out_dir = perfetto_root_path
231*6dbdd20aSAndroid Build Coastguard Worker      propagate_imports_configs = false
232*6dbdd20aSAndroid Build Coastguard Worker
233*6dbdd20aSAndroid Build Coastguard Worker      perfetto_root_path = perfetto_root_path
234*6dbdd20aSAndroid Build Coastguard Worker      generate_cc = false
235*6dbdd20aSAndroid Build Coastguard Worker      generate_python = false
236*6dbdd20aSAndroid Build Coastguard Worker      generator_plugin_label =
237*6dbdd20aSAndroid Build Coastguard Worker          "$perfetto_root_path/buildtools/grpc:grpc_cpp_plugin"
238*6dbdd20aSAndroid Build Coastguard Worker      generator_plugin_suffix = ".grpc.pb"
239*6dbdd20aSAndroid Build Coastguard Worker      link_deps = [ "$perfetto_root_path/buildtools/grpc:grpc++" ]
240*6dbdd20aSAndroid Build Coastguard Worker      public_configs = [ "$perfetto_root_path/buildtools:grpc_gen_config" ]
241*6dbdd20aSAndroid Build Coastguard Worker
242*6dbdd20aSAndroid Build Coastguard Worker      # Convert deps to link_deps: the proto_library rule requires that C++
243*6dbdd20aSAndroid Build Coastguard Worker      # files are passed in as link_deps wheras in Perfetto, we always works
244*6dbdd20aSAndroid Build Coastguard Worker      # with deps.
245*6dbdd20aSAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
246*6dbdd20aSAndroid Build Coastguard Worker        link_deps += invoker.deps
247*6dbdd20aSAndroid Build Coastguard Worker      }
248*6dbdd20aSAndroid Build Coastguard Worker      forward_variables_from(invoker,
249*6dbdd20aSAndroid Build Coastguard Worker                             [
250*6dbdd20aSAndroid Build Coastguard Worker                               "defines",
251*6dbdd20aSAndroid Build Coastguard Worker                               "extra_configs",
252*6dbdd20aSAndroid Build Coastguard Worker                               "include_dirs",
253*6dbdd20aSAndroid Build Coastguard Worker                               "sources",
254*6dbdd20aSAndroid Build Coastguard Worker                               "testonly",
255*6dbdd20aSAndroid Build Coastguard Worker                               "visibility",
256*6dbdd20aSAndroid Build Coastguard Worker                             ])
257*6dbdd20aSAndroid Build Coastguard Worker    }
258*6dbdd20aSAndroid Build Coastguard Worker  }
259*6dbdd20aSAndroid Build Coastguard Worker}
260*6dbdd20aSAndroid Build Coastguard Worker
261*6dbdd20aSAndroid Build Coastguard Worker# The template used everywhere in the codebase.
262*6dbdd20aSAndroid Build Coastguard Workertemplate("perfetto_proto_library") {
263*6dbdd20aSAndroid Build Coastguard Worker  if (defined(invoker.proto_generators)) {
264*6dbdd20aSAndroid Build Coastguard Worker    proto_generators = invoker.proto_generators
265*6dbdd20aSAndroid Build Coastguard Worker  } else {
266*6dbdd20aSAndroid Build Coastguard Worker    proto_generators = [
267*6dbdd20aSAndroid Build Coastguard Worker      "zero",
268*6dbdd20aSAndroid Build Coastguard Worker      "lite",
269*6dbdd20aSAndroid Build Coastguard Worker      "cpp",
270*6dbdd20aSAndroid Build Coastguard Worker    ]
271*6dbdd20aSAndroid Build Coastguard Worker  }
272*6dbdd20aSAndroid Build Coastguard Worker
273*6dbdd20aSAndroid Build Coastguard Worker  # proto imports and C++ #includes are relative to this path.
274*6dbdd20aSAndroid Build Coastguard Worker  if (defined(invoker.proto_path)) {
275*6dbdd20aSAndroid Build Coastguard Worker    proto_path = invoker.proto_path
276*6dbdd20aSAndroid Build Coastguard Worker  } else {
277*6dbdd20aSAndroid Build Coastguard Worker    proto_path = perfetto_root_path
278*6dbdd20aSAndroid Build Coastguard Worker  }
279*6dbdd20aSAndroid Build Coastguard Worker
280*6dbdd20aSAndroid Build Coastguard Worker  if (defined(invoker.import_dirs)) {
281*6dbdd20aSAndroid Build Coastguard Worker    import_dirs_ = invoker.import_dirs
282*6dbdd20aSAndroid Build Coastguard Worker  } else {
283*6dbdd20aSAndroid Build Coastguard Worker    import_dirs_ = []
284*6dbdd20aSAndroid Build Coastguard Worker  }
285*6dbdd20aSAndroid Build Coastguard Worker
286*6dbdd20aSAndroid Build Coastguard Worker  expansion_token = "@TYPE@"
287*6dbdd20aSAndroid Build Coastguard Worker
288*6dbdd20aSAndroid Build Coastguard Worker  # The source set target should always be generated as it is used by the
289*6dbdd20aSAndroid Build Coastguard Worker  # build generators and for generating descriptors.
290*6dbdd20aSAndroid Build Coastguard Worker  source_set_target_name =
291*6dbdd20aSAndroid Build Coastguard Worker      string_replace(target_name, expansion_token, "source_set")
292*6dbdd20aSAndroid Build Coastguard Worker
293*6dbdd20aSAndroid Build Coastguard Worker  # This config is necessary for Chrome proto_library build rule to work
294*6dbdd20aSAndroid Build Coastguard Worker  # correctly.
295*6dbdd20aSAndroid Build Coastguard Worker  source_set_input_config_name = "${source_set_target_name}_input_config"
296*6dbdd20aSAndroid Build Coastguard Worker  config(source_set_input_config_name) {
297*6dbdd20aSAndroid Build Coastguard Worker    inputs = invoker.sources
298*6dbdd20aSAndroid Build Coastguard Worker  }
299*6dbdd20aSAndroid Build Coastguard Worker
300*6dbdd20aSAndroid Build Coastguard Worker  group(source_set_target_name) {
301*6dbdd20aSAndroid Build Coastguard Worker    # To propagate indirect inputs dependencies to descendant tareget, we use
302*6dbdd20aSAndroid Build Coastguard Worker    # public_deps and public_configs in this target.
303*6dbdd20aSAndroid Build Coastguard Worker    public_deps = []
304*6dbdd20aSAndroid Build Coastguard Worker    exports_ = []
305*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.public_deps)) {
306*6dbdd20aSAndroid Build Coastguard Worker      foreach(dep, invoker.public_deps) {
307*6dbdd20aSAndroid Build Coastguard Worker        # Get the absolute target path
308*6dbdd20aSAndroid Build Coastguard Worker        mapped_dep = string_replace(dep, expansion_token, "source_set")
309*6dbdd20aSAndroid Build Coastguard Worker        public_deps += [ mapped_dep ]
310*6dbdd20aSAndroid Build Coastguard Worker        exports_ += [ get_label_info(mapped_dep, "dir") + ":" +
311*6dbdd20aSAndroid Build Coastguard Worker                      get_label_info(mapped_dep, "name") ]
312*6dbdd20aSAndroid Build Coastguard Worker      }
313*6dbdd20aSAndroid Build Coastguard Worker    }
314*6dbdd20aSAndroid Build Coastguard Worker
315*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
316*6dbdd20aSAndroid Build Coastguard Worker      foreach(dep, invoker.deps) {
317*6dbdd20aSAndroid Build Coastguard Worker        mapped_dep = string_replace(dep, expansion_token, "source_set")
318*6dbdd20aSAndroid Build Coastguard Worker        public_deps += [ mapped_dep ]
319*6dbdd20aSAndroid Build Coastguard Worker      }
320*6dbdd20aSAndroid Build Coastguard Worker    }
321*6dbdd20aSAndroid Build Coastguard Worker
322*6dbdd20aSAndroid Build Coastguard Worker    sources = []
323*6dbdd20aSAndroid Build Coastguard Worker    foreach(source, invoker.sources) {
324*6dbdd20aSAndroid Build Coastguard Worker      sources += [ get_path_info(source, "abspath") ]
325*6dbdd20aSAndroid Build Coastguard Worker    }
326*6dbdd20aSAndroid Build Coastguard Worker
327*6dbdd20aSAndroid Build Coastguard Worker    public_configs = [ ":${source_set_input_config_name}" ]
328*6dbdd20aSAndroid Build Coastguard Worker
329*6dbdd20aSAndroid Build Coastguard Worker    metadata = {
330*6dbdd20aSAndroid Build Coastguard Worker      proto_library_sources = sources
331*6dbdd20aSAndroid Build Coastguard Worker      proto_import_dirs = import_dirs_
332*6dbdd20aSAndroid Build Coastguard Worker      exports = exports_
333*6dbdd20aSAndroid Build Coastguard Worker    }
334*6dbdd20aSAndroid Build Coastguard Worker  }
335*6dbdd20aSAndroid Build Coastguard Worker
336*6dbdd20aSAndroid Build Coastguard Worker  # Generate the descriptor if the option is set.
337*6dbdd20aSAndroid Build Coastguard Worker  if (defined(invoker.generate_descriptor)) {
338*6dbdd20aSAndroid Build Coastguard Worker    target_name_ = string_replace(target_name, expansion_token, "descriptor")
339*6dbdd20aSAndroid Build Coastguard Worker    proto_library(target_name_) {
340*6dbdd20aSAndroid Build Coastguard Worker      proto_in_dir = proto_path
341*6dbdd20aSAndroid Build Coastguard Worker      proto_out_dir = proto_path
342*6dbdd20aSAndroid Build Coastguard Worker      generate_python = false
343*6dbdd20aSAndroid Build Coastguard Worker      generate_cc = false
344*6dbdd20aSAndroid Build Coastguard Worker      generate_descriptor = rebase_path(invoker.generate_descriptor, proto_path)
345*6dbdd20aSAndroid Build Coastguard Worker      sources = [ invoker.descriptor_root_source ]
346*6dbdd20aSAndroid Build Coastguard Worker      import_dirs = import_dirs_
347*6dbdd20aSAndroid Build Coastguard Worker      deps = [ ":${source_set_target_name}" ]
348*6dbdd20aSAndroid Build Coastguard Worker      forward_variables_from(invoker,
349*6dbdd20aSAndroid Build Coastguard Worker                             [
350*6dbdd20aSAndroid Build Coastguard Worker                               "visibility",
351*6dbdd20aSAndroid Build Coastguard Worker                               "testonly",
352*6dbdd20aSAndroid Build Coastguard Worker                               "exclude_imports",
353*6dbdd20aSAndroid Build Coastguard Worker                             ])
354*6dbdd20aSAndroid Build Coastguard Worker    }
355*6dbdd20aSAndroid Build Coastguard Worker  }
356*6dbdd20aSAndroid Build Coastguard Worker
357*6dbdd20aSAndroid Build Coastguard Worker  foreach(gen_type, proto_generators) {
358*6dbdd20aSAndroid Build Coastguard Worker    target_name_ = string_replace(target_name, expansion_token, gen_type)
359*6dbdd20aSAndroid Build Coastguard Worker
360*6dbdd20aSAndroid Build Coastguard Worker    # Translate deps from xxx:@TYPE@ to xxx:lite/zero.
361*6dbdd20aSAndroid Build Coastguard Worker    all_deps_ = []
362*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
363*6dbdd20aSAndroid Build Coastguard Worker      foreach(dep, invoker.deps) {
364*6dbdd20aSAndroid Build Coastguard Worker        all_deps_ += [ string_replace(dep, expansion_token, gen_type) ]
365*6dbdd20aSAndroid Build Coastguard Worker      }
366*6dbdd20aSAndroid Build Coastguard Worker    }
367*6dbdd20aSAndroid Build Coastguard Worker
368*6dbdd20aSAndroid Build Coastguard Worker    # The distinction between deps and public_deps does not matter for GN
369*6dbdd20aSAndroid Build Coastguard Worker    # but Bazel cares about the difference so we distinguish between the two.
370*6dbdd20aSAndroid Build Coastguard Worker    if (defined(invoker.public_deps)) {
371*6dbdd20aSAndroid Build Coastguard Worker      foreach(dep, invoker.public_deps) {
372*6dbdd20aSAndroid Build Coastguard Worker        all_deps_ += [ string_replace(dep, expansion_token, gen_type) ]
373*6dbdd20aSAndroid Build Coastguard Worker      }
374*6dbdd20aSAndroid Build Coastguard Worker    }
375*6dbdd20aSAndroid Build Coastguard Worker
376*6dbdd20aSAndroid Build Coastguard Worker    # gn:public_config propagates the gen dir as include directory. We
377*6dbdd20aSAndroid Build Coastguard Worker    # disable the proto_library's public_config to avoid duplicate include
378*6dbdd20aSAndroid Build Coastguard Worker    # directory command line flags (crbug.com/1043279, crbug.com/gn/142).
379*6dbdd20aSAndroid Build Coastguard Worker    propagate_imports_configs_ = false
380*6dbdd20aSAndroid Build Coastguard Worker    vars_to_forward = []
381*6dbdd20aSAndroid Build Coastguard Worker    vars_to_forward += [
382*6dbdd20aSAndroid Build Coastguard Worker      "sources",
383*6dbdd20aSAndroid Build Coastguard Worker      "visibility",
384*6dbdd20aSAndroid Build Coastguard Worker      "testonly",
385*6dbdd20aSAndroid Build Coastguard Worker    ]
386*6dbdd20aSAndroid Build Coastguard Worker
387*6dbdd20aSAndroid Build Coastguard Worker    if (gen_type == "zero") {
388*6dbdd20aSAndroid Build Coastguard Worker      protozero_library(target_name_) {
389*6dbdd20aSAndroid Build Coastguard Worker        proto_in_dir = proto_path
390*6dbdd20aSAndroid Build Coastguard Worker        proto_out_dir = proto_path
391*6dbdd20aSAndroid Build Coastguard Worker        generator_plugin_options = "wrapper_namespace=pbzero"
392*6dbdd20aSAndroid Build Coastguard Worker        deps = all_deps_
393*6dbdd20aSAndroid Build Coastguard Worker        proto_deps = [ ":$source_set_target_name" ]
394*6dbdd20aSAndroid Build Coastguard Worker        propagate_imports_configs = propagate_imports_configs_
395*6dbdd20aSAndroid Build Coastguard Worker        import_dirs = import_dirs_
396*6dbdd20aSAndroid Build Coastguard Worker        forward_variables_from(invoker, vars_to_forward)
397*6dbdd20aSAndroid Build Coastguard Worker      }
398*6dbdd20aSAndroid Build Coastguard Worker    } else if (gen_type == "cpp") {
399*6dbdd20aSAndroid Build Coastguard Worker      protozero_cpp_library(target_name_) {
400*6dbdd20aSAndroid Build Coastguard Worker        proto_in_dir = proto_path
401*6dbdd20aSAndroid Build Coastguard Worker        proto_out_dir = proto_path
402*6dbdd20aSAndroid Build Coastguard Worker        generator_plugin_options = "wrapper_namespace=gen"
403*6dbdd20aSAndroid Build Coastguard Worker        deps = all_deps_
404*6dbdd20aSAndroid Build Coastguard Worker        proto_deps = [ ":$source_set_target_name" ]
405*6dbdd20aSAndroid Build Coastguard Worker        propagate_imports_configs = propagate_imports_configs_
406*6dbdd20aSAndroid Build Coastguard Worker        import_dirs = import_dirs_
407*6dbdd20aSAndroid Build Coastguard Worker        forward_variables_from(invoker, vars_to_forward)
408*6dbdd20aSAndroid Build Coastguard Worker      }
409*6dbdd20aSAndroid Build Coastguard Worker    } else if (gen_type == "ipc") {
410*6dbdd20aSAndroid Build Coastguard Worker      cpp_target_name_ = string_replace(target_name, expansion_token, "cpp")
411*6dbdd20aSAndroid Build Coastguard Worker      ipc_library(target_name_) {
412*6dbdd20aSAndroid Build Coastguard Worker        proto_in_dir = proto_path
413*6dbdd20aSAndroid Build Coastguard Worker        proto_out_dir = proto_path
414*6dbdd20aSAndroid Build Coastguard Worker        generator_plugin_options = "wrapper_namespace=gen"
415*6dbdd20aSAndroid Build Coastguard Worker        proto_deps = [ ":$source_set_target_name" ]
416*6dbdd20aSAndroid Build Coastguard Worker        deps = all_deps_ + [ ":$cpp_target_name_" ]
417*6dbdd20aSAndroid Build Coastguard Worker        propagate_imports_configs = propagate_imports_configs_
418*6dbdd20aSAndroid Build Coastguard Worker        import_dirs = import_dirs_
419*6dbdd20aSAndroid Build Coastguard Worker        forward_variables_from(invoker, vars_to_forward)
420*6dbdd20aSAndroid Build Coastguard Worker      }
421*6dbdd20aSAndroid Build Coastguard Worker    } else if (gen_type == "lite") {
422*6dbdd20aSAndroid Build Coastguard Worker      proto_library(target_name_) {
423*6dbdd20aSAndroid Build Coastguard Worker        proto_in_dir = proto_path
424*6dbdd20aSAndroid Build Coastguard Worker        proto_out_dir = proto_path
425*6dbdd20aSAndroid Build Coastguard Worker        generate_python = false
426*6dbdd20aSAndroid Build Coastguard Worker        link_deps = all_deps_
427*6dbdd20aSAndroid Build Coastguard Worker        cc_generator_options = "lite=true:"
428*6dbdd20aSAndroid Build Coastguard Worker        propagate_imports_configs = propagate_imports_configs_
429*6dbdd20aSAndroid Build Coastguard Worker        import_dirs = import_dirs_
430*6dbdd20aSAndroid Build Coastguard Worker        proto_deps = [ ":${source_set_target_name}" ]
431*6dbdd20aSAndroid Build Coastguard Worker        forward_variables_from(invoker, vars_to_forward)
432*6dbdd20aSAndroid Build Coastguard Worker      }
433*6dbdd20aSAndroid Build Coastguard Worker    } else {
434*6dbdd20aSAndroid Build Coastguard Worker      assert(false, "Invalid 'proto_generators' value.")
435*6dbdd20aSAndroid Build Coastguard Worker    }
436*6dbdd20aSAndroid Build Coastguard Worker  }
437*6dbdd20aSAndroid Build Coastguard Worker}
438