# Dev shell: the rust toolchain plus the exact native build inputs # the crane derivations use (git, sqlite, pkg-config, cmake — see # ../rust.nix), so a plain `cargo build` / `cargo test` in the shell # sees the same toolchain shape as CI. { pkgs, rust }: { default = pkgs.mkShell { # Same list the daemons are handed and the same one `checks.nix` gives # the test derivation — `nix/reserved-names.nix`. Without it here, a # plain `cargo test` in the shell would panic on the drift test, so a # developer's local run and CI would disagree about a test that exists # precisely to stop two spellings of one fact from drifting. HIVE_RESERVED_NAMES = pkgs.lib.concatStringsSep " " (import ./reserved-names.nix); packages = rust.nativeBuildInputs ++ (with pkgs; [ cargo cargo-llvm-cov clippy rust-analyzer rustc rustfmt ]); # `cargo llvm-cov` shells out to `llvm-profdata` and `llvm-cov`, # which it expects to find as rustup's `llvm-tools-preview` beside # the rustc toolchain. Nixpkgs has no such component, so without # these it aborts with "failed to find llvm-tools-preview" — a # message that reads like a missing install rather than a path the # shell simply has to name. # # ⚠️ Both the variable names and the package were wrong on the first # attempt and only the tool itself said so: it reads `LLVM_COV` / # `LLVM_PROFDATA` (no `_PATH` suffix), and the binaries live in # `llvmPackages.llvm` — `llvmPackages.bintools` is the linker # wrapper and ships neither. # # Coverage is deliberately NOT part of `nix flake check`: an # instrumented build cannot reuse the normal test artifacts, so it # roughly doubles a test job. It runs on manual dispatch — see # .forgejo/workflows/coverage.yml for why that rather than nightly. LLVM_PROFDATA = "${pkgs.llvmPackages.llvm}/bin/llvm-profdata"; LLVM_COV = "${pkgs.llvmPackages.llvm}/bin/llvm-cov"; }; }