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

Next steps#

Start using Pigweed modules or static and runtime analysis!