`cargo wdk build` does not match `cargo build` behavior for workspaces
Noticed a bug in cargo-wdk when trying to build the samples
workspace.
Steps to repro:
-
cdinto Windows-rust-driver-samples\general\echo - Run
cargo build. It successfully builds the entire workspace - Run
cargo wdk build. It fails with the below error:
ERROR No valid rust projects in the current working directory: \?\C:\Users\svasista\Documents\Rust\svasista-ms\Windows-rust-driver-samples\general\echo`
As per our discussion, one solution may be to peek into the members section of the workspace-level Cargo.toml and locate member projects instead of blindly enumerating sub-dirs in the workspace.
The issue is caused because cargo-wdk assumes that current working directory could be a parent directory of an emulated workspace as soon as it fails to find a Cargo.toml in it cargo-wdk/src/actions/build/mod.rs#L136.
cargo_metadata can be used at the beginning of the build command to fetch useful metadata such as root_package, workspace_default_members.
If the command is run from a member crate (anywhere within the member crate) like path/to/project/ or path/to/project/src/, the root_package is resolved. For example,
DEBUG Resolved root: Some(PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/tools/dv/kmdf/fail_driver_pool_leak#0.1.0" }) DEBUG Target directory: "C:\\Users\\svasista\\Documents\\Rust\\svasista-ms\\Windows-rust-driver-samples\\target" DEBUG Workspace default members: WorkspaceDefaultMembers(Some([PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/tools/dv/kmdf/fail_driver_pool_leak#0.1.0" }])) DEBUG Workspace members: [PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/general/echo/kmdf/driver/DriverSync#[email protected]" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/general/echo/kmdf/exe#[email protected]" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/tools/dv/kmdf/fail_driver_pool_leak#0.1.0" }] DEBUG Workspace root: "C:\\Users\\svasista\\Documents\\Rust\\svasista-ms\\Windows-rust-driver-samples"
If the command is run from anywhere within a workspace, it has the following values set:
DEBUG Resolved root: None DEBUG Target directory: "C:\\Users\\svasista\\Documents\\Rust\\svasista-ms\\Windows-rust-driver-samples\\target" DEBUG Workspace default members: WorkspaceDefaultMembers(Some([PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/general/echo/kmdf/driver/DriverSync#[email protected]" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/general/echo/kmdf/exe#[email protected]" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/tools/dv/kmdf/fail_driver_pool_leak#0.1.0" }])) DEBUG Workspace members: [PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/general/echo/kmdf/driver/DriverSync#[email protected]" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/general/echo/kmdf/exe#[email protected]" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/Windows-rust-driver-samples/tools/dv/kmdf/fail_driver_pool_leak#0.1.0" }] DEBUG Workspace root: "C:\\Users\\svasista\\Documents\\Rust\\svasista-ms\\Windows-rust-driver-samples"
Depending on the resolve and WorkspaceDefaultMembers may appear as an option. But, it fails in case of examples and tests folders in WDR where each folder in these directories are separate workspaces, but they are part of the WDR workspace themselves. Running cargo-metadata here gives the following:
DEBUG Resolved root: None DEBUG Target directory: "C:\\Users\\svasista\\Documents\\Rust\\svasista-ms\\windows-drivers-rs\\target" DEBUG Workspace default members: WorkspaceDefaultMembers(Some([PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/cargo-wdk#0.0.1" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-build#0.4.0" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk#0.3.1" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-sys#0.4.0" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-macros#0.4.0" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-alloc#0.3.1" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-panic#0.3.1" }])) DEBUG Workspace members: [PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/cargo-wdk#0.0.1" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-build#0.4.0" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk#0.3.1" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-sys#0.4.0" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-macros#0.4.0" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-alloc#0.3.1" }, PackageId { repr: "path+file:///C:/Users/svasista/Documents/Rust/svasista-ms/windows-drivers-rs/crates/wdk-panic#0.3.1" }] DEBUG Workspace root: "C:\\Users\\svasista\\Documents\\Rust\\svasista-ms\\windows-drivers-rs"
Note that resolved root is still None and workspace root, default members and members are the same as the WDR workspace. In this case, cargo-wdk is expected to process them as individual workspaces.
Running cargo-metadata and Looking for Cargo.toml don't seem like cure-all options. Please let me know if I'm missing anything.