# 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/perfetto_host_executable.gni")
import("../../gn/test.gni")
import("../../gn/wasm.gni")

# Prevent that this file is accidentally included in embedder builds.
assert(enable_perfetto_trace_processor)

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

if (enable_perfetto_ui) {
  wasm_lib("trace_processor_wasm") {
    name = "trace_processor"
    deps = [
      ":lib",
      "../../gn:default_deps",
      "../base",
      "rpc:wasm_bridge",
    ]
  }
}

source_set("protozero_to_text") {
  sources = [
    "importers/proto/track_event.descriptor.h",
    "protozero_to_text.cc",
    "protozero_to_text.h",
  ]
  deps = [
    ":descriptors",
    "../../gn:default_deps",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/trace/track_event:zero",
    "../base",
    "../protozero:protozero",
  ]
}

source_set("descriptors") {
  sources = [
    "descriptors.cc",
    "descriptors.h",
  ]
  deps = [
    "../../gn:default_deps",
    "../../include/perfetto/trace_processor",
    "../../protos/perfetto/common:zero",
    "../base",
    "../protozero:protozero",
  ]
}

source_set("storage_minimal") {
  sources = [
    "args_tracker.cc",
    "args_tracker.h",
    "chunked_trace_reader.h",
    "clock_tracker.cc",
    "clock_tracker.h",
    "destructible.cc",
    "destructible.h",
    "event_tracker.cc",
    "event_tracker.h",
    "forwarding_trace_parser.cc",
    "forwarding_trace_parser.h",
    "ftrace_utils.h",
    "global_args_tracker.cc",
    "global_args_tracker.h",
    "gzip_trace_parser.cc",
    "gzip_trace_parser.h",
    "heap_profile_tracker.cc",
    "heap_profile_tracker.h",
    "importers/ftrace/ftrace_module.cc",
    "importers/ftrace/ftrace_module.h",
    "importers/fuchsia/fuchsia_record.h",
    "importers/proto/args_table_utils.cc",
    "importers/proto/args_table_utils.h",
    "importers/proto/chrome_compositor_scheduler_state.descriptor.h",
    "importers/proto/packet_sequence_state.cc",
    "importers/proto/packet_sequence_state.h",
    "importers/proto/proto_importer_module.cc",
    "importers/proto/proto_importer_module.h",
    "importers/proto/proto_incremental_state.h",
    "importers/proto/proto_trace_parser.cc",
    "importers/proto/proto_trace_parser.h",
    "importers/proto/proto_trace_tokenizer.cc",
    "importers/proto/proto_trace_tokenizer.h",
    "importers/proto/track_event_module.cc",
    "importers/proto/track_event_module.h",
    "importers/proto/track_event_parser.cc",
    "importers/proto/track_event_parser.h",
    "importers/proto/track_event_tokenizer.cc",
    "importers/proto/track_event_tokenizer.h",
    "metadata.h",
    "metadata_tracker.cc",
    "metadata_tracker.h",
    "process_tracker.cc",
    "process_tracker.h",
    "slice_tracker.cc",
    "slice_tracker.h",
    "stack_profile_tracker.cc",
    "stack_profile_tracker.h",
    "stats.h",
    "syscall_tracker.h",
    "timestamped_trace_piece.h",
    "trace_blob_view.h",
    "trace_parser.h",
    "trace_processor_context.cc",
    "trace_processor_context.h",
    "trace_processor_storage.cc",
    "trace_processor_storage_impl.cc",
    "trace_processor_storage_impl.h",
    "trace_sorter.cc",
    "trace_sorter.h",
    "trace_storage.cc",
    "trace_storage.h",
    "track_tracker.cc",
    "track_tracker.h",
    "variadic.cc",
    "variadic.h",
    "virtual_destructors.cc",
  ]

  deps = [
    ":descriptors",
    "../../gn:default_deps",
    "../../gn:zlib",
    "../base",
    "../protozero",
    "containers",
    "tables",
  ]
  public_deps = [
    "../../include/perfetto/trace_processor:storage",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/config:zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/chrome:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../../protos/perfetto/trace/perfetto: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",
  ]
  if (enable_perfetto_trace_processor_json_import) {
    sources += [
      "importers/json/json_trace_parser.cc",
      "importers/json/json_trace_parser.h",
      "importers/json/json_trace_tokenizer.cc",
      "importers/json/json_trace_tokenizer.h",
      "importers/json/json_trace_utils.cc",
      "importers/json/json_trace_utils.h",
    ]
    deps += [ "../../gn:jsoncpp" ]
  }
  if (enable_perfetto_trace_processor_fuchsia) {
    sources += [
      "ftrace_utils.cc",
      "importers/fuchsia/fuchsia_record.cc",
      "importers/fuchsia/fuchsia_trace_parser.cc",
      "importers/fuchsia/fuchsia_trace_parser.h",
      "importers/fuchsia/fuchsia_trace_tokenizer.cc",
      "importers/fuchsia/fuchsia_trace_tokenizer.h",
      "importers/fuchsia/fuchsia_trace_utils.cc",
      "importers/fuchsia/fuchsia_trace_utils.h",
    ]
  }
}

