# 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("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. (pwbug/246)
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("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" ]
}

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" ]
}
