# Copyright 2021 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_docgen/docs.gni")
import("$dir_pw_log/backend.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_unit_test/test.gni")

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

pw_facade("pw_log") {
  backend = pw_log_BACKEND
  public_configs = [ ":default_config" ]
  public = [
    "public/pw_log/levels.h",
    "public/pw_log/log.h",
    "public/pw_log/options.h",
    "public/pw_log/short.h",
    "public/pw_log/shorter.h",
  ]

  require_link_deps = [ ":impl" ]
}

# pw_log 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:impl") must listed in pw_build_LINK_DEPS if
# pw_log_BACKEND is set.
#
# pw_log 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.
group("impl") {
  public_deps = []

  if (pw_log_BACKEND != "") {
    public_deps +=
        [ get_label_info(pw_log_BACKEND, "label_no_toolchain") + ".impl" ]
  }
}

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

pw_test("basic_log_test") {
  enable_if = pw_log_BACKEND != ""
  deps = [
    ":pw_log",
    dir_pw_preprocessor,
    pw_log_BACKEND,
  ]

  sources = [
    "basic_log_test.cc",
    "basic_log_test_plain_c.c",
  ]
}

pw_proto_library("protos") {
  sources = [ "log.proto" ]
  prefix = "pw_log/proto"
  deps = [ "$dir_pw_tokenizer:proto" ]
}

pw_doc_group("docs") {
  sources = [
    "docs.rst",
    "protobuf.rst",
  ]
  inputs = [ "log.proto" ]
}
