# Copyright 2022 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/error.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_unit_test/test.gni")
import("backend.gni")

declare_args() {
  pw_log_string_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

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

pw_source_set("config") {
  public = [ "public/pw_log_string/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [
    "$dir_pw_preprocessor",
    pw_log_string_CONFIG,
  ]
}

# This source set only provides pw_log's backend interface by invoking the
# :handler facade.
pw_source_set("pw_log_string") {
  public_configs = [ ":backend_config" ]
  public = [ "public_overrides/pw_log_backend/log_backend.h" ]
  public_deps = [ ":handler" ]
}

pw_source_set("pw_log_string.impl") {
  deps = [ ":handler.impl" ]
}

# This facade is a C API for string based logging which may be used to back
# pw_log or for example to mix tokenized and string based logging.
pw_facade("handler") {
  backend = pw_log_string_HANDLER_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_string/handler.h" ]
  public_deps = [
    ":config",
    "$dir_pw_preprocessor",
  ]
  sources = [ "handler.cc" ]

  require_link_deps = [ ":handler.impl" ]
}

# Logging is low-level and ubiquitous. Because of this, it can often cause
# circular dependencies. This target collects dependencies from the backend that
# cannot be used because they would cause circular deps.
#
# This group ("$dir_pw_log_string:handler_impl") must be listed in
# pw_build_LINK_DEPS if pw_log_string_HANDLER_BACKEND is set.
#
# pw_log_string:handler backends must provide their own "impl" target that
# collects their actual dependencies. The backend "impl" group may be empty
# if everything can go directly in the backend target without causing circular
# dependencies.
if (pw_log_string_HANDLER_BACKEND != "") {
  pw_source_set("handler.impl") {
    deps = [ get_label_info(pw_log_string_HANDLER_BACKEND,
                            "label_no_toolchain") + ".impl" ]
  }
} else {
  pw_error("handler.impl") {
    message =
        string_join(" ",
                    [
                      "To use pw_log_string:handler, please direct",
                      "pw_log_string_HANDLER_BACKEND to the source set that",
                      "implements the C API.",
                    ])
  }
}

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

pw_test_group("tests") {
}
