Set up Pigweed as an external dependency#
Pigweed only supports bzlmod based projects. WORKSPACE based projects are no longer supported.
Add Pigweed as a bazel_dep
with a git_override
:
bazel_dep(name = "pigweed")
git_override(
module_name = "pigweed",
commit = "c00e9e430addee0c8add16c32eb6d8ab94189b9e",
remote = "https://pigweed.googlesource.com/pigweed/pigweed.git",
)
You can find the latest tip-of-tree commit in the History tab in CodeSearch.
Pigweed is not yet published to the Bazel Central Registry. If this is a pain point for you, please reach out to us on chat.
Alternative: Add Pigweed as Git submodule#
If you manage your dependencies as submodules, you can add Pigweed as a
submodule, too, and then add it to your MODULE.bazel
as a
local_path_override:
local_path_override(
module_name = "pigweed",
path = "third_party/pigweed",
)
Note
If you put external Bazel modules like Pigweed as submodules within
your source tree (e.g. under third_party/
), remember to add them
to your .bazelignore
file so that Bazel knows they’re third-party!
Set the required Bazel flags#
Pigweed projects need to set certain flags in their .bazelrc
. These
generally pre-adopt Bazel features that will become default in the future and
improve cache performance, disambiguate Python imports, etc. These flags are
listed below. Unfortunately there’s no way to automatically import them, see
b/353750350.
# Copyright 2024 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.
# Standard Pigweed flags
# ======================
# All Pigweed projects are expected to set these flags. They mostly pre-adopt
# future Bazel settings, and most are critical to working around known issues.
#
# The source of truth for these flags is @pigweed//pw_build:pigweed.bazelrc in
# the main Pigweed repo.
# Don't automatically create __init__.py files.
#
# This prevents spurious package name collisions at import time, and should be
# the default (https://github.com/bazelbuild/bazel/issues/7386). Pigweed's
# Python libraries break without this.
common --incompatible_default_to_explicit_init_py
# Do not attempt to configure an autodetected (local) toolchain. We vendor all
# our toolchains, and CI VMs may not have any local toolchain to detect.
common --repo_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1
# Don't propagate flags or defines to the exec config. This will become the
# default one day (https://github.com/bazelbuild/bazel/issues/22457) and will
# improve cache hit rates between builds targeting different platforms. This is
# especially impactful for large host tools like protoc, which will have its
# cache invalidated when your host C++ config changes, causing many rebuilds
# of protoc (https://pwbug.dev/315871648).
common --experimental_exclude_defines_from_exec_config
common --experimental_exclude_starlark_flags_from_exec_config
# Enforces consistent action environment variables. This is important to
# address Protobuf's rebuild sensitivity on changes to the environment
# variables. It also improves cache hit rates. Should be true by default one
# day (https://github.com/bazelbuild/bazel/issues/7026).
build --incompatible_strict_action_env
# TODO: https://github.com/bazelbuild/rules_python/issues/2515 - This flag was
# enabled with Bazel 8.0.0, but it breaks py_proto_library imports when using
# the latest release of rules_python (1.0.0). Flipping this flag is a temporary
# workaround.
common --legacy_external_runfiles=True
# Ensures `--run_under` is treated as an exec platform binary.
# This ensures when targeting `--platform=foo`, a `--run_under` test runner
# will be built for the host. This was originally intended to be flipped in
# Bazel 8.0.0, but didn't quite make the cut.
# Also see: https://github.com/bazelbuild/bazel/issues/23179
common --incompatible_bazel_test_exec_run_under=True
Set the recommended Bazel flags#
While these flags are not required to use Pigweed, they significantly improve Bazel’s usability. Turn these on, selectively tuning them to your needs. Unfortunately there’s no way to automatically import them, see b/353750350.
# Copyright 2025 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.
# These flags are highly recommended. If you turn any off, you might have a
# worse experience, but things shouldn't break in inscrutable ways.
# UX flags
# ========
# Improve debugability by printing all arguments for failing commands.
common --verbose_failures
# Suppress the DEBUG: log messages from bazel. We get lots of spammy DEBUG:
# messages from our third-party dependencies.
build --ui_event_filters=-debug
# Specifies desired output mode for running tests.
# Valid values are
# 'summary' to output only test status summary
# 'errors' to also print test logs for failed tests
# 'all' to print logs for all tests
# 'streamed' to output logs for all tests in real time
# (this will force tests to be executed locally one at a time regardless
# of --test_strategy value).
# See more at https://bazel.build/docs/user-manual#test-output.
test --test_output=errors
# C++ related flags
# =================
# Do not strip debug symbols by default.
common --strip=never
# Silence all C/C++ warnings in external code and externally generated code.
#
# Note that this will not silence warnings from external headers #include'd in
# first-party code.
common --per_file_copt=external/.*,.*\.pb\.cc@-w
common --host_per_file_copt=external/.*,.*\.pb\.cc@-w
# Names the platform-specific output directories in `bazel-out/` after their
# associated platform.
#
# These names are used by Pigweed's IDE integration to surface available views
# for code intelligence.
#
# Warning: This can cause confusing conflicts in C++ compile actions if there's
# any intermixing of the well-known host platform definitions. More info:
# https://github.com/bazelbuild/bazel/issues/26228
common --experimental_platform_in_output_dir=True
# Respect the CIPD cache directory environment variable, if set.
common --repo_env=CIPD_CACHE_DIR