# 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/facade.gni")
import("$dir_pw_build/module_config.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_log/backend.gni")
import("$dir_pw_log_tokenized/backend.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_log_tokenized_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

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

config("gcc_partially_tokenized_backend_config") {
  include_dirs = [ "public_overrides" ]
  visibility = [ ":*" ]
}

# This target provides the backend for pw_log.
pw_source_set("pw_log_tokenized") {
  public_configs = [ ":backend_config" ]
  public_deps = [
    ":handler.facade",  # Depend on the facade to avoid circular dependencies.
    ":headers",
  ]
  public = [
    "public_overrides/pw_log_backend/log_backend.h",
    "public_overrides/pw_log_backend/log_backend_uses_pw_tokenizer.h",
  ]

  sources = [ "log_tokenized.cc" ]
}

pw_source_set("headers") {
  visibility = [ ":*" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":config",
    ":metadata",
    dir_pw_preprocessor,
    dir_pw_tokenizer,
  ]
  public = [ "public/pw_log_tokenized/log_tokenized.h" ]
}

# This target provides the backend for pw_log for GCC which tokenizes as much as
# it can and uses pw_log_string:handler for the rest.
pw_source_set("gcc_partially_tokenized") {
  public_configs = [
    ":gcc_partially_tokenized_backend_config",
    ":public_include_path",
  ]
  public_deps = [
    ":handler.facade",  # Depend on the facade to avoid circular dependencies.
    ":headers",
    "$dir_pw_log_string:handler",
  ]
  public = [
    "gcc_partially_tokenized_public_overrides/pw_log_backend/log_backend.h",
    "public/pw_log_tokenized/gcc_partially_tokenized.h",
  ]
  sources = [ "log_tokenized.cc" ]
}

pw_facade("handler") {
  public_configs = [ ":public_include_path" ]
  public_deps = [ dir_pw_preprocessor ]

  public = [ "public/pw_log_tokenized/handler.h" ]

  backend = pw_log_tokenized_HANDLER_BACKEND
}

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

pw_source_set("config") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    "$dir_pw_log:facade",
    "$dir_pw_tokenizer:config",
    dir_pw_polyfill,
    pw_log_tokenized_CONFIG,
  ]
  public = [ "public/pw_log_tokenized/config.h" ]
}

# The log backend deps that might cause circular dependencies, since
# pw_log is so ubiquitous. These deps are kept separate so they can be
# depended on from elsewhere.
pw_source_set("pw_log_tokenized.impl") {
  deps = [ ":pw_log_tokenized" ]

  if (pw_log_tokenized_HANDLER_BACKEND != "") {
    deps += [ ":handler" ]
  }
}

pw_source_set("base64") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_tokenized/base64.h" ]
  public_deps = [
    ":config",
    "$dir_pw_tokenizer:base64",
  ]
}

# This target provides a backend for pw_tokenizer that encodes tokenized logs as
# Base64, encodes them into HDLC frames, and writes them over sys_io.
pw_source_set("base64_over_hdlc") {
  sources = [ "base64_over_hdlc.cc" ]
  deps = [
    ":base64",
    ":handler.facade",
    "$dir_pw_hdlc:encoder",
    "$dir_pw_stream:sys_io_stream",
    "$dir_pw_tokenizer:base64",
    dir_pw_span,
  ]
}

pw_test_group("tests") {
  tests = [
    ":log_tokenized_test",
    ":metadata_test",
  ]
}

pw_test("log_tokenized_test") {
  sources = [
    "log_tokenized_test.cc",
    "log_tokenized_test_c.c",
    "pw_log_tokenized_private/test_utils.h",
  ]
  deps = [
    ":base64",
    ":headers",
    dir_pw_preprocessor,
  ]
}

pw_test("metadata_test") {
  sources = [ "metadata_test.cc" ]
  deps = [ ":metadata" ]
}

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