# 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_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_log/backend.gni")
import("$dir_pw_tokenizer/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_includes") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

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

# This target provides the backend for pw_log.
pw_source_set("pw_log_tokenized") {
  public_configs = [
    ":public_includes",
    ":backend_config",
  ]
  public_deps = [
    "$dir_pw_log:facade",
    "$dir_pw_tokenizer:global_handler_with_payload.facade",
    dir_pw_preprocessor,
    pw_log_tokenized_CONFIG,
  ]
  public = [
    "public/pw_log_tokenized/config.h",
    "public/pw_log_tokenized/log_tokenized.h",
  ]
}

# TODO(ewout): remove this once all users are migrated off this target, using
# link deps for the log impl instead.
pw_source_set("log_backend") {
  public_configs = [ ":backend_config" ]
  public_deps = [ ":pw_log_tokenized" ]
  public = [ "public_overrides/pw_log_backend/log_backend.h" ]
  deps = [ "$dir_pw_tokenizer:global_handler_with_payload" ]
}

# TODO(ewout): remove this once all users are migrated off this target, using
# pw_log_tokenized and its pw_log_tokenized.impl instead.
pw_source_set("log_backend.impl") {
}

# TODO(ewout): Fill this out once all users are using link deps.
# 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") {
  public_deps = [ ":log_backend" ]
}

# 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") {
  public_configs = [ ":public_includes" ]
  public = [ "public/pw_log_tokenized/base64_over_hdlc.h" ]
  sources = [ "base64_over_hdlc.cc" ]
  deps = [
    "$dir_pw_hdlc:encoder",
    "$dir_pw_stream:sys_io_stream",
    "$dir_pw_tokenizer:base64",
    "$dir_pw_tokenizer:global_handler_with_payload.facade",
  ]
}

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

pw_test("log_tokenized_test") {
  sources = [ "test.cc" ]
  deps = [ ":pw_log_tokenized" ]
}

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