source_set("storage_full") {
  sources = [
    "importers/ftrace/binder_tracker.cc",
    "importers/ftrace/binder_tracker.h",
    "importers/ftrace/ftrace_descriptors.cc",
    "importers/ftrace/ftrace_descriptors.h",
    "importers/ftrace/ftrace_module_impl.cc",
    "importers/ftrace/ftrace_module_impl.h",
    "importers/ftrace/ftrace_parser.cc",
    "importers/ftrace/ftrace_parser.h",
    "importers/ftrace/ftrace_tokenizer.cc",
    "importers/ftrace/ftrace_tokenizer.h",
    "importers/ftrace/rss_stat_tracker.cc",
    "importers/ftrace/rss_stat_tracker.h",
    "importers/ftrace/sched_event_tracker.cc",
    "importers/ftrace/sched_event_tracker.h",
    "importers/proto/android_probes_module.cc",
    "importers/proto/android_probes_module.h",
    "importers/proto/android_probes_parser.cc",
    "importers/proto/android_probes_parser.h",
    "importers/proto/graphics_event_module.cc",
    "importers/proto/graphics_event_module.h",
    "importers/proto/graphics_event_parser.cc",
    "importers/proto/graphics_event_parser.h",
    "importers/proto/heap_graph_module.cc",
    "importers/proto/heap_graph_module.h",
    "importers/proto/heap_graph_tracker.cc",
    "importers/proto/heap_graph_tracker.h",
    "importers/proto/heap_graph_walker.cc",
    "importers/proto/heap_graph_walker.h",
    "importers/proto/system_probes_module.cc",
    "importers/proto/system_probes_module.h",
    "importers/proto/system_probes_parser.cc",
    "importers/proto/system_probes_parser.h",
    "importers/proto/vulkan_memory_tracker.cc",
    "importers/proto/vulkan_memory_tracker.h",
    "importers/systrace/systrace_parser.cc",
    "importers/systrace/systrace_parser.h",
    "importers/systrace/systrace_trace_parser.cc",
    "importers/systrace/systrace_trace_parser.h",
    "register_additional_modules.cc",
    "register_additional_modules.h",
    "syscall_tracker.cc",
    "syscalls_aarch32.h",
    "syscalls_aarch64.h",
    "syscalls_armeabi.h",
    "syscalls_x86_64.h",
  ]
  public_deps = [
    ":storage_minimal",
  ]
  deps = [
    "../../include/perfetto/ext/base:base",
    "../../include/perfetto/ext/traced:sys_stats_counters",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/gpu:zero",
    "../../protos/perfetto/trace/interned_data:zero",
    "../protozero",
  ]
  if (enable_perfetto_trace_processor_json) {
    public_deps += [ "../../gn:jsoncpp" ]
  }

  # Include these sources only if they are not already included in
  # storage_minimal.
  if (!enable_perfetto_trace_processor_fuchsia) {
    sources += [ "ftrace_utils.cc" ]
  }
}

if (enable_perfetto_trace_processor_json) {
  source_set("export_json") {
    sources = [
      "export_json.cc",
      "export_json.h",
    ]
    deps = [
      ":storage_minimal",
      "../../gn:default_deps",
      "../../gn:jsoncpp",
      "../base",
    ]
    public_deps = [
      "../../include/perfetto/ext/trace_processor:export_json",
    ]
  }
}

source_set("lib") {
  sources = [
    "filtered_row_index.cc",
    "filtered_row_index.h",
    "gfp_flags.cc",
    "gfp_flags.h",
    "raw_table.cc",
    "raw_table.h",
    "read_trace.cc",
    "row_iterators.cc",
    "row_iterators.h",
    "sched_slice_table.cc",
    "sched_slice_table.h",
    "span_join_operator_table.cc",
    "span_join_operator_table.h",
    "sql_stats_table.cc",
    "sql_stats_table.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",
    "trace_processor.cc",
    "trace_processor_impl.cc",
    "trace_processor_impl.h",
    "window_operator_table.cc",
    "window_operator_table.h",
  ]

  deps = [
    ":storage_full",
    "../../gn:default_deps",
    "../../gn:sqlite",
    "../../protos/perfetto/metrics:zero",
    "../../protos/perfetto/metrics/android:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../base",
    "db:lib",
    "metrics:lib",
    "sqlite",
    "tables",
  ]
  public_deps = [
    "../../include/perfetto/trace_processor",
  ]
  if (enable_perfetto_trace_processor_json) {
    deps += [ ":export_json" ]
  }
}

