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