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