perfetto_host_executable("trace_processor_shell") {
  deps = [
    ":lib",
    "../../gn:default_deps",
    "../../gn:protoc_lib",
    "../../src/profiling/symbolizer",
    "../../src/profiling/symbolizer:symbolize_database",
    "../base",
    "metrics:lib",
  ]
  if (enable_perfetto_version_gen) {
    deps += [ "../../gn/standalone:gen_git_revision" ]
  }
  if (enable_perfetto_trace_processor_linenoise) {
    deps += [ "../../gn:linenoise" ]
  }
  if (enable_perfetto_trace_processor_httpd) {
    deps += [ "rpc:httpd" ]
  }
  sources = [
    "proto_to_json.cc",
    "proto_to_json.h",
    "trace_processor_shell.cc",
  ]
}

perfetto_unittest_source_set("unittests") {
  testonly = true
  sources = [
    "clock_tracker_unittest.cc",
    "event_tracker_unittest.cc",
    "filtered_row_index_unittest.cc",
    "forwarding_trace_parser_unittest.cc",
    "ftrace_utils_unittest.cc",
    "heap_profile_tracker_unittest.cc",
    "importers/proto/args_table_utils_unittest.cc",
    "importers/proto/heap_graph_walker_unittest.cc",
    "importers/proto/proto_trace_parser_unittest.cc",
    "importers/systrace/systrace_parser_unittest.cc",
    "process_tracker_unittest.cc",
    "protozero_to_text_unittests.cc",
    "sched_slice_table_unittest.cc",
    "slice_tracker_unittest.cc",
    "span_join_operator_table_unittest.cc",
    "syscall_tracker_unittest.cc",
    "trace_sorter_unittest.cc",
  ]
  deps = [
    ":descriptors",
    ":lib",
    ":protozero_to_text",
    ":storage_full",
    "../../gn:default_deps",
    "../../gn:gtest_and_gmock",
    "../../gn:sqlite",
    "../../protos/perfetto/common:zero",
    "../../protos/perfetto/trace:minimal_zero",
    "../../protos/perfetto/trace:zero",
    "../../protos/perfetto/trace/android:zero",
    "../../protos/perfetto/trace/chrome:zero",
    "../../protos/perfetto/trace/ftrace:zero",
    "../../protos/perfetto/trace/gpu:zero",
    "../../protos/perfetto/trace/interned_data: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",
    "../protozero:testing_messages_zero",
    "containers:unittests",
    "db:unittests",
    "sqlite",
    "sqlite:unittests",
    "tables:unittests",
  ]

  if (enable_perfetto_trace_processor_json) {
    if (enable_perfetto_trace_processor_json_import) {
      sources += [
        "importers/json/json_trace_tokenizer_unittest.cc",
        "importers/json/json_trace_utils_unittest.cc",
      ]
      deps += [ "../../gn:jsoncpp" ]
    }
    if (!is_win) {
      # export_json_unittest.cc uses base::TempFile, which is not supported on
      # windows.
      sources += [ "export_json_unittest.cc" ]
      deps += [
        ":export_json",
        "../../gn:jsoncpp",
        "../../include/perfetto/ext/trace_processor:export_json",
      ]
    }
  }
  if (enable_perfetto_trace_processor_fuchsia) {
    sources += [ "importers/fuchsia/fuchsia_trace_utils_unittest.cc" ]
  }
}

source_set("integrationtests") {
  testonly = true
  sources = [
    "trace_database_integrationtest.cc",
  ]
  deps = [
    ":lib",
    ":storage_full",
    "../../gn:default_deps",
    "../../gn:gtest_and_gmock",
    "../base",
    "../base:test_support",
    "sqlite",
  ]

  if (enable_perfetto_trace_processor_json_import) {
    deps += [ "../../gn:jsoncpp" ]
  }
}

if (enable_perfetto_trace_processor_json) {
  source_set("storage_minimal_smoke_tests") {
    testonly = true
    sources = [
      "storage_minimal_smoke_test.cc",
    ]
    deps = [
      ":export_json",
      ":storage_minimal",
      "../../gn:default_deps",
      "../../gn:gtest_and_gmock",
      "../../gn:gtest_main",
      "../../gn:jsoncpp",
      "../base:test_support",
    ]
  }
}

perfetto_fuzzer_test("trace_processor_fuzzer") {
  testonly = true
  sources = [
    "trace_parsing_fuzzer.cc",
  ]
  deps = [
    ":storage_full",
    "../../gn:default_deps",
    "../base",
  ]
}
