| # Toolchain and Infrastructure | |
| This repository uses a pinned, hermetic toolchain managed via CIPD | |
| ([`infra/cipd.ensure`](../infra/cipd.ensure)) for compiling, testing, and | |
| formatting code. The toolchain versions (Rust, Clang/LLVM, GCC, and `bindgen`) | |
| are kept in sync with the `fuchsia.git` toolchain. | |
| ## Setting Up the Environment | |
| Before compiling, testing, or formatting code in this repository, always set up | |
| the shell environment to use the `infra` versions of the toolchain rather than | |
| system-installed or `rustup` (`~/.cargo/bin`) tools: | |
| * **Bash / Zsh**: | |
| ```bash | |
| source infra/env_setup.sh | |
| ``` | |
| * **Fish**: | |
| ```fish | |
| source infra/env_setup.fish | |
| ``` | |
| Sourcing these scripts ensures the CIPD packages are present in | |
| `infra/packages` and prepends `infra/packages/bin` and `infra/packages` to | |
| `PATH`. | |
| > **Note for AI Agents:** Always ensure `infra/env_setup.sh` is sourced (or | |
| > `infra/packages/bin` is prepended to `PATH`) before running `cargo` or other | |
| > build/test commands so that you use the `infra` versions of the toolchain. | |
| ## Building and Testing Rust Crates | |
| The Rust workspace is located in the [`rust/`](../rust/) directory. When running | |
| `cargo` commands from the repository root, pass `--manifest-path rust/Cargo.toml` | |
| (or run `cargo` from within the `rust/` directory): | |
| ```bash | |
| cargo build --manifest-path rust/Cargo.toml | |
| cargo test --manifest-path rust/Cargo.toml | |
| ``` | |
| ## Formatting Code (`cargo fmt`) | |
| Always use **`cargo fmt`** instead of invoking `rustfmt` directly in this | |
| repository: | |
| ```bash | |
| # From the repository root: | |
| cargo fmt --manifest-path rust/Cargo.toml | |
| # Or from within the rust/ directory: | |
| cargo fmt | |
| ``` | |
| To check formatting without modifying files (as done in presubmit): | |
| ```bash | |
| cargo fmt --manifest-path rust/Cargo.toml -- --check | |
| ``` | |
| ### Why `cargo fmt` instead of `rustfmt`? | |
| * **Toolchain consistency:** `cargo fmt` (when run with the `infra` versions of | |
| the toolchain) uses the pinned `rustfmt` binary from `infra/packages/bin` | |
| rather than a host `rustup` binary. | |
| * **Configuration discovery:** `cargo fmt` automatically locates and applies | |
| [`rust/rustfmt.toml`](../rust/rustfmt.toml), which configures edition `2024` | |
| and nightly formatting options (`wrap_comments = true`, | |
| `use_small_heuristics = "Max"`, etc.) that match downstream repositories. | |
| Running `rustfmt` directly on individual files can miss these settings or fail | |
| on unstable options if the wrong binary is invoked. |