| # Copyright (C) 2017 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import("gn/perfetto.gni") |
| import("gn/test.gni") |
| |
| if (perfetto_build_standalone || perfetto_build_with_android) { |
| import("//gn/standalone/android.gni") |
| } else { |
| import("//build/config/android/config.gni") |
| } |
| |
| # For use_libfuzzer. |
| if (perfetto_build_standalone || perfetto_build_with_android) { |
| import("//gn/standalone/sanitizers/vars.gni") |
| } else { |
| import("//build/config/sanitizers/sanitizers.gni") |
| } |
| |
| declare_args() { |
| # Only for local development. When true the binaries (perfetto, traced, ...) |
| # are monolithic and don't use a common shared library. This is mainly to |
| # avoid LD_LIBRARY_PATH dances when testing locally. |
| monolithic_binaries = false |
| |
| # libunwindstack requires API level 26 or newer. |
| should_build_heapprofd = |
| (perfetto_build_standalone || perfetto_build_with_android) && is_clang && |
| (is_linux || is_android) && |
| (!is_android || android_api_level >= 26 || perfetto_build_with_android) |
| } |
| assert(!monolithic_binaries || !perfetto_build_with_android) |
| |
| group("all") { |
| testonly = true # allow to build also test targets |
| deps = [ |
| ":perfetto_unittests", |
| "src/protozero/protoc_plugin:protozero_plugin($host_toolchain)", |
| ] |
| if (perfetto_build_standalone || perfetto_build_with_android || |
| build_with_chromium) { |
| deps += [ ":trace_processor_shell" ] |
| } |
| if (perfetto_build_standalone || perfetto_build_with_android) { |
| deps += [ |
| ":perfetto", |
| ":perfetto_integrationtests", |
| ":traced", |
| ":traced_probes", |
| ":trigger_perfetto", |
| "protos/perfetto/config:merged_config", # For syntax-checking the proto. |
| "protos/perfetto/trace:merged_trace", # For syntax-checking the proto. |
| "src/ipc/protoc_plugin:ipc_plugin($host_toolchain)", |
| "src/tracing:client_api", |
| "test:client_api_example", |
| "tools:protoc_helper", |
| ] |
| if (perfetto_build_standalone) { |
| deps += [ |
| ":perfetto_benchmarks", |
| "src/profiling/memory:ring_buffer", |
| "src/tracing:consumer_api_test", |
| "test/configs", |
| "tools/ftrace_proto_gen:ftrace_proto_gen", |
| "tools/proto_to_cpp", |
| "tools/protoprofile", |
| "tools/trace_to_text", |
| "tools/trace_to_text:trace_to_text_lite_host($host_toolchain)", |
| |
| # The diff testing framework depends on these descriptors. |
| "protos/perfetto/metrics:descriptor", |
| "protos/perfetto/trace:descriptor", |
| |
| # Used in the when updating the ftrace protos |
| "protos/perfetto/trace/ftrace:descriptor", |
| ] |
| if (is_linux || is_android) { |
| deps += [ "tools/busy_threads" ] |
| deps += [ "tools/cpu_utilization" ] |
| deps += [ "tools/dump_ftrace_stats" ] |
| deps += [ "tools/skippy" ] |
| } |
| if (is_fuzzer) { |
| deps += [ ":fuzzers" ] |
| } |
| } |
| } |
| } |
| |
| # TODO(primiano): temporary workaround to: |
| # 1) Prevent that the UI gets build automatically when doing ninja -C out/xx . |
| # 2) Avoid breaking the chrome build, that right now depends on "all". |
| group("default") { |
| testonly = true # allow to build also test targets |
| deps = [ |
| ":all", |
| ] |
| } |
| |
| # The trace processor shell executable. An interactive shell that allows to |
| # make queries on the trace using the terminal. |
| if (perfetto_build_standalone || perfetto_build_with_android || |
| build_with_chromium) { |
| executable("trace_processor_shell") { |
| deps = [ |
| "gn:default_deps", |
| "src/trace_processor:trace_processor_shell", |
| ] |
| testonly = true # We need this for proto full. |
| } |
| } |
| |
| if (perfetto_build_standalone) { |
| group("ui") { |
| deps = [ |
| "ui", |
| ] |
| } |
| } |
| |
| test("perfetto_unittests") { |
| deps = [ |
| "gn:default_deps", |
| "gn:gtest_main", |
| "src/base:unittests", |
| "src/protozero:unittests", |
| "src/tracing:unittests", |
| ] |
| |
| if (perfetto_build_standalone || perfetto_build_with_android) { |
| deps += [ |
| "src/ipc:unittests", |
| "src/perfetto_cmd:unittests", |
| "src/profiling/memory:ring_buffer_unittests", |
| "src/traced/probes:unittests", |
| "src/traced/probes/filesystem:unittests", |
| "src/traced/probes/ftrace:unittests", |
| "src/traced/service:unittests", |
| "tools/ftrace_proto_gen:unittests", |
| "tools/sanitizers_unittests", |
| ] |
| } |
| if (should_build_heapprofd) { |
| # Restrict to clang, as libunwindstack and its dependencies is never |
| # built using GCC in the Android tree. |
| deps += [ "src/profiling/memory:unittests" ] |
| } |
| if (perfetto_build_standalone && !is_android) { |
| deps += [ |
| "src/trace_processor:unittests", |
| "src/trace_processor/metrics:unittests", |
| ] |
| } |
| } |
| |
| if (perfetto_build_standalone || perfetto_build_with_android) { |
| test("perfetto_integrationtests") { |
| deps = [ |
| "gn:default_deps", |
| "gn:gtest_main", |
| "src/traced/probes/ftrace:integrationtests", |
| "src/tracing:client_api_integrationtests", |
| "test:end_to_end_integrationtests", |
| ] |
| if (perfetto_build_standalone && !is_android) { |
| deps += [ "src/trace_processor:integrationtests" ] |
| } |
| |
| # TODO(fmayer): Fix in process daemons. |
| if (should_build_heapprofd) { |
| deps += [ "src/profiling/memory:end_to_end_tests" ] |
| } |
| } |
| |
| if (monolithic_binaries) { |
| libperfetto_target_type = "source_set" |
| } else { |
| libperfetto_target_type = "shared_library" |
| } |
| |
| target(libperfetto_target_type, "libperfetto") { |
| deps = [ |
| "gn:default_deps", |
| "src/traced/probes", |
| "src/traced/service", |
| "src/tracing:consumer_api_deprecated", |
| ] |
| } |
| |
| # The unprivileged trace daemon that listens for Producer and Consumer |
| # connections, handles the coordination of the tracing sessions and owns the |
| # log buffers. |
| executable("traced") { |
| deps = [ |
| ":libperfetto", |
| "gn:default_deps", |
| "include/perfetto/ext/traced", |
| ] |
| sources = [ |
| "src/traced/service/main.cc", |
| ] |
| } |
| |
| # The unprivileged daemon that is allowed to access tracefs (for ftrace). |
| # Registers as a Producer on the traced daemon. |
| executable("traced_probes") { |
| deps = [ |
| ":libperfetto", |
| "gn:default_deps", |
| "include/perfetto/ext/traced", |
| ] |
| sources = [ |
| "src/traced/probes/main.cc", |
| ] |
| } |
| |
| # The command line client for Perfetto. Allows to configure / start / stop |
| # tracing, acting as a Consumer. |
| executable("perfetto") { |
| deps = [ |
| "gn:default_deps", |
| "src/perfetto_cmd", |
| ] |
| sources = [ |
| "src/perfetto_cmd/main.cc", |
| ] |
| } |
| |
| # Tool to finalize long running traces. |
| # This connects to traced as a producer and sends the triggers passed on the |
| # commandline. This is a subset of what the perfetto binary can do but we |
| # need a separate binary for programs that cannot (for good reason) use the |
| # additional functionality (for example starting traces via consumer socket) |
| # due to selinux rules. |
| executable("trigger_perfetto") { |
| deps = [ |
| "gn:default_deps", |
| "src/perfetto_cmd:trigger_perfetto_cmd", |
| ] |
| sources = [ |
| "src/perfetto_cmd/trigger_perfetto_main.cc", |
| ] |
| } |
| |
| # Client library target for the Android tree. |
| # Still in experimental stage and not API stable yet. |
| # See "libperfetto_client_example" (in Android.bp.extras) for an example |
| # on how to use the Perfetto Client API from the android tree. |
| static_library("libperfetto_client_experimental") { |
| complete_static_lib = true |
| deps = [ |
| "gn:default_deps", |
| "src/tracing", |
| "src/tracing:client_api", |
| "src/tracing:platform_posix", |
| ] |
| sources = [ |
| "include/perfetto/tracing.h", |
| ] |
| } |
| |
| if (perfetto_build_with_android) { |
| executable("trace_to_text") { |
| testonly = true |
| deps = [ |
| "gn:default_deps", |
| "tools/trace_to_text:full", |
| ] |
| } |
| |
| # This target exports perfetto trace protos in the Android build system, |
| # allowing both host and device targets to implement custom parsers based on |
| # our protos. |
| static_library("perfetto_trace_protos") { |
| deps = [ |
| "protos/perfetto/trace:lite", |
| ] |
| } |
| |
| shared_library("libperfetto_android_internal") { |
| deps = [ |
| "gn:default_deps", |
| "src/android_internal", |
| ] |
| } |
| } # if (perfetto_build_with_android) |
| } # if (perfetto_build_standalone || perfetto_build_with_android) |
| |
| if (perfetto_build_with_embedder) { |
| if (build_with_chromium) { |
| lib_target_type = "component" |
| } else { |
| lib_target_type = "source_set" |
| } |
| target(lib_target_type, "libperfetto") { |
| public_configs = [ "gn:public_config" ] |
| deps = [ |
| "src/tracing", |
| ] |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| public_deps = [ |
| "include/perfetto/ext/tracing/core", |
| "protos/perfetto/trace:zero", |
| "protos/perfetto/trace/chrome:zero", |
| "protos/perfetto/trace/interned_data:zero", |
| "protos/perfetto/trace/profiling:zero", |
| "protos/perfetto/trace/track_event:zero", |
| ] |
| } |
| target(lib_target_type, "libtrace_processor") { |
| public_configs = [ "gn:public_config" ] |
| deps = [ |
| "src/trace_processor:lib", |
| ] |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| public_deps = [ |
| "include/perfetto/trace_processor", |
| ] |
| } |
| } |
| |
| if (perfetto_build_standalone) { |
| executable("perfetto_benchmarks") { |
| testonly = true |
| deps = [ |
| "gn:default_deps", |
| "src/traced/probes/ftrace:benchmarks", |
| "test:benchmark_main", |
| "test:end_to_end_benchmarks", |
| ] |
| } |
| |
| group("fuzzers") { |
| testonly = true |
| deps = [ |
| "src/ipc:buffered_frame_deserializer_fuzzer", |
| "src/profiling/memory:shared_ring_buffer_fuzzer", |
| "src/profiling/memory:shared_ring_buffer_write_fuzzer", |
| "src/profiling/memory:unwinding_fuzzer", |
| "src/protozero:protozero_decoder_fuzzer", |
| "src/trace_processor:trace_processor_fuzzer", |
| "src/traced/probes/ftrace:cpu_reader_fuzzer", |
| "test:end_to_end_shared_memory_fuzzer", |
| "test:producer_socket_fuzzer", |
| ] |
| } |
| } |
| |
| # WARNING: this builds correctly only when using the generated Android.bp. |
| # |
| # This library gets loaded into (and executes in) arbitrary android processes. |
| # Logging must be non-allocating. This is achieved by defining |
| # PERFETTO_ANDROID_ASYNC_SAFE_LOG, which needs to be set for all perfetto code |
| # being compiled for this library. When generating Android.bp, the |cflags| |
| # entry on this target is sufficient (as all sources are flattened into a |
| # single bp target). However this is not correctly reflected in the gn |
| # structure (which is a tree of targets) as the dependencies would not pick |
| # up the flag (and thus use the wrong logging macro). |
| # |
| # This is deemed acceptable as, at the time of writing, there is no interest in |
| # building this library standalone. |
| if (perfetto_build_with_android) { |
| # TODO(fmayer): Investigate shared library for common pieces. |
| shared_library("heapprofd_client") { |
| configs -= [ "//gn/standalone:android_liblog" ] |
| cflags = [ "-DPERFETTO_ANDROID_ASYNC_SAFE_LOG" ] |
| deps = [ |
| "src/profiling/memory:malloc_hooks", |
| ] |
| } |
| } |
| |
| if (should_build_heapprofd) { |
| executable("heapprofd") { |
| deps = [ |
| "gn:default_deps", |
| "protos/perfetto/trace:zero", |
| "src/base", |
| "src/base:unix_socket", |
| "src/profiling/memory:daemon", |
| "src/profiling/memory:wire_protocol", |
| "src/tracing:ipc", |
| ] |
| sources = [ |
| "src/profiling/memory/main.cc", |
| ] |
| } |
| } |
| |
| if (perfetto_build_standalone) { |
| executable("idle_alloc") { |
| sources = [ |
| "tools/idle_alloc.cc", |
| ] |
| } |
| } |