blob: cb425a691c3b653594cd659f0a0b6cd1c1d91383 [file]
# 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("@com_google_protobuf//bazel:proto_library.bzl", "proto_library")
load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library")
load("@com_google_protobuf//bazel/toolchains:proto_lang_toolchain.bzl", "proto_lang_toolchain")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_python//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary")
load("@sphinxdocs//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_bool_comparison_test", "pw_string_comparison_test", "pw_string_list_comparison_test", "return_error")
load("//pw_build:pigweed_is_root.bzl", "pigweed_is_root")
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_build:pw_py_importable_runfile.bzl", "pw_py_importable_runfile")
load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")
load(":pw_pylint.bzl", "pylint_repo_allowlist")
load(":pw_pylint_test.bzl", "pw_pylint_test_suite")
package(default_visibility = ["//visibility:public"])
licenses(["notice"])
label_flag(
name = "pylint",
build_setting_default = ":pigweed_pip_pylint",
)
py_console_script_binary(
name = "pigweed_pip_pylint",
pkg = "@pigweed_python_packages//pylint",
script = "pylint",
# TODO: https://github.com/bazel-contrib/rules_python/issues/3126 - Remove
# this tag once the bug in rules_python is fixed.
tags = ["nomypy"],
)
label_flag(
name = "pylintrc",
build_setting_default = "//pw_build/bazel_internal:empty_file_target",
)
pylint_repo_allowlist(
name = "default_allowed_repos",
allowed_canonical_names = [],
)
label_flag(
name = "pylint_allowed_repositories_target",
build_setting_default = ":default_allowed_repos",
)
config_setting(
name = "kythe",
values = {
"define": "kythe_corpus=pigweed.googlesource.com/pigweed/pigweed",
},
)
alias(
name = "python_protobuf_runtime",
actual = select({
"@platforms//os:linux": "@pigweed_python_packages//protobuf",
"@platforms//os:macos": "@pigweed_python_packages//protobuf",
"@platforms//os:windows": "@pigweed_python_packages//protobuf",
"//conditions:default": "@com_google_protobuf//:protobuf_python",
}),
)
# This toolchain targets python proto libraries using the python_protobuf_runtime.
# It is used by py_proto_library to generate python proto code.
proto_lang_toolchain(
name = "pw_python_proto_toolchain",
command_line = "--python_out=%s",
progress_message = "Generating Python proto_library %{label}",
runtime = ":python_protobuf_runtime",
toolchain_type = "@com_google_protobuf//bazel/private:python_toolchain_type",
)
proto_library(
name = "workflows_proto",
srcs = [
"proto/workflows.proto",
],
# Make private until the proto stabilizes.
visibility = ["//:__subpackages__"],
deps = [
"@com_google_protobuf//:any_proto",
],
)
py_proto_library(
name = "workflows_proto_py_pb2",
deps = [":workflows_proto"],
)
proto_library(
name = "build_driver_proto",
srcs = [
"proto/build_driver.proto",
],
# Restrict API to Pigweed until the api stabilizes.
visibility = ["//:__subpackages__"],
deps = [
":workflows_proto",
],
)
py_proto_library(
name = "build_driver_proto_py_pb2",
# Restrict API to Pigweed until the api stabilizes.
visibility = ["//:__subpackages__"],
deps = [":build_driver_proto"],
)
proto_library(
name = "pigweed_build_driver",
srcs = [
"proto/pigweed_build_driver.proto",
],
# Restrict API to Pigweed until the api stabilizes.
visibility = ["//:__subpackages__"],
deps = [
":workflows_proto",
],
)
py_proto_library(
name = "pigweed_build_driver_py_pb2",
# Restrict API to Pigweed until the api stabilizes.
visibility = ["//:__subpackages__"],
deps = [":pigweed_build_driver"],
)
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_info(
name = "test_blob_checksum",
file_path = "test_blob_0123.bin",
symbol_name = "kBlobWithChecksum",
)
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_blob_library(
name = "test_blob_with_checksum",
blobs = [
":test_blob_checksum",
],
checksum = "CRC32",
namespace = "test::checksum_ns",
out_header = "pw_build/test_blob_with_checksum.h",
)
pw_cc_test(
name = "cc_blob_library_test",
srcs = ["cc_blob_library_test.cc"],
deps = [":test_blob"],
)
pw_cc_test(
name = "cc_blob_library_checksum_test",
srcs = ["cc_blob_library_checksum_test.cc"],
deps = [":test_blob_with_checksum"],
)
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 = "@rules_cc//:empty_lib",
)
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.
alias(
name = "empty_cc_library",
actual = "@rules_cc//:empty_lib",
)
# 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"],
features = ["-ctad_warnings"],
linkopts = [
"-T$(execpath linker_symbol_test.ld)",
],
target_compatible_with = [
"@platforms//os:linux",
],
deps = [
":linker_symbol",
":linker_symbol_test.ld",
],
)
cc_library(
name = "sandbox_test_visible_header",
hdrs = ["public/pw_build/internal/test_header_with_dep.h"],
strip_include_prefix = "public",
)
cc_library(
name = "sandbox_test_invisible_header",
hdrs = ["public/pw_build/internal/test_header_without_dep.h"],
strip_include_prefix = "public",
)
pw_cc_test(
name = "sandbox_test",
srcs = [
"absolute_path_source_file.cc",
"sandbox_absolute_source_test.cc",
"sandbox_test.cc",
],
defines = ["SANDBOX_ENABLED=1"],
deps = [":sandbox_test_visible_header"],
)
pw_string_list_comparison_test(
name = "simple_glob",
actual = glob_dirs(
["test_data/**"],
exclude = [
"test_data/pw_copy_and_patch_file/**",
"test_data/pw_rust_crates_extension/**",
],
),
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_string_list_comparison_test(
name = "no_match_subpackage",
actual = glob_dirs(
["test_data/glob_dirs/subpackage"],
allow_empty = True,
),
expected = [],
)
pw_bool_comparison_test(
name = "pigweed_is_root_test",
actual = pigweed_is_root(),
expected = True,
)
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",
)
pw_py_importable_runfile(
name = "test_runfile",
testonly = True,
src = "test_data/test_runfile.txt",
visibility = ["//pw_build:__subpackages__"],
)
pw_py_importable_runfile(
name = "test_runfile_remapped",
testonly = True,
src = "test_data/test_runfile.txt",
import_location = "pw_build.another_test_runfile",
visibility = ["//pw_build:__subpackages__"],
)
filegroup(
name = "doxygen",
srcs = [
"public/pw_build/linker_symbol.h",
"public/pw_build/must_place.ld.h",
],
)
sphinx_docs_library(
name = "docs",
srcs = [
"CMakeLists.txt",
"bazel.rst",
"bazel_constraints.rst",
"bazel_helpers.rst",
"bazel_rules.rst",
"docs.rst",
"gn.rst",
"linker_scripts.rst",
"pigweed.bazelrc",
"pigweed.cmake",
"pigweed_recommended.bazelrc",
"project_builder.rst",
"proto/pigweed_build_driver.proto",
"proto/workflows.proto",
"python.gni",
"python.rst",
"python_api.rst",
"python_gn_args.gni",
"security.rst",
"workflows_build_drivers.rst",
"workflows_launcher.rst",
"//pw_build/py:docs",
],
prefix = "pw_build/",
target_compatible_with = incompatible_with_mcu(),
)
# This target is used by the analysis tests in pw_pylint_test to confirm that
# pw_pylint.bzl is working.
py_console_script_binary(
name = "pw_pylint_test_test_target",
pkg = "@pigweed_python_packages//pylint",
script = "pylint",
tags = ["manual"],
visibility = ["//visibility:private"],
)
pw_pylint_test_suite(name = "pw_pylint_test")