blob: b36d588c3bc42a96f2a7e6f0d54af116a09a2bd9 [file] [log] [blame]
Primiano Tucciae2879e2017-09-27 11:02:09 +09001# 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
Oystein Eftevaagdd727e42017-12-05 08:49:55 -080015import("gn/perfetto.gni")
Eric Secklera6ba1792019-01-02 12:51:00 +000016import("gn/test.gni")
Primiano Tucci4c5efa42018-10-23 13:15:13 +010017
Primiano Tucci02c11762019-08-30 00:57:59 +020018# +----------------------------------------------------------------------------+
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",
Primiano Tucci02c11762019-08-30 00:57:59 +020038 ]
Primiano Tuccia7f5a8e2021-01-02 17:10:50 +010039 if (enable_perfetto_traced_probes) {
40 all_targets += [ "src/traced/probes:traced_probes" ]
41 }
Primiano Tuccia1959712018-05-17 11:01:56 +010042}
43
Mikhail Khokhlov0f7e68d2020-01-16 15:39:27 +000044if (enable_perfetto_trace_processor && enable_perfetto_trace_processor_sqlite) {
Primiano Tucci02c11762019-08-30 00:57:59 +020045 all_targets += [ "src/trace_processor:trace_processor_shell" ]
Primiano Tuccif3837d52018-01-10 21:12:41 +000046}
Primiano Tucci02c11762019-08-30 00:57:59 +020047
48if (enable_perfetto_heapprofd) {
Florian Mayerddc8ae22021-02-18 17:20:09 +000049 all_targets += [ "src/profiling/memory:heapprofd" ]
50
51 if (is_linux && !is_android) {
52 all_targets += [ "src/profiling/memory:heapprofd_glibc_preload" ]
53 }
Primiano Tucci02c11762019-08-30 00:57:59 +020054 if (perfetto_build_with_android) {
Florian Mayer23f79372020-06-16 14:37:06 +020055 all_targets += [
56 "src/profiling/memory:heapprofd_client",
57 "src/profiling/memory:heapprofd_client_api",
58 ]
Primiano Tucci02c11762019-08-30 00:57:59 +020059 }
60}
61
Ryan Savitskia76b3cc2019-11-20 16:25:24 +000062if (enable_perfetto_traced_perf) {
63 all_targets += [ "src/profiling/perf:traced_perf" ]
64}
65
Primiano Tucci02c11762019-08-30 00:57:59 +020066if (perfetto_build_with_android) {
Primiano Tucci94ca9a92021-01-14 11:16:15 +010067 all_targets += [ "src/android_internal:libperfetto_android_internal" ]
Primiano Tucci02c11762019-08-30 00:57:59 +020068}
69
70if (enable_perfetto_tools) {
Primiano Tucci8761a312021-11-25 17:17:23 +000071 all_targets += [
72 "tools",
73 "src/websocket_bridge",
74 ]
Primiano Tucci02c11762019-08-30 00:57:59 +020075}
76
77if (enable_perfetto_unittests) {
78 import("gn/perfetto_unittests.gni")
79 test("perfetto_unittests") {
80 deps = perfetto_unittests_targets
81 }
82 all_targets += [ ":perfetto_unittests" ]
83}
84
85if (enable_perfetto_integration_tests) {
86 import("gn/perfetto_integrationtests.gni")
87 test("perfetto_integrationtests") {
88 deps = perfetto_integrationtests_targets
89 }
90 all_targets += [
91 ":perfetto_integrationtests",
92 "test:client_api_example",
Primiano Tucciff68cac2020-08-06 18:13:17 +020093 "test/stress_test",
Primiano Tucci02c11762019-08-30 00:57:59 +020094 ]
95}
96
Mikhail Khokhlov90f09f62019-12-17 12:53:51 +000097if (enable_perfetto_trace_processor_json) {
Stephen Nuskoaca77482020-01-10 15:47:06 +000098 test("trace_processor_minimal_smoke_tests") {
Mikhail Khokhlov90f09f62019-12-17 12:53:51 +000099 testonly = true
100 deps = [
101 "gn:default_deps",
102 "src/trace_processor:storage_minimal_smoke_tests",
103 ]
104 }
105 all_targets += [ ":trace_processor_minimal_smoke_tests" ]
106}
107
Primiano Tucci02c11762019-08-30 00:57:59 +0200108if (enable_perfetto_benchmarks) {
109 import("gn/perfetto_benchmarks.gni")
110 executable("perfetto_benchmarks") {
111 testonly = true
112 deps = perfetto_benchmarks_targets
113 }
114 all_targets += [ ":perfetto_benchmarks" ]
115}
116
117if (enable_perfetto_fuzzers) {
118 import("gn/perfetto_fuzzers.gni")
119 group("fuzzers") {
120 testonly = true
121 deps = perfetto_fuzzers_targets
122 }
123 all_targets += [ ":fuzzers" ]
124}
125
126# Less interesting stuff that makes sense only in the standalone build, mainly
127# compile-time checks for the CI.
128if (perfetto_build_standalone) {
129 all_targets += [
Primiano Tucci02c11762019-08-30 00:57:59 +0200130 "test/configs",
131
132 # For syntax-checking the proto.
133 "protos/perfetto/config:merged_config",
134 "protos/perfetto/trace:merged_trace", # For syntax-checking the proto.
135
Primiano Tucci57dd66b2019-10-15 23:09:04 +0100136 # For checking all generated xxx.gen.{cc,h} files without waiting for
137 # embedders to try to use them and fail.
Primiano Tucci57dd66b2019-10-15 23:09:04 +0100138 "protos/perfetto/config:cpp",
139 "protos/perfetto/common:cpp",
140
Primiano Tucci02c11762019-08-30 00:57:59 +0200141 # Used in the when updating the ftrace protos
142 "protos/perfetto/trace/ftrace:descriptor",
Primiano Tucci55b4d912020-01-28 11:17:51 +0000143
144 # Checks that the "fake" backend implementations build.
145 "src/tracing:client_api_no_backends_compile_test",
Primiano Tucci02c11762019-08-30 00:57:59 +0200146 ]
Primiano Tucci42433ab2020-11-30 18:42:01 +0100147 if (is_linux || is_android) {
148 all_targets += [ "src/tracing/consumer_api_deprecated:consumer_api_test" ]
149 }
Primiano Tucci497c3ed2021-05-24 12:24:39 +0100150 if (is_linux || is_android || is_mac) {
151 all_targets += [ "src/tracebox" ]
152 }
Primiano Tucci02c11762019-08-30 00:57:59 +0200153}
Primiano Tuccif3837d52018-01-10 21:12:41 +0000154
Primiano Tuccifbf4a732019-12-11 00:32:15 +0000155# The CTS code is built (but not ran) also in standalone builds. This is to
156# catch refactoring breakages earlier without having to wait for treehugger.
157if (is_android && (perfetto_build_standalone || perfetto_build_with_android)) {
158 all_targets += [ "test/cts:perfetto_cts_deps" ]
159}
160
Primiano Tucciae2879e2017-09-27 11:02:09 +0900161group("all") {
162 testonly = true # allow to build also test targets
Primiano Tucci02c11762019-08-30 00:57:59 +0200163 deps = all_targets
Primiano Tucciae2879e2017-09-27 11:02:09 +0900164}
165
Primiano Tucci02c11762019-08-30 00:57:59 +0200166# This target is used when running ninja without any argument (by default would
167# build all reachable targets). This is mainly used to prevent the UI being
168# built when running ninja -C out/xxx.
169# This has effect only in standalone builds, no effect on chromium builds.
170# Chromium's "all" target depends on our "all" target above. However chromium's
171# "default" target depends on any target that we cause to be discovered by
172# depending on other GN files.
Primiano Tucci3faad742018-05-16 19:30:48 +0100173group("default") {
Primiano Tucci02c11762019-08-30 00:57:59 +0200174 testonly = true
Primiano Tucci2925e9d2020-01-27 10:15:58 +0000175 deps = [ ":all" ]
Primiano Tucci3faad742018-05-16 19:30:48 +0100176}
177
Primiano Tucci02c11762019-08-30 00:57:59 +0200178# +----------------------------------------------------------------------------+
179# | Other definitions: root targets that don't belong to any other subdirectory|
180# +----------------------------------------------------------------------------+
Primiano Tucci3faad742018-05-16 19:30:48 +0100181
Primiano Tucci02c11762019-08-30 00:57:59 +0200182if (enable_perfetto_ui) {
Mikhail Khokhlov8643d1c2019-06-04 12:02:47 +0100183 group("ui") {
Primiano Tucci2925e9d2020-01-27 10:15:58 +0000184 deps = [ "ui" ]
Mikhail Khokhlov8643d1c2019-06-04 12:02:47 +0100185 }
186}
187
Primiano Tucci02c11762019-08-30 00:57:59 +0200188# In Android builds, we build the code of traced and traced_probes in one shared
189# library that exposes one xxx_main() for each. The executables themselves are
190# tiny shells that just invoke their own entry point into the library.
191# This is done merely for saving binary size, because the three binaries happen
192# to share a lot of code.
193# When setting monolithic_binaries=true (only supported in standalone builds)
194# it builds more conventional executables, where each binary has the full
195# implementation and no shared library dependency. This is to make dev cycles
196# on Android faster, avoiding all the LD_LIBRARY_PATH boilerplate.
197# libperfetto.so is also used for stuff that is exposed to the rest of the
198# Android tree.
199if (enable_perfetto_platform_services) {
Primiano Tuccif3837d52018-01-10 21:12:41 +0000200 if (monolithic_binaries) {
Primiano Tucci098f0952019-09-03 10:21:20 +0100201 libperfetto_target_type = "static_library"
Primiano Tuccif3837d52018-01-10 21:12:41 +0000202 } else {
Primiano Tuccibdb2a592018-10-11 15:59:29 +0100203 libperfetto_target_type = "shared_library"
Primiano Tuccif3837d52018-01-10 21:12:41 +0000204 }
205
Primiano Tuccibdb2a592018-10-11 15:59:29 +0100206 target(libperfetto_target_type, "libperfetto") {
Primiano Tucci098f0952019-09-03 10:21:20 +0100207 if (libperfetto_target_type == "static_library") {
208 complete_static_lib = true
209 }
Primiano Tucci4e49c022017-12-21 18:22:44 +0100210 deps = [
211 "gn:default_deps",
Primiano Tucci6067e732018-01-08 16:19:40 +0000212 "src/traced/service",
213 ]
Primiano Tuccia7f5a8e2021-01-02 17:10:50 +0100214 if (enable_perfetto_traced_probes) {
215 deps += [ "src/traced/probes" ]
216 }
217 if (is_linux || is_android || is_mac) {
218 # TODO(primiano): this is here only for Android's iorapd. At some point
219 # we need to migrate iorapd to the Perfetto SDK.
220 deps += [ "src/tracing/consumer_api_deprecated" ]
221 }
Primiano Tucci6067e732018-01-08 16:19:40 +0000222 }
Primiano Tucci02c11762019-08-30 00:57:59 +0200223}
Oystein Eftevaaga812a942018-03-23 11:52:32 -0700224
Primiano Tucci7e05fc12019-08-27 17:29:47 +0200225if (!build_with_chromium) {
Primiano Tucci55b4d912020-01-28 11:17:51 +0000226 # Client library target exposed to the Android tree.
Primiano Tucci7e05fc12019-08-27 17:29:47 +0200227 # Still in experimental stage and not API stable yet.
228 # See "libperfetto_client_example" (in Android.bp.extras) for an example
229 # on how to use the Perfetto Client API from the android tree.
230 static_library("libperfetto_client_experimental") {
231 complete_static_lib = true
Primiano Tuccifbf4a732019-12-11 00:32:15 +0000232 public_deps = [
Primiano Tucci7e05fc12019-08-27 17:29:47 +0200233 "gn:default_deps",
Primiano Tucci3feec552020-02-04 11:14:42 +0000234 "src/tracing:client_api",
Primiano Tucci10c9e9e2021-01-08 13:04:40 +0100235 "src/tracing:platform_impl",
Primiano Tucci7e05fc12019-08-27 17:29:47 +0200236 ]
Primiano Tucci2925e9d2020-01-27 10:15:58 +0000237 sources = [ "include/perfetto/tracing.h" ]
Primiano Tuccie8020f92019-11-26 13:24:01 +0000238 assert_no_deps = [ "//gn:protobuf_lite" ]
Primiano Tucci4c5efa42018-10-23 13:15:13 +0100239 }
Primiano Tucci7e05fc12019-08-27 17:29:47 +0200240}
241
Primiano Tucci02c11762019-08-30 00:57:59 +0200242# TODO(primiano): there seem to be two "libperfetto" and one
243# "libperfetto_client_experimental" targets defined within this BUILD.gn file.
244# Rationalize them with eseckler@. For now seems this one is only used from
245# chromium and the other one only from the Android tree.
Primiano Tucci7e05fc12019-08-27 17:29:47 +0200246if (build_with_chromium) {
Eric Secklerc77dc1b2020-01-21 13:23:35 +0000247 component("libperfetto") {
248 public_configs = [ "gn:public_config" ]
Oystein Eftevaag5e8a4eb2018-01-09 11:41:58 -0800249 deps = [
Sylwester Blaszczyk0430ce82020-08-07 16:00:51 +0200250 "src/trace_processor/importers/memory_tracker:graph_processor",
Eric Seckler48d1ab52020-01-23 09:56:29 +0000251 "src/tracing:client_api",
Primiano Tuccic4c063b2020-01-27 09:34:46 +0000252 "src/tracing/core",
Eric Seckler48d1ab52020-01-23 09:56:29 +0000253
254 # TODO(eseckler): Create a platform for chrome and hook it up somehow.
255 "src/tracing:platform_fake",
Eric Secklerc77dc1b2020-01-21 13:23:35 +0000256 ]
257 configs -= [ "//build/config/compiler:chromium_code" ]
258 configs += [ "//build/config/compiler:no_chromium_code" ]
259 public_deps = [
Sylwester Blaszczyk0430ce82020-08-07 16:00:51 +0200260 "include/perfetto/ext/trace_processor/importers/memory_tracker",
Primiano Tucci2c5488f2019-06-01 03:27:28 +0100261 "include/perfetto/ext/tracing/core",
Eric Seckler48d1ab52020-01-23 09:56:29 +0000262 "include/perfetto/tracing",
Nicolò Mazzucatoc1084462019-09-24 16:26:06 +0100263 "protos/perfetto/common:zero",
Oystein Eftevaag6fcedac2018-07-02 12:02:55 -0700264 "protos/perfetto/trace:zero",
265 "protos/perfetto/trace/chrome:zero",
Eric Secklerd3139b42019-02-26 13:43:59 +0000266 "protos/perfetto/trace/interned_data:zero",
Oystein Eftevaagae116202019-07-11 09:48:42 -0700267 "protos/perfetto/trace/profiling:zero",
Piotr Roguski1c96e672020-08-24 16:19:50 +0200268 "protos/perfetto/trace/ps:zero",
Eric Secklerd3139b42019-02-26 13:43:59 +0000269 "protos/perfetto/trace/track_event:zero",
Oystein Eftevaaga812a942018-03-23 11:52:32 -0700270 ]
Stephen Nuskobfa6d632020-01-21 14:10:56 +0000271 if (enable_perfetto_ipc) {
Eric Seckler05355e02020-01-27 15:29:50 +0000272 deps += [
273 "src/tracing/ipc/producer",
274 "src/tracing/ipc/service",
275 ]
Stephen Nuskobfa6d632020-01-21 14:10:56 +0000276 public_deps += [ "include/perfetto/ext/tracing/ipc:ipc" ]
277 }
Eric Seckler60eff7d2020-05-20 13:03:07 +0100278 if (!is_nacl && !is_ios) {
279 deps += [
280 "src/trace_processor:export_json",
281 "src/trace_processor:storage_minimal",
282 ]
283 public_deps += [
284 "include/perfetto/ext/trace_processor:export_json",
285 "include/perfetto/trace_processor:storage",
286 ]
287 }
Oystein Eftevaag5e8a4eb2018-01-09 11:41:58 -0800288 }
Mikhail Khokhlov2bcfb352019-12-20 10:19:58 +0000289 component("libtrace_processor") {
290 public_configs = [ "gn:public_config" ]
Primiano Tucci2925e9d2020-01-27 10:15:58 +0000291 deps = [ "src/trace_processor:lib" ]
Mikhail Khokhlov2bcfb352019-12-20 10:19:58 +0000292 configs -= [ "//build/config/compiler:chromium_code" ]
293 configs += [ "//build/config/compiler:no_chromium_code" ]
Primiano Tucci2925e9d2020-01-27 10:15:58 +0000294 public_deps = [ "include/perfetto/trace_processor" ]
Eric Secklera7870e62019-11-01 10:11:58 +0000295 }
Alexander Timindfc4b692021-02-15 13:32:53 +0000296 component("perfetto_test_support") {
297 testonly = true
298 public_configs = [ "gn:public_config" ]
299 configs -= [ "//build/config/compiler:chromium_code" ]
300 configs += [ "//build/config/compiler:no_chromium_code" ]
301 public_deps = [ "include/perfetto/test:test_support" ]
302 deps = [ "src/tracing/test:test_support" ]
303 }
Oystein Eftevaaga812a942018-03-23 11:52:32 -0700304}