blob: 0e412fbbf50fb424b66961b9c13d2ed4da69ef49 [file] [log] [blame] [edit]
# Copyright 2019 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.
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_python//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load("//pw_build:compatibility.bzl", "incompatible_with_mcu")
load("//pw_build:glob_dirs.bzl", "glob_dirs", "match_dir", "match_dir_internal")
load("//pw_build:load_phase_test.bzl", "pw_string_comparison_test", "pw_string_list_comparison_test", "return_error")
load("//pw_build:pw_cc_binary.bzl", "pw_cc_binary_with_map")
load("//pw_build:pw_cc_blob_library.bzl", "pw_cc_blob_info", "pw_cc_blob_library")
load("//pw_build:pw_copy_and_patch_file_test.bzl", "pw_copy_and_patch_file_test")
load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")
package(default_visibility = ["//visibility:public"])
licenses(["notice"])
config_setting(
name = "kythe",
values = {
"define": "kythe_corpus=pigweed.googlesource.com/pigweed/pigweed",
},
)
pw_cc_blob_info(
name = "test_blob_aligned",
alignas = "512",
file_path = "test_blob_0123.bin",
symbol_name = "kFirstBlob0123",
)
pw_cc_blob_info(
name = "test_blob_unaligned",
file_path = "test_blob_0123.bin",
symbol_name = "kSecondBlob0123",
)
pw_cc_blob_library(
name = "test_blob",
blobs = [
":test_blob_aligned",
":test_blob_unaligned",
],
namespace = "test::ns",
out_header = "pw_build/test_blob.h",
)
pw_cc_test(
name = "cc_blob_library_test",
srcs = ["cc_blob_library_test.cc"],
deps = [":test_blob"],
)
pw_cc_binary_with_map(
name = "cc_binary_with_map",
srcs = ["empty_main.cc"],
# Only enable on platforms that support -Map linker flag
target_compatible_with = ["@platforms//os:linux"],
)
# Bazel produces root-relative file paths without the -ffile-prefix-map option.
pw_cc_test(
name = "file_prefix_map_test",
srcs = [
"file_prefix_map_test.cc",
"pw_build_private/file_prefix_map_test.h",
],
defines = [
"PW_BUILD_EXPECTED_HEADER_PATH=\\\"pw_build/pw_build_private/file_prefix_map_test.h\\\"",
"PW_BUILD_EXPECTED_SOURCE_PATH=\\\"pw_build/file_prefix_map_test.cc\\\"",
],
tags = ["noclangtidy"],
)
label_flag(
name = "default_module_config",
# The default module config is empty.
build_setting_default = ":empty_cc_library",
)
cc_library(
name = "test_module_config",
defines = [
"PW_THREAD_FREERTOS_CONFIG_JOINING_ENABLED=1",
],
)
pw_cc_test(
name = "module_config_test",
srcs = ["module_config_test.cc"],
# This test requires a special configuration. It's run in CI, and can be
# run manually via,
#
# bazel build \
# --config=stm32f429i_freertos \
# --//pw_thread_freertos:config_override=//pw_build:test_module_config \
# //pw_build:module_config_test
tags = ["manual"],
deps = ["//pw_thread:thread"],
)
# This empty library is used as a placeholder for label flags that need to
# point to a library of some kind, but don't actually need the dependency to
# amount to anything.
cc_library(
name = "empty_cc_library",
)
# A special target used instead of a cc_library as the default condition in
# backend multiplexer select statements to signal that a facade is in an
# unconfigured state. This produces better error messages than e.g. using an
# invalid label.
#
# If you're a user whose build errored out because a library transitively
# depended on this target: the platform you're targeting did not specify which
# backend to use for some facade. Look at the previous step in the dependency
# chain (printed with the error) to figure out which one.
cc_library(
name = "unspecified_backend",
target_compatible_with = ["@platforms//:incompatible"],
)
# Additional libraries that all binaries using Pigweed should be linked against.
#
# This is analogous to GN's pw_build_LINK_DEPS. See
# https://pigweed.dev/build_system.html#docs-build-system-bazel-link-extra-lib
# for more details.
cc_library(
name = "default_link_extra_lib",
deps = [
"//pw_assert:assert_backend_impl",
"//pw_assert:check_backend_impl",
"//pw_log:backend_impl",
],
)
# Linker script utility PW_MUST_PLACE
cc_library(
name = "must_place",
hdrs = ["public/pw_build/must_place.ld.h"],
strip_include_prefix = "public",
)
cc_library(
name = "linker_symbol",
hdrs = ["public/pw_build/linker_symbol.h"],
strip_include_prefix = "public",
deps = [
"//third_party/fuchsia:stdcompat",
],
)
pw_cc_test(
name = "linker_symbol_test",
srcs = ["linker_symbol_test.cc"],
linkopts = [
"-T$(execpath linker_symbol_test.ld)",
],
target_compatible_with = [
"@platforms//os:linux",
],
deps = [
":linker_symbol",
":linker_symbol_test.ld",
],
)
pw_string_list_comparison_test(
name = "simple_glob",
actual = glob_dirs(
["test_data/**"],
exclude = ["test_data/pw_copy_and_patch_file/**"],
),
expected = [
"test_data",
"test_data/glob_dirs",
"test_data/glob_dirs/nested_1",
"test_data/glob_dirs/nested_1/foo",
"test_data/glob_dirs/nested_2",
],
)
pw_string_comparison_test(
name = "single_match",
actual = match_dir(["test_data/glob_dirs/nested_1"]),
expected = "test_data/glob_dirs/nested_1",
)
pw_string_comparison_test(
name = "no_match_single",
actual = match_dir(["test_data/glob_dirs/nested_1/nope"]),
expected = None,
)
pw_string_comparison_test(
name = "no_match_single_fail",
actual = match_dir_internal(
["test_data/glob_dirs/**/*.txt"],
_fail_callback = return_error,
allow_empty = False,
),
expected = "glob pattern [\"test_data/glob_dirs/**/*.txt\"] didn't match anything, but allow_empty is set to False",
)
pw_string_comparison_test(
name = "bad_match_multiple",
actual = match_dir_internal(
["test_data/glob_dirs/**"],
_fail_callback = return_error,
allow_empty = False,
),
expected = "glob pattern [\"test_data/glob_dirs/**\"] matches multiple directories when only one was requested: [\"test_data/glob_dirs\", \"test_data/glob_dirs/nested_1\", \"test_data/glob_dirs/nested_1/foo\", \"test_data/glob_dirs/nested_2\"]",
)
pw_string_comparison_test(
name = "match_exclusions",
actual = match_dir(
["test_data/glob_dirs/**"],
allow_empty = False,
exclude = ["test_data/glob_dirs/*/**"],
),
expected = "test_data/glob_dirs",
)
pw_string_list_comparison_test(
name = "single_match_glob",
actual = glob_dirs(["test_data/glob_dirs/nested_1"]),
expected = [
"test_data/glob_dirs/nested_1",
],
)
pw_string_list_comparison_test(
name = "partial_match_glob",
actual = glob_dirs(["test_data/glob_dirs/nested_*"]),
expected = [
"test_data/glob_dirs/nested_1",
"test_data/glob_dirs/nested_2",
],
)
pw_string_list_comparison_test(
name = "nested_match_glob",
actual = glob_dirs(["test_data/glob_dirs/*/foo"]),
expected = [
"test_data/glob_dirs/nested_1/foo",
],
)
pw_string_list_comparison_test(
name = "no_match_glob",
actual = glob_dirs(["test_data/glob_dirs/others/**"]),
expected = [
],
)
pw_copy_and_patch_file_test(
name = "patch_file_basic",
src = "test_data/pw_copy_and_patch_file/basic.txt",
out = "test_data/pw_copy_and_patch_file/patched_basic.txt",
expected = "test_data/pw_copy_and_patch_file/basic.expected",
patch_file = "test_data/pw_copy_and_patch_file/basic.patch",
)
filegroup(
name = "doxygen",
srcs = [
"public/pw_build/linker_symbol.h",
"public/pw_build/must_place.ld.h",
],
)
sphinx_docs_library(
name = "docs",
srcs = [
"bazel.rst",
"cmake.rst",
"docs.rst",
"gn.rst",
"linker_scripts.rst",
"pigweed.bazelrc",
"project_builder.rst",
"python.gni",
"python.rst",
"python_gn_args.gni",
"//pw_build/py:docs",
],
prefix = "pw_build/",
target_compatible_with = incompatible_with_mcu(),
)