# 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_unit_test/test.gni")
import("config.gni")

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

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

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",
  ]
}

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_tokenizer_time != ""
  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",
  ]
  inputs = [ "pw_trace_protos/trace_rpc.options" ]
}

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("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_tokenizer_time != ""
  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_tokenizer_time != ""
  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") {
  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 = [
      ":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",
    ]
  }
}
