# Copyright 2020 The Pigweed Authors
#
# 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
#
#     https://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/pigweed.gni")

import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_third_party/nanopb/nanopb.gni")
import("$dir_pw_trace/backend.gni")
import("$dir_pw_unit_test/test.gni")
import("config.gni")

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

config("backend_config") {
  include_dirs = [ "public_overrides" ]
}

# Some tests in this file do not compile unless pw_trace_tokenized is the trace
# backend.
_pw_trace_tokenized_is_selected =
    get_label_info(pw_trace_BACKEND, "label_no_toolchain") ==
    get_label_info(":pw_trace_tokenized", "label_no_toolchain") &&
    pw_trace_tokenizer_time != ""

pw_source_set("config") {
  public_deps = [ pw_trace_CONFIG ]
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_trace_tokenized/config.h" ]
}

config("linux_include_config_overrides") {
  cflags = [
    "-include",
    rebase_path("linux_config_overrides.h", root_build_dir),
  ]
  visibility = [ ":*" ]
}

pw_source_set("linux_config_overrides") {
  public_configs = [ ":linux_include_config_overrides" ]
  sources = [ "linux_config_overrides.h" ]
}

pw_test_group("tests") {
  tests = [
    ":trace_tokenized_test",
    ":tokenized_trace_buffer_test",
    ":tokenized_trace_buffer_log_test",
    ":trace_service_pwpb_test",
  ]
}

pw_source_set("pw_trace_tokenized") {
  public_configs = [
    ":backend_config",
    ":public_include_path",
  ]
  public_deps = [
    ":config",
    ":core",
    "$dir_pw_tokenizer",
  ]
  deps = []
  if (pw_trace_tokenizer_time != "") {
    deps += [ "$pw_trace_tokenizer_time" ]
  }

  public = [ "public_overrides/pw_trace_backend/trace_backend.h" ]
}

pw_test("trace_tokenized_test") {
  enable_if = _pw_trace_tokenized_is_selected
  deps = [
    ":core",
    "$dir_pw_trace",
  ]

  sources = [ "trace_test.cc" ]
}

config("trace_buffer_size") {
  defines = [ "PW_TRACE_BUFFER_SIZE_BYTES=${pw_trace_tokenized_BUFFER_SIZE}" ]
}

pw_proto_library("protos") {
  sources = [
    "pw_trace_protos/trace.proto",
    "pw_trace_protos/trace_rpc.proto",
    "pw_trace_protos/trace_service.proto",
  ]
  inputs = [
    "pw_trace_protos/trace_rpc.options",
    "pw_trace_protos/trace_service.options",
  ]
  python_package = "py"
  deps = [ "$dir_pw_chrono:protos" ]
}

pw_source_set("trace_rpc_service") {
  public_configs = [ ":public_include_path" ]
  public_deps = [ ":protos.nanopb_rpc" ]
  deps = [
    ":core",
    ":tokenized_trace_buffer",
    "$dir_pw_log",
    "$dir_pw_trace",
  ]
  sources = [
    "public/pw_trace_tokenized/trace_rpc_service_nanopb.h",
    "trace_rpc_service_nanopb.cc",
  ]
}

pw_source_set("base_trace_service") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":core",
    ":tokenized_trace_buffer",
  ]
  deps = [
    "$dir_pw_ring_buffer",
    "$dir_pw_stream",
  ]
  sources = [
    "base_trace_service.cc",
    "public/pw_trace_tokenized/base_trace_service.h",
  ]
}

pw_source_set("trace_service_pwpb") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":base_trace_service",
    ":protos.pwpb_rpc",
  ]
  deps = [ "$dir_pw_chrono:system_clock" ]
  sources = [
    "public/pw_trace_tokenized/trace_service_pwpb.h",
    "trace_service_pwpb.cc",
  ]
}

pw_test("trace_service_pwpb_test") {
  enable_if = _pw_trace_tokenized_is_selected
  deps = [
    ":trace_service_pwpb",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_rpc/pwpb:test_method_context",
    "$dir_pw_trace",
  ]
  sources = [ "trace_service_pwpb_test.cc" ]
}

