openprot is built with Bazel and driven through Pigweed's workflow launcher. The repository is a Bazel module (MODULE.bazel); there is no Cargo workspace. All everyday tasks go through either ./pw <group> or bazel directly.
./pw)./pw is a thin wrapper around bazelisk run //:pw -- "$@". It dispatches to one of the named groups defined in workflows.json:
./pw presubmit # format check + presubmit_checks analyzer + clippy ./pw format # apply rustfmt / black / buildifier / clang-format ./pw default # wildcard build (//... minus //third_party/caliptra/...) ./pw ci # run CI tests (skips hardware + verilator targets) ./pw upstream_pigweed # ci tests + Earlgrey verilator tests
./pw presubmit is what you run before every commit. It is also the gate on CI.
Use bazelisk (the wrapper accepts every standard bazel flag).
bazel test //... # host tests bazel build //... --build_tag_filters=-hardware,-disabled # practical build bazel build //... --build_tag_filters=-hardware,-disabled,-verilator bazel test //path/to:target_name # single target
The tag filters above are not optional for a wildcard build: //... includes hardware-only and verilator targets that will fail on a developer machine without the matching environment. The ci and default workflows already apply these filters.
Note that //third_party/caliptra/... is intentionally excluded from wildcard builds (see workflows.json:34, :55, :78). The Caliptra crate-universe workspaces collide with the host workspace when both are built unconditionally; build into Caliptra paths explicitly when you need them.
Clippy runs as a rules_rust aspect, not as a separate target:
bazelisk build \ --aspects=@rules_rust//rust:defs.bzl%rust_clippy_aspect \ --output_groups=clippy_checks \ //... -//third_party/caliptra/...
./pw presubmit invokes the same aspect via the clippy build entry.
mdbook sources live under docs/. Build with:
bazel build //docs
Targets can carry tags that gate which environment they run in. The common ones used in this tree are:
hardware — requires real silicon; never built locally.verilator — requires a verilator simulator install.disabled — temporarily excluded.manual — never built by //...; only when explicitly named.kernel — pw_kernel-bound system images and supporting targets.Combine these via --build_tag_filters (build-time) and --test_tag_filters (test-time). The workflows.json file is the canonical reference for which filters each workflow applies.