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

declare_args() {
  # 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("default_config") {
  include_dirs = [ "public" ]
}

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

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",
    ":default_config",
  ]
  public_deps = [
    ":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 = [
    "$dir_pw_ring_buffer",
    "$dir_pw_tokenizer",
    "$dir_pw_varint",
  ]
  sources = [ "trace_buffer.cc" ]
  public_configs = [
    ":default_config",
    ":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",
    ":default_config",
  ]
  public_deps = [ "$dir_pw_tokenizer" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_ring_buffer",
    "$dir_pw_status",
    "$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" ]
}