pw_source_set("tokenized_trace_buffer") {
  deps = [ ":core" ]
  public_deps = [
    ":config",
    "$dir_pw_bytes",
    "$dir_pw_ring_buffer",
    "$dir_pw_tokenizer",
    "$dir_pw_varint",
    dir_pw_span,
  ]
  sources = [ "trace_buffer.cc" ]
  public_configs = [
    ":public_include_path",
    ":trace_buffer_size",
  ]
  public = [ "public/pw_trace_tokenized/trace_buffer.h" ]
}

pw_test("tokenized_trace_buffer_test") {
  enable_if = _pw_trace_tokenized_is_selected
  deps = [
    ":tokenized_trace_buffer",
    "$dir_pw_trace",
  ]

  sources = [ "trace_buffer_test.cc" ]
}

pw_source_set("tokenized_trace_buffer_log") {
  deps = [
    "$dir_pw_base64",
    "$dir_pw_log",
    "$dir_pw_string",
  ]
  public_deps = [ ":tokenized_trace_buffer" ]
  sources = [ "trace_buffer_log.cc" ]
  public = [ "public/pw_trace_tokenized/trace_buffer_log.h" ]
}

pw_test("tokenized_trace_buffer_log_test") {
  enable_if = _pw_trace_tokenized_is_selected
  deps = [
    ":tokenized_trace_buffer_log",
    "$dir_pw_trace",
  ]
  sources = [ "trace_buffer_log_test.cc" ]
}

pw_source_set("fake_trace_time") {
  deps = [ ":core" ]
  sources = [ "fake_trace_time.cc" ]
}

pw_source_set("host_trace_time") {
  deps = [ ":core" ]
  sources = [ "host_trace_time.cc" ]
}

pw_source_set("core") {
  public_configs = [
    ":backend_config",
    ":public_include_path",
  ]
  public_deps = [
    "$dir_pw_log",
    "$dir_pw_status",
    "$dir_pw_tokenizer",
    dir_pw_span,
  ]
  deps = [
    ":config",
    "$dir_pw_assert",
    "$dir_pw_ring_buffer",
    "$dir_pw_trace:facade",
    "$dir_pw_varint",
  ]
  public = [
    "public/pw_trace_tokenized/internal/trace_tokenized_internal.h",
    "public/pw_trace_tokenized/trace_callback.h",
    "public/pw_trace_tokenized/trace_tokenized.h",
  ]
  sources = [ "trace.cc" ]
  visibility = [ ":*" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}

config("trace_example_config") {
  include_dirs = [ "example/public" ]
}

pw_source_set("trace_example_to_file") {
  public_deps = [ ":pw_trace_tokenized" ]
  public_configs = [ ":trace_example_config" ]
  public = [ "example/public/pw_trace_tokenized/example/trace_to_file.h" ]
}

# Builds trace examples
pw_executable("trace_tokenized_example_basic") {
  deps = [
    ":trace_example_to_file",
    "$dir_pw_log",
    "$dir_pw_trace",
    "$dir_pw_trace:trace_sample_app",
  ]
  sources = [ "example/basic.cc" ]
}

pw_executable("trace_tokenized_example_trigger") {
  deps = [
    ":trace_example_to_file",
    "$dir_pw_log",
    "$dir_pw_trace",
    "$dir_pw_trace:trace_sample_app",
  ]
  sources = [ "example/trigger.cc" ]
}

pw_executable("trace_tokenized_example_filter") {
  deps = [
    ":trace_example_to_file",
    "$dir_pw_log",
    "$dir_pw_trace",
    "$dir_pw_trace:trace_sample_app",
  ]
  sources = [ "example/filter.cc" ]
}

if (dir_pw_third_party_nanopb == "") {
  group("trace_tokenized_example_rpc") {
  }
} else {
  pw_executable("trace_tokenized_example_rpc") {
    sources = [ "example/rpc.cc" ]
    deps = [
      ":pw_trace_tokenized",
      ":trace_rpc_service",
      "$dir_pw_hdlc",
      "$dir_pw_log",
      "$dir_pw_rpc:server",
      "$dir_pw_rpc/system_server",
      "$dir_pw_trace",
      "$dir_pw_trace:trace_sample_app",
    ]
  }
}

if (current_os != "linux") {
  group("trace_tokenized_example_linux_group_by_tid") {
  }
} else {
  pw_executable("trace_tokenized_example_linux_group_by_tid") {
    sources = [ "example/linux_group_by_tid.cc" ]
    deps = [
      ":trace_example_to_file",
      "$dir_pw_log",
      "$dir_pw_trace",
    ]
  }
}
