# 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("//build_overrides/build.gni")
import("../../gn/perfetto.gni")
import("../../gn/wasm.gni")

source_set("base") {
  deps = [
    "../../gn:default_deps",
  ]
  public_deps = [
    "../../include/perfetto/base",
    "../../include/perfetto/ext/base",
  ]
  sources = [
    "file_utils.cc",
    "metatrace.cc",
    "paged_memory.cc",
    "string_splitter.cc",
    "string_utils.cc",
    "string_view.cc",
    "thread_checker.cc",
    "time.cc",
    "virtual_destructors.cc",
  ]

  # TODO(brucedawson): Enable these for Windows when possible.
  if (!is_win) {
    sources += [
      "event.cc",
      "pipe.cc",
      "temp_file.cc",
      "thread_task_runner.cc",
      "unix_task_runner.cc",
    ]
  }

  if ((perfetto_build_standalone || perfetto_build_with_android) &&
      (is_linux || is_android) && !is_wasm) {
    sources += [ "watchdog_posix.cc" ]
  }
  if (is_debug && perfetto_build_standalone && !is_wasm) {
    deps += [ ":debug_crash_stack_trace" ]
  }
}

# The "android_task_runner" should be depended on only by targets that
# explicitly need it, as it pulls in a dependency on libandroid.so that in turn
# pulls dozen of other .so(s).
if (is_android && (perfetto_build_standalone || perfetto_build_with_android)) {
  source_set("android_task_runner") {
    deps = [
      ":base",
      "../../gn:default_deps",
    ]
    sources = [
      "android_task_runner.cc",
    ]
    all_dependent_configs = [ ":android_config" ]
  }

  config("android_config") {
    libs = [ "android" ]
  }
}

if (is_debug && perfetto_build_standalone && !is_wasm) {
  source_set("debug_crash_stack_trace") {
    sources = [
      "debug_crash_stack_trace.cc",
    ]
    deps = [
      "../../gn:default_deps",
      "../../include/perfetto/ext/base",
      "../../include/perfetto/ext/base",
    ]
    if (is_linux || is_android) {
      deps += [ "../../gn:libbacktrace" ]
    }
    cflags = [ "-Wno-deprecated" ]
  }
}

if (perfetto_build_with_ipc_layer) {
  # This cannot be in :base as it does not build on WASM.
  source_set("unix_socket") {
    deps = [
      "../../gn:default_deps",
      "../../include/perfetto/ext/base",
      "../../include/perfetto/ext/base",
    ]
    sources = [
      "unix_socket.cc",
    ]
  }
}

source_set("test_support") {
  testonly = true
  deps = [
    ":base",
    "../../gn:default_deps",
    "../../gn:gtest_and_gmock",
  ]
  sources = [
    "test/utils.cc",
    "test/utils.h",
    "test/vm_test_utils.cc",
    "test/vm_test_utils.h",
  ]

  # The Perfetto task runner is not used on Windows.
  if (!is_win) {
    sources += [
      "test/test_task_runner.cc",
      "test/test_task_runner.h",
    ]
  }
}

source_set("unittests") {
  testonly = true
  deps = [
    ":base",
    ":test_support",
    "../../gn:default_deps",
    "../../gn:gtest_and_gmock",
  ]

  if (is_android &&
      (perfetto_build_standalone || perfetto_build_with_android)) {
    deps += [ ":android_task_runner" ]
  }
  sources = [
    "circular_queue_unittest.cc",
    "no_destructor_unittest.cc",
    "optional_unittest.cc",
    "paged_memory_unittest.cc",
    "scoped_file_unittest.cc",
    "string_splitter_unittest.cc",
    "string_utils_unittest.cc",
    "string_view_unittest.cc",
    "string_writer_unittest.cc",
    "time_unittest.cc",
    "weak_ptr_unittest.cc",
  ]

  # TODO(brucedawson): Enable these for Windows when possible.
  if (!is_win) {
    sources += [
      "metatrace_unittest.cc",
      "task_runner_unittest.cc",
      "temp_file_unittest.cc",
      "thread_checker_unittest.cc",
      "thread_task_runner_unittest.cc",
      "utils_unittest.cc",
    ]
  }
  if (perfetto_build_standalone || perfetto_build_with_android) {
    sources += [ "unix_socket_unittest.cc" ]
    if (is_linux || is_android) {
      sources += [ "watchdog_unittest.cc" ]
    }
  }
}
