# 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_unit_test/test.gni")

declare_args() {
  # Backend for the pw_assert module.
  pw_assert_BACKEND = ""
}

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

# Depending on dir_pw_assert provides both assert and check.
group("pw_assert") {
  public_deps = [
    ":assert",
    ":check",
  ]
}

# Wrap :pw_assert with facade-style targets, so it can be used as if it were
# created with pw_facade.
group("facade") {
  public_deps = [
    ":assert",
    ":check.facade",
  ]
}

group("pw_assert.facade") {
  public_deps = [ ":facade" ]
}

# Provides the rich PW_CHECK macros.
pw_facade("check") {
  backend = pw_assert_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_assert/check.h",
    "public/pw_assert/internal/check_impl.h",
    "public/pw_assert/options.h",
    "public/pw_assert/short.h",
  ]
  public_deps = [ dir_pw_preprocessor ]
}

# Provide "pw_assert/assert.h" in its own source set, so it can be used without
# depending on pw_assert_BACKEND. This makes it possible to use PW_ASSERT in
# situations that might result in circular dependencies, such as in low-level
# headers like polyfill or span. See the docs for more discussion around where
# to use which assert headers.
#
# The implementation function pw_assert_HandleFailure() must be provided at link
# time. It is linked by the pw_assert:pw_assert (or pw_assert:check) targets.
pw_source_set("assert") {
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_assert/assert.h",

    # Needed for PW_ASSERT_ENABLE_DEBUG. Note that depending on :pw_assert to
    # get options.h won't work here since it will trigger the circular include
    # problem that the :assert target is intended solve.
    "public/pw_assert/options.h",
  ]
  public_deps = [ dir_pw_preprocessor ]
}

# pw_assert 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_assert:deps") must listed in pw_build_LINK_DEPS if
# pw_assert_BACKEND is set.
#
# pw_assert backends must provide their own "deps" group that collects their
# actual dependencies. The backend "deps" group may be empty.
group("deps") {
  public_deps = []

  if (pw_assert_BACKEND != "") {
    public_deps += [ get_label_info(pw_assert_BACKEND, "dir") + ":deps" ]

    # Make sure this target is listed in pw_build_LINK_DEPS. This
    # ensures these dependencies are available during linking, even if nothing
    # else in the build depends on them.
    _deps_label = get_label_info(":$target_name", "label_no_toolchain")
    _deps_is_in_link_dependencies = false

    foreach(label, pw_build_LINK_DEPS) {
      if (get_label_info(label, "label_no_toolchain") == _deps_label) {
        _deps_is_in_link_dependencies = true
      }
    }

    # TODO(pwbug/372): Update projects with pw_assert to link the :deps target.
    _disable_this_check_for_now = true
    not_needed([
                 "_deps_is_in_link_dependencies",
                 "_deps_label",
               ])

    assert(_disable_this_check_for_now || _deps_is_in_link_dependencies,
           "\$dir_pw_assert:$target_name must be listed in " +
               "pw_build_LINK_DEPS when pw_assert_BACKEND is set")
  }
}

# Note: While this is technically a test, doesn't verify any of the output and
# is more of a compile test. The results can be visually verified if desired.
pw_test("assert_test") {
  configs = [ ":public_include_path" ]
  sources = [ "assert_test.cc" ]
  deps = [ ":pw_assert" ]
}

pw_test_group("tests") {
  tests = [
    ":assert_test",
    ":assert_backend_compile_test",
    ":assert_facade_test",
  ]
}

# The assert facade test doesn't require a backend since a fake one is
# provided. However, since this doesn't depend on the backend it re-includes
# the facade headers.
pw_test("assert_facade_test") {
  configs = [ ":public_include_path" ]  # For internal/assert_impl.h
  sources = [
    "assert_facade_test.cc",
    "fake_backend.cc",
    "public/pw_assert/internal/check_impl.h",
    "pw_assert_test/fake_backend.h",
  ]
  deps = [
    ":assert",
    dir_pw_status,
  ]

  # TODO(frolv): Fix this test on the QEMU target.
  enable_if = pw_build_EXECUTABLE_TARGET_TYPE != "lm3s6965evb_executable"
}

pw_test("assert_backend_compile_test") {
  enable_if = pw_assert_BACKEND != ""
  deps = [
    ":pw_assert",
    dir_pw_status,
    pw_assert_BACKEND,
  ]
  sources = [
    "assert_backend_compile_test.cc",
    "assert_backend_compile_test_c.c",
  ]
}

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