# 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/fuzzer.gni")
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 = [
    "android_logs_table.cc",
    "android_logs_table.h",
    "args_table.cc",
    "args_table.h",
    "args_tracker.cc",
    "args_tracker.h",
    "chunked_trace_reader.h",
    "clock_tracker.cc",
    "clock_tracker.h",
    "counter_definitions_table.cc",
    "counter_definitions_table.h",
    "counter_values_table.cc",
    "counter_values_table.h",
    "event_tracker.cc",
    "event_tracker.h",
    "filtered_row_index.cc",
    "filtered_row_index.h",
    "ftrace_descriptors.cc",
    "ftrace_descriptors.h",
    "ftrace_utils.cc",
    "ftrace_utils.h",
    "fuchsia_provider_view.cc",
    "fuchsia_provider_view.h",
    "fuchsia_trace_parser.cc",
    "fuchsia_trace_parser.h",
    "fuchsia_trace_tokenizer.cc",
    "fuchsia_trace_tokenizer.h",
    "fuchsia_trace_utils.cc",
    "fuchsia_trace_utils.h",
    "heap_profile_tracker.cc",
    "heap_profile_tracker.h",
    "instants_table.cc",
    "instants_table.h",
    "null_term_string_view.h",
    "process_table.cc",
    "process_table.h",
    "process_tracker.cc",
    "process_tracker.h",
    "proto_incremental_state.h",
    "proto_trace_parser.cc",
    "proto_trace_parser.h",
    "proto_trace_tokenizer.cc",
    "proto_trace_tokenizer.h",
    "query_constraints.cc",
    "query_constraints.h",
    "raw_table.cc",
    "raw_table.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",
    "sqlite3_str_split.cc",
    "sqlite3_str_split.h",
    "sqlite_utils.h",
    "stats.h",
    "stats_table.cc",
    "stats_table.h",
    "storage_columns.cc",
    "storage_columns.h",
    "storage_schema.cc",
    "storage_schema.h",
    "storage_table.cc",
    "storage_table.h",
    "string_pool.cc",
    "string_pool.h",
    "string_table.cc",
    "string_table.h",
    "syscall_tracker.cc",
    "syscall_tracker.h",
    "syscalls_aarch32.h",
    "syscalls_aarch64.h",
    "syscalls_armeabi.h",
    "syscalls_x86_64.h",
    "table.cc",
    "table.h",
    "thread_table.cc",
    "thread_table.h",
    "trace_blob_view.h",
    "trace_parser.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/common:zero",
    "../../protos/perfetto/metrics:zero",
    "../../protos/perfetto/metrics/android:zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../../protos/perfetto/trace/power:zero",
    "../../protos/perfetto/trace/profiling:zero",
    "../../protos/perfetto/trace/ps:zero",
    "../../protos/perfetto/trace/sys_stats:zero",
    "../../protos/perfetto/trace/track_event:zero",
    "../base",
    "../protozero",
    "metrics:lib",
  ]
  public_deps = [
    "../../include/perfetto/trace_processor",
  ]
  if (perfetto_build_standalone) {
    sources += [
      "json_trace_parser.cc",
      "json_trace_parser.h",
      "json_trace_tokenizer.cc",
      "json_trace_tokenizer.h",
      "json_trace_utils.cc",
      "json_trace_utils.h",
    ]
    deps += [ "../../gn:jsoncpp_deps" ]
  }
}

if (current_toolchain == host_toolchain) {
  executable("trace_processor_shell_host") {
    deps = [
      ":lib",
      "../../gn:default_deps",
      "../base",
    ]
    if (perfetto_build_standalone) {
      deps += [
        "../../buildtools:linenoise",
        "../../gn/standalone:gen_git_revision",
      ]
    }
    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 = [
    "clock_tracker_unittest.cc",
    "event_tracker_unittest.cc",
    "filtered_row_index_unittest.cc",
    "ftrace_utils_unittest.cc",
    "heap_profile_tracker_unittest.cc",
    "null_term_string_view_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",
    "sqlite3_str_split_unittest.cc",
    "string_pool_unittest.cc",
    "syscall_tracker_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/common:zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../../protos/perfetto/trace/ps:zero",
    "../../protos/perfetto/trace/sys_stats:zero",
    "../../protos/perfetto/trace/track_event:zero",
    "../base",
    "../protozero",
  ]
  if (perfetto_build_standalone) {
    sources += [
      "json_trace_tokenizer_unittest.cc",
      "json_trace_utils_unittest.cc",
    ]
    deps += [ "../../gn:jsoncpp_deps" ]
  }
}

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",
  ]
  if (perfetto_build_standalone) {
    deps += [ "../../gn:jsoncpp_deps" ]
  }
}

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