# 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_build/module_config.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")
import("backend.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_assert_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

config("assert_backend_overrides") {
  include_dirs = [ "assert_compatibility_public_overrides" ]
  visibility = [ ":*" ]
}

config("libc_assert_overrides") {
  include_dirs = [ "libc_assert_public_overrides" ]
  visibility = [ ":*" ]
}

config("print_and_abort_check_backend_overrides") {
  include_dirs = [ "print_and_abort_check_public_overrides" ]
  visibility = [ ":*" ]
}

config("print_and_abort_assert_backend_overrides") {
  include_dirs = [ "print_and_abort_assert_public_overrides" ]
  visibility = [ ":*" ]
}

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

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

# 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/short.h",
  ]
  public_deps = [
    ":config",
    dir_pw_preprocessor,
  ]

  require_link_deps = [ ":impl" ]
}

# Provide "pw_assert/assert.h" in its own source set, so it can be used without
# depending on pw_assert_BACKEND.
pw_facade("assert") {
  backend = pw_assert_LITE_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_assert/assert.h" ]
  public_deps = [ ":config" ]
}

# This backend to pw_assert's PW_ASSERT()/PW_DASSERT() macros provides backwards
# compatibility with pw_assert's previous C-symbol based API.
#
# Warning: The assert facade is in a transitional state, and this target is
# likely to be removed as the pw_assert API is reassessed. (b/235149326)
pw_source_set("assert_compatibility_backend") {
  public_configs = [ ":assert_backend_overrides" ]
  public_deps = [ dir_pw_preprocessor ]
  public = [
    "assert_compatibility_public_overrides/pw_assert_backend/assert_backend.h",
  ]
}

group("assert_compatibility_backend.impl") {
}

pw_source_set("libc_assert") {
  public_configs = [ ":public_include_path" ]
  public = [
    "libc_assert_public_overrides/assert.h",
    "libc_assert_public_overrides/cassert",
    "public/pw_assert/internal/libc_assert.h",
  ]
  public_deps = [
    ":assert",
    dir_pw_preprocessor,
  ]
}

pw_source_set("print_and_abort") {
  public_configs = [ ":public_include_path" ]
  public_deps = [ ":config" ]
  public = [ "public/pw_assert/internal/print_and_abort.h" ]
  visibility = [ ":*" ]
}

# This backend to pw_assert's PW_CHECK()/PW_DCHECK() macros prints the assert
# expression, evaluated expression, file/line number, function, and user message
# with printf, then aborts. It is intended for use with host builds.
pw_source_set("print_and_abort_check_backend") {
  public_configs = [ ":print_and_abort_check_backend_overrides" ]
  public_deps = [ ":print_and_abort" ]
  public = [
    "print_and_abort_check_public_overrides/pw_assert_backend/check_backend.h",
  ]
}

group("print_and_abort_check_backend.impl") {
}

# This backend to pw_assert's PW_ASSERT()/PW_DASSERT() macros prints the assert
# expression, file/line number, and function with printf, then aborts. It is
# intended for use with host builds.
pw_source_set("print_and_abort_assert_backend") {
  public_configs = [ ":print_and_abort_assert_backend_overrides" ]
  public_deps = [
    ":config",
    ":print_and_abort",
  ]
  public = [ "print_and_abort_assert_public_overrides/pw_assert_backend/assert_backend.h" ]
}

group("print_and_abort_assert_backend.impl") {
}

# 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:impl") must listed in pw_build_LINK_DEPS if
# pw_assert_BACKEND is set.
#
# pw_assert 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_assert_BACKEND != "") {
    public_deps +=
        [ get_label_info(pw_assert_BACKEND, "label_no_toolchain") + ".impl" ]
  }
  if (pw_assert_LITE_BACKEND != "") {
    public_deps += [ get_label_info(pw_assert_LITE_BACKEND,
                                    "label_no_toolchain") + ".impl" ]
  }
}

# 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",
    dir_pw_status,
  ]
}

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/check_impl.h
  sources = [
    "assert_facade_test.cc",
    "fake_backend.cc",
    "public/pw_assert/internal/check_impl.h",
    "pw_assert_test/fake_backend.h",
  ]
  deps = [
    ":pw_assert",
    dir_pw_span,
    dir_pw_status,
    dir_pw_string,
  ]
  negative_compilation_tests = true

  # 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 = [
    "backends.rst",
    "docs.rst",
  ]
}
