From ab2e93b9f1e09d758e2291d8a954e16eda583e58 Mon Sep 17 00:00:00 2001 From: ruv Date: Sat, 25 Apr 2026 19:43:08 -0400 Subject: [PATCH] fix(workspace): unblock --no-default-features build on Windows (#366, #415) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mat, sensing-server, and train all depended on signal with default features enabled, which pulled ndarray-linalg → openblas-src → vcpkg/system-BLAS through the entire workspace. --no-default-features at the workspace root could not opt out of BLAS, breaking cargo build / cargo test on Windows without vcpkg. Set default-features = false on the signal dep in all three consumers so the flag actually propagates. Also gate signal::ruvsense::field_model::tests ::test_estimate_occupancy_noise_only with #[cfg(feature = "eigenvalue")] — the test unwraps a NotCalibrated stub when eigenvalue is compiled out. Validated: cargo test --workspace --no-default-features → 1,538 passed, 0 failed, 8 ignored. ESP32-S3 on COM7 still streams live CSI. Co-Authored-By: claude-flow --- CHANGELOG.md | 15 +++++++++++++++ rust-port/wifi-densepose-rs/Cargo.lock | 1 + .../crates/wifi-densepose-mat/Cargo.toml | 2 +- .../wifi-densepose-sensing-server/Cargo.toml | 7 +++++-- .../src/ruvsense/field_model.rs | 3 +++ .../crates/wifi-densepose-train/Cargo.toml | 2 +- 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b789cbf8..b9e5ea88a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- **Rust workspace build with `--no-default-features` on Windows** (#366, #415) — + `wifi-densepose-mat`, `wifi-densepose-sensing-server`, and `wifi-densepose-train` + all depended on `wifi-densepose-signal` with default features enabled, which + pulled `ndarray-linalg` → `openblas-src` → vcpkg/system-BLAS through the entire + workspace. `--no-default-features` at the workspace root then could not opt out + of BLAS, breaking `cargo build` / `cargo test` on Windows without vcpkg. All + three consumers now declare `wifi-densepose-signal = { ..., default-features = false }`, + so `cargo test --workspace --no-default-features` builds cleanly without + vcpkg/openblas. Validated: 1,538 tests pass, 0 fail, 8 ignored. +- **`signal` test `test_estimate_occupancy_noise_only` failed without `eigenvalue`** — + The test unwrapped the `NotCalibrated` stub returned when the BLAS-backed + `estimate_occupancy` is compiled out. Gated with `#[cfg(feature = "eigenvalue")]` + so it only runs when the real implementation is available. + ## [v0.6.2-esp32] — 2026-04-20 Firmware release cutting ADR-081 and the Timer Svc stack fix discovered during diff --git a/rust-port/wifi-densepose-rs/Cargo.lock b/rust-port/wifi-densepose-rs/Cargo.lock index caf1b0f2c..3697d694b 100644 --- a/rust-port/wifi-densepose-rs/Cargo.lock +++ b/rust-port/wifi-densepose-rs/Cargo.lock @@ -7979,6 +7979,7 @@ dependencies = [ "chrono", "clap", "futures-util", + "ruvector-mincut", "serde", "serde_json", "tempfile", diff --git a/rust-port/wifi-densepose-rs/crates/wifi-densepose-mat/Cargo.toml b/rust-port/wifi-densepose-rs/crates/wifi-densepose-mat/Cargo.toml index bae84f0b8..59f302016 100644 --- a/rust-port/wifi-densepose-rs/crates/wifi-densepose-mat/Cargo.toml +++ b/rust-port/wifi-densepose-rs/crates/wifi-densepose-mat/Cargo.toml @@ -25,7 +25,7 @@ serde = ["dep:serde", "chrono/serde", "geo/use-serde"] [dependencies] # Workspace dependencies wifi-densepose-core = { version = "0.3.0", path = "../wifi-densepose-core" } -wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal" } +wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false } wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn" } ruvector-solver = { workspace = true, optional = true } ruvector-temporal-tensor = { workspace = true, optional = true } diff --git a/rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/Cargo.toml b/rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/Cargo.toml index e76c49fa0..0647e8e9d 100644 --- a/rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/Cargo.toml +++ b/rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/Cargo.toml @@ -44,8 +44,11 @@ clap = { workspace = true } # Multi-BSSID WiFi scanning pipeline (ADR-022 Phase 3) wifi-densepose-wifiscan = { version = "0.3.0", path = "../wifi-densepose-wifiscan" } -# Signal processing with RuvSense pose tracker (accuracy sprint) -wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal" } +# Signal processing with RuvSense pose tracker (accuracy sprint). +# default-features = false drops the optional ndarray-linalg/BLAS chain so that +# `--no-default-features` at the workspace root can produce a Windows-friendly +# build without vcpkg/openblas (issue #366, #415). +wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false } [dev-dependencies] tempfile = "3.10" diff --git a/rust-port/wifi-densepose-rs/crates/wifi-densepose-signal/src/ruvsense/field_model.rs b/rust-port/wifi-densepose-rs/crates/wifi-densepose-signal/src/ruvsense/field_model.rs index 028c772db..2508962c3 100644 --- a/rust-port/wifi-densepose-rs/crates/wifi-densepose-signal/src/ruvsense/field_model.rs +++ b/rust-port/wifi-densepose-rs/crates/wifi-densepose-signal/src/ruvsense/field_model.rs @@ -1232,6 +1232,9 @@ mod tests { } } + // estimate_occupancy() falls back to a NotCalibrated stub without the + // `eigenvalue` feature, so this test only makes sense with BLAS enabled. + #[cfg(feature = "eigenvalue")] #[test] fn test_estimate_occupancy_noise_only() { let config = FieldModelConfig { diff --git a/rust-port/wifi-densepose-rs/crates/wifi-densepose-train/Cargo.toml b/rust-port/wifi-densepose-rs/crates/wifi-densepose-train/Cargo.toml index fbe901af9..ac0fa37d8 100644 --- a/rust-port/wifi-densepose-rs/crates/wifi-densepose-train/Cargo.toml +++ b/rust-port/wifi-densepose-rs/crates/wifi-densepose-train/Cargo.toml @@ -27,7 +27,7 @@ cuda = ["tch-backend"] [dependencies] # Internal crates -wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal" } +wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false } wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn" } # Core