1# Copyright (C) 2017 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15import("gn/perfetto.gni") 16import("gn/test.gni") 17 18# +----------------------------------------------------------------------------+ 19# | "all" targets definition: defines targets reachable by the various configs | 20# +----------------------------------------------------------------------------+ 21# There is a subtletly here related with chromium and other GN embedders. 22# When adding a dependency some_dir/:target_name, some_dir/BUILD.gn is 23# "discovered". As a side effect any *other* target defined in some_dir/BUILD.gn 24# (and its transitive dependencies) becomes implicitly part of the "default" 25# target, the one invoked running ninja -C out/xxx without further args. 26# Because of this, care must be taken to wrap dependencies to targets in other 27# build files with if (enable_xxx) flags. Accidentally including a harmless 28# target that happens to be defined in the same BUILD.gn that contains targets 29# incompatible with the chromium build will cause build/roll failures. 30 31all_targets = [ "protos/perfetto/trace:perfetto_trace_protos" ] 32 33if (enable_perfetto_platform_services) { 34 all_targets += [ 35 "src/perfetto_cmd:perfetto", 36 "src/perfetto_cmd:trigger_perfetto", 37 "src/traced/service:traced", 38 ] 39 if (enable_perfetto_traced_probes) { 40 all_targets += [ "src/traced/probes:traced_probes" ] 41 } 42 if (enable_perfetto_traced_relay) { 43 all_targets += [ "src/traced_relay:traced_relay" ] 44 } 45} 46 47if (enable_perfetto_trace_processor && enable_perfetto_trace_processor_sqlite) { 48 if (enable_perfetto_grpc) { 49 all_targets += [ "src/bigtrace/orchestrator:orchestrator_main" ] 50 all_targets += [ "src/bigtrace/worker:worker_main" ] 51 } 52 all_targets += [ "src/trace_processor:trace_processor_shell" ] 53} 54 55if (enable_perfetto_trace_processor) { 56 all_targets += [ "src/trace_redaction:trace_redactor" ] 57} 58 59if (enable_perfetto_traceconv) { 60 all_targets += [ 61 "src/traceconv", 62 "src/trace_config_utils", 63 ] 64 if (is_cross_compiling) { 65 # In many cross-compilation scenarios (typically Android) developers expect 66 # the host version of traceconv to be available somewhere in out/, so 67 # they can convert Android traces on their dev machine. Also 68 # tools/gen_android_bp explicitly depends on the host version for the 69 # cc_binary_host("traceconv") target in Android.bp. 70 # Note that when cross-compiling the host executable will be available in 71 # out/xxx/gcc_like_host/traceconv NOT just out/xxx/traceconv. 72 all_targets += [ 73 "src/traceconv($host_toolchain)", 74 "src/trace_config_utils($host_toolchain)", 75 ] 76 } 77} 78 79if (enable_perfetto_heapprofd) { 80 all_targets += [ "src/profiling/memory:heapprofd" ] 81 82 if (is_linux && !is_android) { 83 all_targets += [ "src/profiling/memory:heapprofd_glibc_preload" ] 84 } 85 if (perfetto_build_with_android) { 86 all_targets += [ 87 "src/profiling/memory:heapprofd_client", 88 "src/profiling/memory:heapprofd_client_api", 89 ] 90 } 91} 92 93if (enable_perfetto_traced_perf) { 94 all_targets += [ "src/profiling/perf:traced_perf" ] 95} 96 97if (perfetto_build_with_android) { 98 all_targets += [ "src/android_internal:libperfetto_android_internal" ] 99} 100 101if (enable_perfetto_tools) { 102 all_targets += [ "src/tools" ] 103 104 # Windows does not have an IPC implementation. 105 if (!is_win) { 106 all_targets += [ "src/websocket_bridge" ] 107 } 108} 109 110if (enable_perfetto_unittests) { 111 import("gn/perfetto_unittests.gni") 112 test("perfetto_unittests") { 113 if (is_fuchsia) { 114 additional_manifest_fragments = 115 [ "//build/config/fuchsia/test/network.shard.test-cml" ] # nogncheck 116 } 117 deps = perfetto_unittests_targets 118 } 119 all_targets += [ ":perfetto_unittests" ] 120} 121 122if (enable_perfetto_integration_tests) { 123 import("gn/perfetto_integrationtests.gni") 124 test("perfetto_integrationtests") { 125 deps = [ 126 "gn:default_deps", 127 "test:integrationtest_main", 128 ] 129 deps += perfetto_integrationtests_targets 130 } 131 all_targets += [ 132 ":perfetto_integrationtests", 133 "examples/sdk:sdk_example", 134 "test:client_api_example", 135 "test/stress_test", 136 ] 137 if (!is_win && !is_mac) { 138 all_targets += [ 139 "examples/shared_lib:example_shlib_data_source", 140 "examples/shared_lib:example_shlib_track_event", 141 ] 142 } 143} 144 145if (enable_perfetto_trace_processor_json) { 146 test("trace_processor_minimal_smoke_tests") { 147 testonly = true 148 deps = [ 149 "gn:default_deps", 150 "src/trace_processor:storage_minimal_smoke_tests", 151 ] 152 } 153 all_targets += [ ":trace_processor_minimal_smoke_tests" ] 154} 155 156if (enable_perfetto_benchmarks) { 157 import("gn/perfetto_benchmarks.gni") 158 executable("perfetto_benchmarks") { 159 testonly = true 160 deps = perfetto_benchmarks_targets 161 } 162 all_targets += [ ":perfetto_benchmarks" ] 163} 164 165if (enable_perfetto_fuzzers) { 166 import("gn/perfetto_fuzzers.gni") 167 group("fuzzers") { 168 testonly = true 169 deps = perfetto_fuzzers_targets 170 } 171 all_targets += [ ":fuzzers" ] 172} 173 174# Less interesting stuff that makes sense only in the standalone build, mainly 175# compile-time checks for the CI. 176if (perfetto_build_standalone) { 177 all_targets += [ 178 "test/configs", 179 180 # Used to evaluate the Python folder for Bazel script generation. 181 "python:trace_processor_py", 182 183 # For checking all generated xxx.gen.{cc,h} files without waiting for 184 # embedders to try to use them and fail. 185 "protos/perfetto/config:cpp", 186 "protos/perfetto/common:cpp", 187 188 # Used in the when updating the ftrace protos 189 "protos/perfetto/trace/ftrace:descriptor", 190 191 # Checks that the "fake" backend implementations build. 192 "src/tracing:client_api_no_backends_compile_test", 193 ] 194 if (is_linux || is_android || is_mac) { 195 all_targets += [ "src/tracebox" ] 196 } 197} 198 199if (enable_perfetto_merged_protos_check) { 200 # For syntax-checking the protos. 201 all_targets += [ "protos/perfetto/trace:merged_trace_lite" ] 202} 203 204# The CTS code is built (but not ran) also in standalone builds. This is to 205# catch refactoring breakages earlier without having to wait for treehugger. 206if (is_android && (perfetto_build_standalone || perfetto_build_with_android)) { 207 all_targets += [ "test/cts:perfetto_cts_deps" ] 208 all_targets += [ "test/vts:perfetto_vts_deps" ] 209} 210 211group("all") { 212 testonly = true # allow to build also test targets 213 deps = all_targets 214} 215 216# This target is used when running ninja without any argument (by default would 217# build all reachable targets). This is mainly used to prevent the UI being 218# built when running ninja -C out/xxx. 219# This has effect only in standalone builds, no effect on chromium builds. 220# Chromium's "all" target depends on our "all" target above. However chromium's 221# "default" target depends on any target that we cause to be discovered by 222# depending on other GN files. 223group("default") { 224 testonly = true 225 deps = [ ":all" ] 226} 227 228# +----------------------------------------------------------------------------+ 229# | Other definitions: root targets that don't belong to any other subdirectory| 230# +----------------------------------------------------------------------------+ 231 232if (enable_perfetto_ui) { 233 group("ui") { 234 deps = [ "ui" ] 235 } 236} 237 238if (enable_perfetto_site) { 239 group("site") { 240 deps = [ "infra/perfetto.dev:site" ] 241 } 242} 243 244# In Android builds, we build the code of traced and traced_probes in one shared 245# library that exposes one xxx_main() for each. The executables themselves are 246# tiny shells that just invoke their own entry point into the library. 247# This is done merely for saving binary size, because the three binaries happen 248# to share a lot of code. 249# When setting monolithic_binaries=true (only supported in standalone builds) 250# it builds more conventional executables, where each binary has the full 251# implementation and no shared library dependency. This is to make dev cycles 252# on Android faster, avoiding all the LD_LIBRARY_PATH boilerplate. 253# libperfetto.so is also used for stuff that is exposed to the rest of the 254# Android tree. 255if (enable_perfetto_platform_services) { 256 if (monolithic_binaries) { 257 libperfetto_target_type = "static_library" 258 } else { 259 libperfetto_target_type = "shared_library" 260 } 261 262 target(libperfetto_target_type, "libperfetto") { 263 if (libperfetto_target_type == "static_library") { 264 complete_static_lib = true 265 } 266 deps = [ 267 "gn:default_deps", 268 "src/traced/service", 269 ] 270 if (enable_perfetto_traced_probes) { 271 deps += [ "src/traced/probes" ] 272 } 273 } 274} 275 276if (!build_with_chromium) { 277 # Client library target exposed to the Android tree. 278 # Still in experimental stage and not API stable yet. 279 # See "libperfetto_client_example" (in Android.bp.extras) for an example 280 # on how to use the Perfetto Client API from the android tree. 281 static_library("libperfetto_client_experimental") { 282 complete_static_lib = true 283 public_deps = [ 284 "gn:default_deps", 285 "src/tracing:client_api", 286 "src/tracing:platform_impl", 287 ] 288 sources = [ "include/perfetto/tracing.h" ] 289 assert_no_deps = [ "gn:protobuf_lite" ] 290 } 291} 292 293# TODO(primiano): there seem to be two "libperfetto" and one 294# "libperfetto_client_experimental" targets defined within this BUILD.gn file. 295# Rationalize them with eseckler@. For now seems this one is only used from 296# chromium and the other one only from the Android tree. 297if (build_with_chromium) { 298 component("libperfetto") { 299 public_configs = [ "gn:public_config" ] 300 deps = [ 301 "src/trace_processor/importers/memory_tracker:graph_processor", 302 "src/tracing:client_api", 303 "src/tracing:platform_impl", 304 "src/tracing/core", 305 ] 306 configs -= [ "//build/config/compiler:chromium_code" ] # nogncheck 307 configs += [ "//build/config/compiler:no_chromium_code" ] # nogncheck 308 public_deps = [ 309 "include/perfetto/ext/trace_processor/importers/memory_tracker", 310 "include/perfetto/ext/tracing/core", 311 "include/perfetto/tracing", 312 "protos/perfetto/common:zero", 313 "protos/perfetto/trace:zero", 314 "protos/perfetto/trace/chrome:zero", 315 "protos/perfetto/trace/etw:zero", 316 "protos/perfetto/trace/interned_data:zero", 317 "protos/perfetto/trace/profiling:zero", 318 "protos/perfetto/trace/ps:zero", 319 "protos/perfetto/trace/track_event:zero", 320 ] 321 if (enable_perfetto_ipc) { 322 deps += [ 323 "src/tracing/ipc/producer", 324 "src/tracing/ipc/service", 325 ] 326 public_deps += [ "include/perfetto/ext/tracing/ipc:ipc" ] 327 } 328 if (!is_nacl) { 329 deps += [ 330 "src/trace_processor:export_json", 331 "src/trace_processor:storage_minimal", 332 ] 333 public_deps += [ 334 "include/perfetto/ext/trace_processor:export_json", 335 "include/perfetto/trace_processor:storage", 336 ] 337 } 338 } 339 340 # TODO(altimin): this is a temp workaround around very strange link failures 341 # on win-dbg-ng buildbot. 342 if (!is_win) { 343 libtrace_processor_target_type = "source_set" 344 } else { 345 libtrace_processor_target_type = "component" 346 } 347 348 # In Chromium, we want to ensure that we don't link dynamically against sqlite 349 # (as Chromium also uses a more restricted version of sqlite which is actually 350 # shipped to the users). 351 # source_set helps us to achieve that. 352 target(libtrace_processor_target_type, "libtrace_processor") { 353 public_configs = [ "gn:public_config" ] 354 deps = [ "src/trace_processor:lib" ] 355 configs -= [ "//build/config/compiler:chromium_code" ] # nogncheck 356 configs += [ "//build/config/compiler:no_chromium_code" ] # nogncheck 357 public_deps = [ "include/perfetto/trace_processor" ] 358 } 359 component("perfetto_test_support") { 360 testonly = true 361 public_configs = [ "gn:public_config" ] 362 configs -= [ "//build/config/compiler:chromium_code" ] # nogncheck 363 configs += [ "//build/config/compiler:no_chromium_code" ] # nogncheck 364 public_deps = [ "include/perfetto/test:test_support" ] 365 deps = [ "src/tracing/test:test_support" ] 366 } 367} 368