# Copyright (C) 2018 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/wasm.gni")

wasm_lib("trace_processor_wasm") {
  name = "trace_processor"
  sources = [
    "wasm_bridge.cc",
  ]

  # All the deps below are implicitly xxx($wasm_toolchain) because of the
  # outer "is_wasm" block.
  deps = [
    ":lib",
    "../../buildtools:sqlite",
    "../../gn:default_deps",
    "../../include/perfetto/base",
    "../../protos/perfetto/trace_processor:lite",
  ]
}

# The library which eases processing of Perfetto traces by exposing reading
# friendly APIs.
static_library("trace_processor") {
  deps = [
    ":lib",
  ]
}

source_set("lib") {
  sources = [
    "chunked_trace_reader.h",
    "counters_table.cc",
    "counters_table.h",
    "event_tracker.cc",
    "event_tracker.h",
    "instants_table.cc",
    "instants_table.h",
    "process_table.cc",
    "process_table.h",
    "process_tracker.cc",
    "process_tracker.h",
    "proto_trace_parser.cc",
    "proto_trace_parser.h",
    "proto_trace_tokenizer.cc",
    "proto_trace_tokenizer.h",
    "query_constraints.cc",
    "query_constraints.h",
    "row_iterators.cc",
    "row_iterators.h",
    "sched_slice_table.cc",
    "sched_slice_table.h",
    "scoped_db.h",
    "slice_table.cc",
    "slice_table.h",
    "slice_tracker.cc",
    "slice_tracker.h",
    "span_join_operator_table.cc",
    "span_join_operator_table.h",
    "sql_stats_table.cc",
    "sql_stats_table.h",
    "sqlite_utils.h",
    "stats_table.cc",
    "stats_table.h",
    "storage_cursor.cc",
    "storage_cursor.h",
    "storage_schema.cc",
    "storage_schema.h",
    "string_table.cc",
    "string_table.h",
    "table.cc",
    "table.h",
    "table_utils.h",
    "thread_table.cc",
    "thread_table.h",
    "trace_blob_view.h",
    "trace_processor.cc",
    "trace_processor_context.cc",
    "trace_processor_context.h",
    "trace_processor_impl.cc",
    "trace_processor_impl.h",
    "trace_sorter.cc",
    "trace_sorter.h",
    "trace_storage.cc",
    "trace_storage.h",
    "virtual_destructors.cc",
    "window_operator_table.cc",
    "window_operator_table.h",
  ]
  deps = [
    "../../buildtools:sqlite",
    "../../gn:default_deps",
    "../../include/perfetto/traced:sys_stats_counters",
    "../../protos/perfetto/trace:lite",
    "../../protos/perfetto/trace_processor:lite",
    "../base",
    "../protozero",
  ]
  public_deps = [
    "../../include/perfetto/trace_processor",
  ]
  if (perfetto_build_standalone) {
    sources += [
      "json_trace_parser.cc",
      "json_trace_parser.h",
    ]
    deps += [ "../../gn:jsoncpp_deps" ]
  }
}

if (current_toolchain == host_toolchain) {
  executable("trace_processor_shell_host") {
    deps = [
      ":lib",
      "../../gn:default_deps",
      "../../protos/perfetto/trace_processor:lite",
      "../base",
    ]
    if (perfetto_build_standalone) {
      deps += [ "../../buildtools:linenoise" ]
    }
    sources = [
      "trace_processor_shell.cc",
    ]
  }
}

copy("trace_processor_shell") {
  host_out_dir_ = get_label_info(":trace_processor_shell_host($host_toolchain)",
                                 "root_out_dir")
  deps = [
    ":trace_processor_shell_host($host_toolchain)",
  ]
  sources = [
    "${host_out_dir_}/trace_processor_shell_host",
  ]
  outputs = [
    "${root_out_dir}/trace_processor_shell",
  ]
}

source_set("unittests") {
  testonly = true
  sources = [
    "counters_table_unittest.cc",
    "event_tracker_unittest.cc",
    "process_table_unittest.cc",
    "process_tracker_unittest.cc",
    "proto_trace_parser_unittest.cc",
    "query_constraints_unittest.cc",
    "sched_slice_table_unittest.cc",
    "slice_tracker_unittest.cc",
    "span_join_operator_table_unittest.cc",
    "thread_table_unittest.cc",
    "trace_processor_impl_unittest.cc",
    "trace_sorter_unittest.cc",
  ]
  deps = [
    ":lib",
    "../../buildtools:sqlite",
    "../../gn:default_deps",
    "../../gn:gtest_deps",
    "../../protos/perfetto/trace:lite",
    "../base",
  ]
}

source_set("integrationtests") {
  testonly = true
  sources = [
    "trace_database_integrationtest.cc",
  ]
  deps = [
    ":lib",
    "../../buildtools:sqlite",
    "../../gn:default_deps",
    "../../gn:gtest_deps",
    "../../protos/perfetto/trace:lite",
    "../../protos/perfetto/trace_processor:lite",
    "../base",
    "../base:test_support",
  ]
}
