xref: /aosp_15_r20/external/perfetto/BUILD.gn (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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