# 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")

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
}
assert(!monolithic_binaries || !build_with_android)

group("all") {
  testonly = true  # allow to build also test targets
  deps = [
    ":perfetto_unittests",
    "src/ipc/protoc_plugin:ipc_plugin($host_toolchain)",
    "src/protozero/protoc_plugin($host_toolchain)",
    "tools/proto_to_cpp",
    "tools/trace_to_text",
  ]
  if (is_linux || is_android) {
    deps += [ "tools/ftrace_proto_gen:ftrace_proto_gen" ]
  }
  if (!build_with_chromium) {
    deps += [
      "protos/perfetto/config:merged_config",  # For syntax-checking the proto.
      "test/configs",
      "tools:protoc_helper",
    ]
    if (is_linux || is_android) {
      deps += [
        ":perfetto",
        ":perfetto_benchmarks",
        ":perfetto_integrationtests",
        ":traced",
        ":traced_probes",
      ]
    }
  }
}

executable("perfetto_unittests") {
  testonly = true
  deps = [
    "gn:default_deps",
    "gn:gtest_main",
    "src/base:base_unittests",
    "src/ipc:perfetto_ipc_unittests",
    "src/protozero:protozero_unittests",
    "src/tracing:tracing_unittests",
  ]
  if (is_linux || is_android) {
    deps += [
      "src/ftrace_reader:ftrace_reader_unittests",
      "tools/ftrace_proto_gen:ftrace_proto_gen_unittests",
    ]
  }
  if (!build_with_chromium) {
    deps += [ "tools/sanitizers_unittests" ]
  }
}

if (!build_with_chromium && (is_linux || is_android)) {
  executable("perfetto_benchmarks") {
    testonly = true
    deps = [
      "gn:default_deps",
      "src/ftrace_reader:ftrace_reader_benchmarks",
      "src/tracing:tracing_benchmarks",
      "test:benchmark_main",
    ]
  }

  executable("perfetto_integrationtests") {
    testonly = true
    deps = [
      "gn:default_deps",
      "gn:gtest_main",
      "src/ftrace_reader:ftrace_reader_integrationtests",
      "test:end_to_end_integrationtests",
    ]
    if (build_with_android) {
      cflags = [ "-DPERFETTO_BUILD_WITH_ANDROID" ]
    }
  }

  if (monolithic_binaries) {
    libtraced_shared_target_type = "source_set"
  } else {
    libtraced_shared_target_type = "shared_library"
  }

  target(libtraced_shared_target_type, "libtraced_shared") {
    deps = [
      "gn:default_deps",
      "src/traced/probes",
      "src/traced/service",
    ]
  }

  # 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 = [
      ":libtraced_shared",
      "gn:default_deps",
    ]
    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 = [
      ":libtraced_shared",
      "gn:default_deps",
    ]
    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/traced/perfetto_cmd",
    ]
    sources = [
      "src/traced/perfetto_cmd/main.cc",
    ]
    if (is_android) {
      deps += [ "src/base:android_task_runner" ]
    }
    if (build_with_android) {
      cflags = [ "-DPERFETTO_BUILD_WITH_ANDROID" ]
      libs = [
        "binder",
        "services",
        "utils",
      ]
    }
  }
} else {
  group("lib") {
    public_configs = [ "gn:public_config" ]
    deps = [
      "src/tracing",
    ]
  }
}  # !build_with_chromium
