blob: ae2ebacc99938c1b812090d28bea7c27a9ea8f96 [file]
.. _module-pw_build-bazel_helpers:
===========================
Miscellaneous Bazel helpers
===========================
.. pigweed-module-subpage::
:name: pw_build
This page documents miscellaneous Bazel-related helpers that don't fall into
the categories of rules or constraints.
-------------
Build targets
-------------
.. _module-pw_build-bazel-empty_cc_library:
``@pigweed//pw_build:empty_cc_library``
=======================================
This empty library is used as a placeholder for label flags that need to point
to a ``cc_library`` of some kind, but don't actually need the dependency to
amount to anything.
.. note::
Prefer ``@rules_cc//:empty_lib`` in most cases. This will eventually
redirect to the utility stub in ``@rules_cc``.
``@pigweed//pw_build:default_link_extra_lib``
=============================================
This library groups together all libraries commonly required at link time by
Pigweed modules. See :ref:`docs-build_system-bazel_link-extra-lib` for more
details.
``@pigweed//pw_build:unspecified_backend``
==========================================
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.
----------------------
Starlark helper macros
----------------------
These helper macros offer convenient ways to express values for various rule
attributes. These strive to provide ALL of the following benefits:
* **Clarify intent.** While ``select`` statements are fundamental building
blocks, their meaning can be obscured by the syntax. Macros should improve
readability of the intent of the produced value.
* **Reduce unnecessary verbosity.** Some expressions require significant boiler
plate to spell out. Macros should never be more verbose than what they
replace.
* **Scale better.** Some macros opaquely embed values or parameterize incoming
choices to improve scalability of common patterns. This makes it easier
to adjust implementation details over time across many different uses of the
pattern.
Platform-based flag merging
===========================
Macros that help with using platform-based flags are in
``//pw_build:merge_flags.bzl``. These are useful, for example, when you wish to
:ref:`docs-bazel-compatibility-facade-backend-dict`.
incompatible_with_mcu
---------------------
A ``target_compatible_with`` compatibility helper that tags targets as
fundamentally incompatible with MCUs (e.g. Python tooling, Java code,
JavaScript/TypeScript code).
glob_dirs
=========
A starlark helper for performing ``glob()`` operations strictly on directories.
.. py:function:: glob_dirs(include: List[str], exclude: List[str] = [], allow_empty: bool = True) -> List[str]
Matches the provided glob pattern to identify a list of directories.
This helper follows the same semantics as Bazel's native ``glob()`` function,
but only matches directories.
Args:
include: A list of wildcard patterns to match against.
exclude: A list of wildcard patterns to exclude.
allow_empty: Whether or not to permit an empty list of matches.
Returns:
List of directory paths that match the specified constraints.
match_dir
=========
A starlark helper for using a wildcard pattern to match a single directory
.. py:function:: match_dir(include: List[str], exclude: List[str] = [], allow_empty: bool = True) -> Optional[str]
Identifies a single directory using a wildcard pattern.
This helper follows the same semantics as Bazel's native ``glob()`` function,
but only matches a single directory. If more than one match is found, this
will fail.
Args:
include: A list of wildcard patterns to match against.
exclude: A list of wildcard patterns to exclude.
allow_empty: Whether or not to permit returning ``None``.
Returns:
Path to a single directory that matches the specified constraints, or
``None`` if no match is found and ``allow_empty`` is ``True``.
----------------
bazelrc snippets
----------------
Due to Bazel's ever-evolving nature, Pigweed requires some flags to work as
intended in bazel-based projects. The flags are split into two categories:
the first category is flags that **must** be set for Pigweed to work as
intended, and the other category is flags that are highly recommended to
improve your project's Bazel experience.
For more information, see how to
:ref:`docs-bazel-integration-add-pigweed-as-a-dependency`.
-----------------
Credential Helper
-----------------
``pw_build/cred_helper.sh`` is used by Google projects to support features
that require authentication.