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