# 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/module_config.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")

declare_args() {
  # The build target that overrides the default configuration options for this
  # module. This should point to a source set that provides defines through a
  # public config (which may -include a file or add defines directly).
  pw_trace_CONFIG = pw_build_DEFAULT_MODULE_CONFIG

  # Tokenizer trace time, gets included if provided
  pw_trace_tokenizer_time = ""

  # Trace buffer size in bytes. Set to 0 to disable.
  pw_trace_tokenized_BUFFER_SIZE = 256
}

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

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",
    ":pw_trace_tokenized_core",
    "$dir_pw_tokenizer",
  ]
  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 = [
    ":pw_trace_tokenized_core",
    "$dir_pw_trace",
  ]

  sources = [ "trace_test.cc" ]
}

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

pw_source_set("tokenized_trace_buffer") {
  deps = [ ":pw_trace_tokenized_core" ]
  public_deps = [
    ":config",
    "$dir_pw_ring_buffer",
    "$dir_pw_tokenizer",
    "$dir_pw_varint",
  ]
  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 = [ ":pw_trace_tokenized_core" ]
  sources = [ "fake_trace_time.cc" ]
}

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

pw_source_set("pw_trace_tokenized_core") {
  public_configs = [
    ":backend_config",
    ":public_include_path",
  ]
  public_deps = [
    "$dir_pw_status",
    "$dir_pw_tokenizer",
  ]
  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" ]
}

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