xref: /aosp_15_r20/external/perfetto/bazel/rules.bzl (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2019 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 Workerload("@perfetto_cfg//:perfetto_cfg.bzl", "PERFETTO_CONFIG")
16*6dbdd20aSAndroid Build Coastguard Workerload("@perfetto//bazel:proto_gen.bzl", "proto_descriptor_gen", "proto_gen")
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
19*6dbdd20aSAndroid Build Coastguard Worker# | Base C++ rules.                                                            |
20*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Workerdef default_cc_args():
23*6dbdd20aSAndroid Build Coastguard Worker    return {
24*6dbdd20aSAndroid Build Coastguard Worker        "deps": PERFETTO_CONFIG.deps.build_config,
25*6dbdd20aSAndroid Build Coastguard Worker        "copts": PERFETTO_CONFIG.default_copts + [
26*6dbdd20aSAndroid Build Coastguard Worker            "-Wno-pragma-system-header-outside-header",
27*6dbdd20aSAndroid Build Coastguard Worker        ],
28*6dbdd20aSAndroid Build Coastguard Worker        "includes": ["include"],
29*6dbdd20aSAndroid Build Coastguard Worker        "linkopts": select({
30*6dbdd20aSAndroid Build Coastguard Worker            "@perfetto//bazel:os_linux": ["-ldl", "-lrt", "-lpthread"],
31*6dbdd20aSAndroid Build Coastguard Worker            "@perfetto//bazel:os_osx": [],
32*6dbdd20aSAndroid Build Coastguard Worker            "@perfetto//bazel:os_windows": ["ws2_32.lib"],
33*6dbdd20aSAndroid Build Coastguard Worker            "//conditions:default": ["-ldl"],
34*6dbdd20aSAndroid Build Coastguard Worker        }),
35*6dbdd20aSAndroid Build Coastguard Worker    }
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_build_config_cc_library(**kwargs):
38*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("cc_library", **kwargs):
39*6dbdd20aSAndroid Build Coastguard Worker        native.cc_library(**kwargs)
40*6dbdd20aSAndroid Build Coastguard Worker
41*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_filegroup(**kwargs):
42*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("filegroup", **kwargs):
43*6dbdd20aSAndroid Build Coastguard Worker        native.filegroup(**kwargs)
44*6dbdd20aSAndroid Build Coastguard Worker
45*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_genrule(**kwargs):
46*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("genrule", **kwargs):
47*6dbdd20aSAndroid Build Coastguard Worker        native.genrule(**kwargs)
48*6dbdd20aSAndroid Build Coastguard Worker
49*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_library(**kwargs):
50*6dbdd20aSAndroid Build Coastguard Worker    args = _merge_dicts(default_cc_args(), kwargs)
51*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("cc_library", **args):
52*6dbdd20aSAndroid Build Coastguard Worker        native.cc_library(**args)
53*6dbdd20aSAndroid Build Coastguard Worker
54*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_binary(**kwargs):
55*6dbdd20aSAndroid Build Coastguard Worker    args = _merge_dicts(default_cc_args(), kwargs)
56*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("cc_binary", **args):
57*6dbdd20aSAndroid Build Coastguard Worker        native.cc_binary(**args)
58*6dbdd20aSAndroid Build Coastguard Worker
59*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_py_binary(**kwargs):
60*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("py_binary", **kwargs):
61*6dbdd20aSAndroid Build Coastguard Worker        native.py_binary(**kwargs)
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_py_library(**kwargs):
64*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("py_library", **kwargs):
65*6dbdd20aSAndroid Build Coastguard Worker        native.py_library(**kwargs)
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
68*6dbdd20aSAndroid Build Coastguard Worker# | Proto-related rules                                                        |
69*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
70*6dbdd20aSAndroid Build Coastguard Worker
71*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_proto_library(**kwargs):
72*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("proto_library", **kwargs):
73*6dbdd20aSAndroid Build Coastguard Worker        native.proto_library(**kwargs)
74*6dbdd20aSAndroid Build Coastguard Worker
75*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_proto_library(**kwargs):
76*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("cc_proto_library", **kwargs):
77*6dbdd20aSAndroid Build Coastguard Worker        native.cc_proto_library(**kwargs)
78*6dbdd20aSAndroid Build Coastguard Worker
79*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_java_proto_library(**kwargs):
80*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("java_proto_library", **kwargs):
81*6dbdd20aSAndroid Build Coastguard Worker        native.java_proto_library(**kwargs)
82*6dbdd20aSAndroid Build Coastguard Worker
83*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_java_lite_proto_library(**kwargs):
84*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("java_lite_proto_library", **kwargs):
85*6dbdd20aSAndroid Build Coastguard Worker        native.java_lite_proto_library(**kwargs)
86*6dbdd20aSAndroid Build Coastguard Worker
87*6dbdd20aSAndroid Build Coastguard Worker# Unlike the other rules, this is an noop by default because Bazel does not
88*6dbdd20aSAndroid Build Coastguard Worker# support Go proto libraries.
89*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_go_proto_library(**kwargs):
90*6dbdd20aSAndroid Build Coastguard Worker    _rule_override("go_proto_library", **kwargs)
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Worker# Unlike the other rules, this is an noop by default because Bazel does not
93*6dbdd20aSAndroid Build Coastguard Worker# support Python proto libraries.
94*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_py_proto_library(**kwargs):
95*6dbdd20aSAndroid Build Coastguard Worker    _rule_override("py_proto_library", **kwargs)
96*6dbdd20aSAndroid Build Coastguard Worker
97*6dbdd20aSAndroid Build Coastguard Worker# Unlike the other rules, this is an noop by default because Bazel does not
98*6dbdd20aSAndroid Build Coastguard Worker# support Javascript/Typescript proto libraries.
99*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_jspb_proto_library(**kwargs):
100*6dbdd20aSAndroid Build Coastguard Worker    _rule_override("jspb_proto_library", **kwargs)
101*6dbdd20aSAndroid Build Coastguard Worker
102*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
103*6dbdd20aSAndroid Build Coastguard Worker# | Misc rules.                                                                |
104*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
105*6dbdd20aSAndroid Build Coastguard Worker
106*6dbdd20aSAndroid Build Coastguard Worker# Generates .pbzero.{cc,h} from .proto(s). We deliberately do NOT generate
107*6dbdd20aSAndroid Build Coastguard Worker# conventional .pb.{cc,h} from here as protozero gen sources do not have any
108*6dbdd20aSAndroid Build Coastguard Worker# dependency on libprotobuf.
109*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_protozero_library(name, deps, **kwargs):
110*6dbdd20aSAndroid Build Coastguard Worker    if _rule_override(
111*6dbdd20aSAndroid Build Coastguard Worker        "cc_protozero_library",
112*6dbdd20aSAndroid Build Coastguard Worker        name = name,
113*6dbdd20aSAndroid Build Coastguard Worker        deps = deps,
114*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
115*6dbdd20aSAndroid Build Coastguard Worker    ):
116*6dbdd20aSAndroid Build Coastguard Worker        return
117*6dbdd20aSAndroid Build Coastguard Worker
118*6dbdd20aSAndroid Build Coastguard Worker    # A perfetto_cc_protozero_library has two types of dependencies:
119*6dbdd20aSAndroid Build Coastguard Worker    # 1. Exactly one dependency on a proto_library target. This defines the
120*6dbdd20aSAndroid Build Coastguard Worker    #    .proto sources for the target
121*6dbdd20aSAndroid Build Coastguard Worker    # 2. Zero or more deps on other perfetto_cc_protozero_library targets. This
122*6dbdd20aSAndroid Build Coastguard Worker    #    to deal with the case of foo.proto including common.proto from another
123*6dbdd20aSAndroid Build Coastguard Worker    #    target.
124*6dbdd20aSAndroid Build Coastguard Worker    _proto_deps = [d for d in deps if d.endswith("_protos")]
125*6dbdd20aSAndroid Build Coastguard Worker    _cc_deps = [d for d in deps if d not in _proto_deps]
126*6dbdd20aSAndroid Build Coastguard Worker    if len(_proto_deps) != 1:
127*6dbdd20aSAndroid Build Coastguard Worker        fail("Too many proto deps for target %s" % name)
128*6dbdd20aSAndroid Build Coastguard Worker
129*6dbdd20aSAndroid Build Coastguard Worker    args = {
130*6dbdd20aSAndroid Build Coastguard Worker        'name': name + "_src",
131*6dbdd20aSAndroid Build Coastguard Worker        'deps': _proto_deps,
132*6dbdd20aSAndroid Build Coastguard Worker        'suffix': "pbzero",
133*6dbdd20aSAndroid Build Coastguard Worker        'plugin': PERFETTO_CONFIG.root + ":protozero_plugin",
134*6dbdd20aSAndroid Build Coastguard Worker        'wrapper_namespace': "pbzero",
135*6dbdd20aSAndroid Build Coastguard Worker        'protoc': PERFETTO_CONFIG.deps.protoc[0],
136*6dbdd20aSAndroid Build Coastguard Worker        'root': PERFETTO_CONFIG.root,
137*6dbdd20aSAndroid Build Coastguard Worker    }
138*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("proto_gen", **args):
139*6dbdd20aSAndroid Build Coastguard Worker        proto_gen(**args)
140*6dbdd20aSAndroid Build Coastguard Worker
141*6dbdd20aSAndroid Build Coastguard Worker    perfetto_filegroup(
142*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_h",
143*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_src"],
144*6dbdd20aSAndroid Build Coastguard Worker        output_group = "h",
145*6dbdd20aSAndroid Build Coastguard Worker    )
146*6dbdd20aSAndroid Build Coastguard Worker
147*6dbdd20aSAndroid Build Coastguard Worker    perfetto_cc_library(
148*6dbdd20aSAndroid Build Coastguard Worker        name = name,
149*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_src"],
150*6dbdd20aSAndroid Build Coastguard Worker        hdrs = [":" + name + "_h"],
151*6dbdd20aSAndroid Build Coastguard Worker        deps = [PERFETTO_CONFIG.root + ":protozero"] + _cc_deps,
152*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
153*6dbdd20aSAndroid Build Coastguard Worker    )
154*6dbdd20aSAndroid Build Coastguard Worker
155*6dbdd20aSAndroid Build Coastguard Worker# Generates .ipc.{cc,h} and .pb.{cc.h} from .proto(s). The IPC sources depend
156*6dbdd20aSAndroid Build Coastguard Worker# on .pb.h so we need to generate also the standard protobuf sources here.
157*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_ipc_library(name, deps, **kwargs):
158*6dbdd20aSAndroid Build Coastguard Worker    if _rule_override("cc_ipc_library", name = name, deps = deps, **kwargs):
159*6dbdd20aSAndroid Build Coastguard Worker        return
160*6dbdd20aSAndroid Build Coastguard Worker
161*6dbdd20aSAndroid Build Coastguard Worker    # A perfetto_cc_ipc_library has two types of dependencies:
162*6dbdd20aSAndroid Build Coastguard Worker    # 1. Exactly one dependency on a proto_library target. This defines the
163*6dbdd20aSAndroid Build Coastguard Worker    #    .proto sources for the target
164*6dbdd20aSAndroid Build Coastguard Worker    # 2. Zero or more deps on other perfetto_cc_protocpp_library targets. This
165*6dbdd20aSAndroid Build Coastguard Worker    #    to deal with the case of foo.proto including common.proto from another
166*6dbdd20aSAndroid Build Coastguard Worker    #    target.
167*6dbdd20aSAndroid Build Coastguard Worker    _proto_deps = [d for d in deps if d.endswith("_protos")]
168*6dbdd20aSAndroid Build Coastguard Worker    _cc_deps = [d for d in deps if d not in _proto_deps]
169*6dbdd20aSAndroid Build Coastguard Worker    if len(_proto_deps) != 1:
170*6dbdd20aSAndroid Build Coastguard Worker        fail("Too many proto deps for target %s" % name)
171*6dbdd20aSAndroid Build Coastguard Worker
172*6dbdd20aSAndroid Build Coastguard Worker    # Generates .ipc.{cc,h}.
173*6dbdd20aSAndroid Build Coastguard Worker    args = {
174*6dbdd20aSAndroid Build Coastguard Worker        'name': name + "_src",
175*6dbdd20aSAndroid Build Coastguard Worker        'deps': _proto_deps,
176*6dbdd20aSAndroid Build Coastguard Worker        'suffix': "ipc",
177*6dbdd20aSAndroid Build Coastguard Worker        'plugin': PERFETTO_CONFIG.root + ":ipc_plugin",
178*6dbdd20aSAndroid Build Coastguard Worker        'wrapper_namespace': "gen",
179*6dbdd20aSAndroid Build Coastguard Worker        'protoc': PERFETTO_CONFIG.deps.protoc[0],
180*6dbdd20aSAndroid Build Coastguard Worker        'root': PERFETTO_CONFIG.root,
181*6dbdd20aSAndroid Build Coastguard Worker    }
182*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("proto_gen", **args):
183*6dbdd20aSAndroid Build Coastguard Worker        proto_gen(**args)
184*6dbdd20aSAndroid Build Coastguard Worker
185*6dbdd20aSAndroid Build Coastguard Worker    perfetto_filegroup(
186*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_h",
187*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_src"],
188*6dbdd20aSAndroid Build Coastguard Worker        output_group = "h",
189*6dbdd20aSAndroid Build Coastguard Worker    )
190*6dbdd20aSAndroid Build Coastguard Worker
191*6dbdd20aSAndroid Build Coastguard Worker    perfetto_cc_library(
192*6dbdd20aSAndroid Build Coastguard Worker        name = name,
193*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_src"],
194*6dbdd20aSAndroid Build Coastguard Worker        hdrs = [":" + name + "_h"],
195*6dbdd20aSAndroid Build Coastguard Worker        deps = [
196*6dbdd20aSAndroid Build Coastguard Worker            # Generated .ipc.{cc,h} depend on this and protozero.
197*6dbdd20aSAndroid Build Coastguard Worker            PERFETTO_CONFIG.root + ":perfetto_ipc",
198*6dbdd20aSAndroid Build Coastguard Worker            PERFETTO_CONFIG.root + ":protozero",
199*6dbdd20aSAndroid Build Coastguard Worker        ] + _cc_deps,
200*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
201*6dbdd20aSAndroid Build Coastguard Worker    )
202*6dbdd20aSAndroid Build Coastguard Worker
203*6dbdd20aSAndroid Build Coastguard Worker# Generates .gen.{cc,h} from .proto(s).
204*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_protocpp_library(name, deps, **kwargs):
205*6dbdd20aSAndroid Build Coastguard Worker    if _rule_override(
206*6dbdd20aSAndroid Build Coastguard Worker        "cc_protocpp_library",
207*6dbdd20aSAndroid Build Coastguard Worker        name = name,
208*6dbdd20aSAndroid Build Coastguard Worker        deps = deps,
209*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
210*6dbdd20aSAndroid Build Coastguard Worker    ):
211*6dbdd20aSAndroid Build Coastguard Worker        return
212*6dbdd20aSAndroid Build Coastguard Worker
213*6dbdd20aSAndroid Build Coastguard Worker    # A perfetto_cc_protocpp_library has two types of dependencies:
214*6dbdd20aSAndroid Build Coastguard Worker    # 1. Exactly one dependency on a proto_library target. This defines the
215*6dbdd20aSAndroid Build Coastguard Worker    #    .proto sources for the target
216*6dbdd20aSAndroid Build Coastguard Worker    # 2. Zero or more deps on other perfetto_cc_protocpp_library targets. This
217*6dbdd20aSAndroid Build Coastguard Worker    #    to deal with the case of foo.proto including common.proto from another
218*6dbdd20aSAndroid Build Coastguard Worker    #    target.
219*6dbdd20aSAndroid Build Coastguard Worker    _proto_deps = [d for d in deps if d.endswith("_protos")]
220*6dbdd20aSAndroid Build Coastguard Worker    _cc_deps = [d for d in deps if d not in _proto_deps]
221*6dbdd20aSAndroid Build Coastguard Worker    if len(_proto_deps) != 1:
222*6dbdd20aSAndroid Build Coastguard Worker        fail("Too many proto deps for target %s" % name)
223*6dbdd20aSAndroid Build Coastguard Worker
224*6dbdd20aSAndroid Build Coastguard Worker    args = {
225*6dbdd20aSAndroid Build Coastguard Worker        'name': name + "_gen",
226*6dbdd20aSAndroid Build Coastguard Worker        'deps': _proto_deps,
227*6dbdd20aSAndroid Build Coastguard Worker        'suffix': "gen",
228*6dbdd20aSAndroid Build Coastguard Worker        'plugin': PERFETTO_CONFIG.root + ":cppgen_plugin",
229*6dbdd20aSAndroid Build Coastguard Worker        'wrapper_namespace': "gen",
230*6dbdd20aSAndroid Build Coastguard Worker        'protoc': PERFETTO_CONFIG.deps.protoc[0],
231*6dbdd20aSAndroid Build Coastguard Worker        'root': PERFETTO_CONFIG.root,
232*6dbdd20aSAndroid Build Coastguard Worker    }
233*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("proto_gen", **args):
234*6dbdd20aSAndroid Build Coastguard Worker        proto_gen(**args)
235*6dbdd20aSAndroid Build Coastguard Worker
236*6dbdd20aSAndroid Build Coastguard Worker    perfetto_filegroup(
237*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_gen_h",
238*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_gen"],
239*6dbdd20aSAndroid Build Coastguard Worker        output_group = "h",
240*6dbdd20aSAndroid Build Coastguard Worker    )
241*6dbdd20aSAndroid Build Coastguard Worker
242*6dbdd20aSAndroid Build Coastguard Worker    # The headers from the gen plugin have implicit dependencies
243*6dbdd20aSAndroid Build Coastguard Worker    # on each other so will fail when compiled independently. Use
244*6dbdd20aSAndroid Build Coastguard Worker    # textual_hdrs to indicate this to Bazel.
245*6dbdd20aSAndroid Build Coastguard Worker    perfetto_cc_library(
246*6dbdd20aSAndroid Build Coastguard Worker        name = name,
247*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_gen"],
248*6dbdd20aSAndroid Build Coastguard Worker        textual_hdrs = [":" + name + "_gen_h"],
249*6dbdd20aSAndroid Build Coastguard Worker        deps = [
250*6dbdd20aSAndroid Build Coastguard Worker            PERFETTO_CONFIG.root + ":protozero",
251*6dbdd20aSAndroid Build Coastguard Worker        ] + _cc_deps,
252*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
253*6dbdd20aSAndroid Build Coastguard Worker    )
254*6dbdd20aSAndroid Build Coastguard Worker
255*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_proto_descriptor(name, deps, outs, **kwargs):
256*6dbdd20aSAndroid Build Coastguard Worker    args = {
257*6dbdd20aSAndroid Build Coastguard Worker        'name': name,
258*6dbdd20aSAndroid Build Coastguard Worker        'deps': deps,
259*6dbdd20aSAndroid Build Coastguard Worker        'outs': outs,
260*6dbdd20aSAndroid Build Coastguard Worker    }
261*6dbdd20aSAndroid Build Coastguard Worker    if not _rule_override("proto_descriptor_gen", **args):
262*6dbdd20aSAndroid Build Coastguard Worker        proto_descriptor_gen(**args)
263*6dbdd20aSAndroid Build Coastguard Worker
264*6dbdd20aSAndroid Build Coastguard Worker# Generator .descriptor.h from protos
265*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_proto_descriptor(name, deps, outs, **kwargs):
266*6dbdd20aSAndroid Build Coastguard Worker    cmd = [
267*6dbdd20aSAndroid Build Coastguard Worker        "$(location gen_cc_proto_descriptor_py)",
268*6dbdd20aSAndroid Build Coastguard Worker        "--cpp_out=$@",
269*6dbdd20aSAndroid Build Coastguard Worker        "--gen_dir=$(GENDIR)",
270*6dbdd20aSAndroid Build Coastguard Worker        "$<"
271*6dbdd20aSAndroid Build Coastguard Worker    ]
272*6dbdd20aSAndroid Build Coastguard Worker    perfetto_genrule(
273*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_gen",
274*6dbdd20aSAndroid Build Coastguard Worker        cmd = " ".join(cmd),
275*6dbdd20aSAndroid Build Coastguard Worker        tools = [
276*6dbdd20aSAndroid Build Coastguard Worker            ":gen_cc_proto_descriptor_py",
277*6dbdd20aSAndroid Build Coastguard Worker        ],
278*6dbdd20aSAndroid Build Coastguard Worker        srcs = deps,
279*6dbdd20aSAndroid Build Coastguard Worker        outs = outs,
280*6dbdd20aSAndroid Build Coastguard Worker    )
281*6dbdd20aSAndroid Build Coastguard Worker
282*6dbdd20aSAndroid Build Coastguard Worker    perfetto_cc_library(
283*6dbdd20aSAndroid Build Coastguard Worker        name = name,
284*6dbdd20aSAndroid Build Coastguard Worker        hdrs = [":" + name + "_gen"],
285*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
286*6dbdd20aSAndroid Build Coastguard Worker    )
287*6dbdd20aSAndroid Build Coastguard Worker
288*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_amalgamated_sql(name, deps, outs, namespace, **kwargs):
289*6dbdd20aSAndroid Build Coastguard Worker    if PERFETTO_CONFIG.root[:2] != "//":
290*6dbdd20aSAndroid Build Coastguard Worker        fail("Expected PERFETTO_CONFIG.root to start with //")
291*6dbdd20aSAndroid Build Coastguard Worker
292*6dbdd20aSAndroid Build Coastguard Worker    genrule_tool = kwargs.pop("genrule_tool", ":gen_amalgamated_sql_py")
293*6dbdd20aSAndroid Build Coastguard Worker    cmd = [
294*6dbdd20aSAndroid Build Coastguard Worker        "$(location " + genrule_tool + ")",
295*6dbdd20aSAndroid Build Coastguard Worker        "--namespace",
296*6dbdd20aSAndroid Build Coastguard Worker        namespace,
297*6dbdd20aSAndroid Build Coastguard Worker        "--cpp-out=$@",
298*6dbdd20aSAndroid Build Coastguard Worker        "$(SRCS)",
299*6dbdd20aSAndroid Build Coastguard Worker    ]
300*6dbdd20aSAndroid Build Coastguard Worker
301*6dbdd20aSAndroid Build Coastguard Worker    root_dir = kwargs.pop("root_dir", None)
302*6dbdd20aSAndroid Build Coastguard Worker    if root_dir:
303*6dbdd20aSAndroid Build Coastguard Worker        cmd += [
304*6dbdd20aSAndroid Build Coastguard Worker            "--root-dir",
305*6dbdd20aSAndroid Build Coastguard Worker            root_dir,
306*6dbdd20aSAndroid Build Coastguard Worker        ]
307*6dbdd20aSAndroid Build Coastguard Worker
308*6dbdd20aSAndroid Build Coastguard Worker    perfetto_genrule(
309*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_gen",
310*6dbdd20aSAndroid Build Coastguard Worker        cmd = " ".join(cmd),
311*6dbdd20aSAndroid Build Coastguard Worker        tools = [
312*6dbdd20aSAndroid Build Coastguard Worker            genrule_tool,
313*6dbdd20aSAndroid Build Coastguard Worker        ],
314*6dbdd20aSAndroid Build Coastguard Worker        srcs = deps,
315*6dbdd20aSAndroid Build Coastguard Worker        outs = outs,
316*6dbdd20aSAndroid Build Coastguard Worker    )
317*6dbdd20aSAndroid Build Coastguard Worker    perfetto_cc_library(
318*6dbdd20aSAndroid Build Coastguard Worker        name = name,
319*6dbdd20aSAndroid Build Coastguard Worker        hdrs = [":" + name + "_gen"],
320*6dbdd20aSAndroid Build Coastguard Worker        **kwargs
321*6dbdd20aSAndroid Build Coastguard Worker    )
322*6dbdd20aSAndroid Build Coastguard Worker
323*6dbdd20aSAndroid Build Coastguard Workerdef perfetto_cc_tp_tables(name, srcs, outs, deps = [], **kwargs):
324*6dbdd20aSAndroid Build Coastguard Worker    if PERFETTO_CONFIG.root[:2] != "//":
325*6dbdd20aSAndroid Build Coastguard Worker        fail("Expected PERFETTO_CONFIG.root to start with //")
326*6dbdd20aSAndroid Build Coastguard Worker
327*6dbdd20aSAndroid Build Coastguard Worker    if PERFETTO_CONFIG.root == "//":
328*6dbdd20aSAndroid Build Coastguard Worker        python_path = PERFETTO_CONFIG.root + "python"
329*6dbdd20aSAndroid Build Coastguard Worker    else:
330*6dbdd20aSAndroid Build Coastguard Worker        python_path = PERFETTO_CONFIG.root + "/python"
331*6dbdd20aSAndroid Build Coastguard Worker
332*6dbdd20aSAndroid Build Coastguard Worker    perfetto_py_library(
333*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_lib",
334*6dbdd20aSAndroid Build Coastguard Worker        deps = [
335*6dbdd20aSAndroid Build Coastguard Worker            python_path + ":trace_processor_table_generator",
336*6dbdd20aSAndroid Build Coastguard Worker        ],
337*6dbdd20aSAndroid Build Coastguard Worker        srcs = srcs,
338*6dbdd20aSAndroid Build Coastguard Worker    )
339*6dbdd20aSAndroid Build Coastguard Worker
340*6dbdd20aSAndroid Build Coastguard Worker    perfetto_py_binary(
341*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_tool",
342*6dbdd20aSAndroid Build Coastguard Worker        deps = [
343*6dbdd20aSAndroid Build Coastguard Worker            ":" + name + "_lib",
344*6dbdd20aSAndroid Build Coastguard Worker            python_path + ":trace_processor_table_generator",
345*6dbdd20aSAndroid Build Coastguard Worker        ] + [d + "_lib" for d in deps],
346*6dbdd20aSAndroid Build Coastguard Worker        srcs = [
347*6dbdd20aSAndroid Build Coastguard Worker            "tools/gen_tp_table_headers.py",
348*6dbdd20aSAndroid Build Coastguard Worker        ],
349*6dbdd20aSAndroid Build Coastguard Worker        main = "tools/gen_tp_table_headers.py",
350*6dbdd20aSAndroid Build Coastguard Worker        python_version = "PY3",
351*6dbdd20aSAndroid Build Coastguard Worker    )
352*6dbdd20aSAndroid Build Coastguard Worker
353*6dbdd20aSAndroid Build Coastguard Worker    cmd = ["$(location " + name + "_tool)"]
354*6dbdd20aSAndroid Build Coastguard Worker    cmd += ["--gen-dir", "$(RULEDIR)"]
355*6dbdd20aSAndroid Build Coastguard Worker    cmd += ["--inputs", "$(SRCS)"]
356*6dbdd20aSAndroid Build Coastguard Worker    if PERFETTO_CONFIG.root != "//":
357*6dbdd20aSAndroid Build Coastguard Worker        cmd += ["--import-prefix", PERFETTO_CONFIG.root[2:]]
358*6dbdd20aSAndroid Build Coastguard Worker        cmd += ["--relative-input-dir", PERFETTO_CONFIG.root[2:]]
359*6dbdd20aSAndroid Build Coastguard Worker
360*6dbdd20aSAndroid Build Coastguard Worker    perfetto_genrule(
361*6dbdd20aSAndroid Build Coastguard Worker        name = name + "_gen",
362*6dbdd20aSAndroid Build Coastguard Worker        cmd = " ".join(cmd),
363*6dbdd20aSAndroid Build Coastguard Worker        tools = [
364*6dbdd20aSAndroid Build Coastguard Worker            ":" + name + "_tool",
365*6dbdd20aSAndroid Build Coastguard Worker        ],
366*6dbdd20aSAndroid Build Coastguard Worker        srcs = srcs,
367*6dbdd20aSAndroid Build Coastguard Worker        outs = outs,
368*6dbdd20aSAndroid Build Coastguard Worker    )
369*6dbdd20aSAndroid Build Coastguard Worker
370*6dbdd20aSAndroid Build Coastguard Worker    perfetto_filegroup(
371*6dbdd20aSAndroid Build Coastguard Worker        name = name,
372*6dbdd20aSAndroid Build Coastguard Worker        srcs = [":" + name + "_gen"],
373*6dbdd20aSAndroid Build Coastguard Worker        **kwargs,
374*6dbdd20aSAndroid Build Coastguard Worker    )
375*6dbdd20aSAndroid Build Coastguard Worker
376*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
377*6dbdd20aSAndroid Build Coastguard Worker# | Misc utility functions                                                     |
378*6dbdd20aSAndroid Build Coastguard Worker# +----------------------------------------------------------------------------+
379*6dbdd20aSAndroid Build Coastguard Worker
380*6dbdd20aSAndroid Build Coastguard Workerdef _rule_override(rule_name, **kwargs):
381*6dbdd20aSAndroid Build Coastguard Worker    overrides = getattr(PERFETTO_CONFIG, "rule_overrides", struct())
382*6dbdd20aSAndroid Build Coastguard Worker    overridden_rule = getattr(overrides, rule_name, None)
383*6dbdd20aSAndroid Build Coastguard Worker    if overridden_rule:
384*6dbdd20aSAndroid Build Coastguard Worker        overridden_rule(**kwargs)
385*6dbdd20aSAndroid Build Coastguard Worker        return True
386*6dbdd20aSAndroid Build Coastguard Worker    return False
387*6dbdd20aSAndroid Build Coastguard Worker
388*6dbdd20aSAndroid Build Coastguard Workerdef _merge_dicts(*args):
389*6dbdd20aSAndroid Build Coastguard Worker    res = {}
390*6dbdd20aSAndroid Build Coastguard Worker    for arg in args:
391*6dbdd20aSAndroid Build Coastguard Worker        for k, v in arg.items():
392*6dbdd20aSAndroid Build Coastguard Worker            if type(v) == "string" or type(v) == "bool":
393*6dbdd20aSAndroid Build Coastguard Worker                res[k] = v
394*6dbdd20aSAndroid Build Coastguard Worker            elif type(v) == "list" or type(v) == "select":
395*6dbdd20aSAndroid Build Coastguard Worker                res[k] = res.get(k, []) + v
396*6dbdd20aSAndroid Build Coastguard Worker            else:
397*6dbdd20aSAndroid Build Coastguard Worker                fail("key type not supported: " + type(v))
398*6dbdd20aSAndroid Build Coastguard Worker    return res
399