From 6bfd1d00e1d1b318f03b7943eca9fe2845e3df1a Mon Sep 17 00:00:00 2001 From: Shravan Vasista Date: Tue, 12 May 2026 14:34:41 +0530 Subject: [PATCH 1/4] feat: add manifest options support for cargo build invocations --- .../cargo-wdk/src/actions/build/build_task.rs | 109 +++++++++++++++++- crates/cargo-wdk/src/actions/build/mod.rs | 10 +- crates/cargo-wdk/src/actions/build/tests.rs | 87 +++++++++++--- crates/cargo-wdk/src/actions/mod.rs | 29 +++++ crates/cargo-wdk/src/cli.rs | 5 + 5 files changed, 223 insertions(+), 17 deletions(-) diff --git a/crates/cargo-wdk/src/actions/build/build_task.rs b/crates/cargo-wdk/src/actions/build/build_task.rs index e45b63316..e97452d45 100644 --- a/crates/cargo-wdk/src/actions/build/build_task.rs +++ b/crates/cargo-wdk/src/actions/build/build_task.rs @@ -16,7 +16,7 @@ use wdk_build::CpuArchitecture; #[double] use crate::providers::exec::CommandExec; use crate::{ - actions::{Profile, build::error::BuildTaskError, to_target_triple}, + actions::{ManifestOptions, Profile, build::error::BuildTaskError, to_target_triple}, providers::error::CommandError, trace, }; @@ -27,6 +27,7 @@ pub struct BuildTask<'a> { profile: Option<&'a Profile>, target_arch: Option, verbosity_level: clap_verbosity_flag::Verbosity, + manifest_options: ManifestOptions, manifest_path: PathBuf, command_exec: &'a CommandExec, working_dir: &'a Path, @@ -41,6 +42,8 @@ impl<'a> BuildTask<'a> { /// * `profile` - An optional profile for the build /// * `target_arch` - The target architecture for the build /// * `verbosity_level` - The verbosity level for logging + /// * `manifest_options` - Cargo manifest options (`--locked`, `--frozen`, + /// `--offline`) to forward to the underlying `cargo build` invocation /// * `command_exec` - The command execution provider /// /// # Returns @@ -54,6 +57,7 @@ impl<'a> BuildTask<'a> { profile: Option<&'a Profile>, target_arch: Option, verbosity_level: clap_verbosity_flag::Verbosity, + manifest_options: ManifestOptions, command_exec: &'a CommandExec, ) -> Self { assert!( @@ -66,6 +70,7 @@ impl<'a> BuildTask<'a> { profile, target_arch, verbosity_level, + manifest_options, manifest_path: working_dir.join("Cargo.toml"), command_exec, working_dir, @@ -109,6 +114,7 @@ impl<'a> BuildTask<'a> { args.push("--target".to_string()); args.push(to_target_triple(target_arch)); } + args.extend(self.manifest_options.cargo_args().map(String::from)); if let Some(flag) = trace::get_cargo_verbose_flags(self.verbosity_level) { args.push(flag.to_string()); } @@ -149,7 +155,7 @@ mod tests { use super::*; use crate::{ - actions::Profile, + actions::{ManifestOptions, Profile}, providers::{error::CommandError, exec::MockCommandExec}, }; @@ -168,6 +174,7 @@ mod tests { Some(&profile), target_arch, verbosity_level, + ManifestOptions::default(), &command_exec, ); @@ -201,6 +208,7 @@ mod tests { profile.as_ref(), target_arch, verbosity_level, + ManifestOptions::default(), &command_exec, ); } @@ -257,6 +265,7 @@ mod tests { Some(&profile), Some(target_arch), verbosity, + ManifestOptions::default(), &mock, ); @@ -298,6 +307,7 @@ mod tests { None, None, clap_verbosity_flag::Verbosity::default(), + ManifestOptions::default(), &mock, ); @@ -339,6 +349,7 @@ mod tests { None, None, clap_verbosity_flag::Verbosity::default(), + ManifestOptions::default(), &mock, ); @@ -356,4 +367,98 @@ mod tests { ); assert_eq!(io_err.kind(), std::io::ErrorKind::NotFound); } + + #[test] + fn run_forwards_manifest_options_to_cargo_invocations_in_build_task() { + let working_dir = PathBuf::from("C:/abs/driver"); + let manifest_options = ManifestOptions { + frozen: true, + locked: true, + offline: true, + }; + let mut expected_stdout = br#"{"reason":"build-finished","success":true}"#.to_vec(); + expected_stdout.push(b'\n'); + let expected_stdout_for_mock = expected_stdout.clone(); + + let mut mock = MockCommandExec::new(); + mock.expect_run() + .withf(|command, args, _env, _wd| { + command == "cargo" + && args.contains(&"--frozen") + && args.contains(&"--locked") + && args.contains(&"--offline") + && { + // Confirm fixed ordering: locked before offline before frozen + let locked_idx = args.iter().position(|a| *a == "--locked").unwrap(); + let offline_idx = args.iter().position(|a| *a == "--offline").unwrap(); + let frozen_idx = args.iter().position(|a| *a == "--frozen").unwrap(); + locked_idx < offline_idx && offline_idx < frozen_idx + } + }) + .return_once(move |_, _, _, _| { + Ok(Output { + status: ExitStatus::default(), + stdout: expected_stdout_for_mock, + stderr: Vec::new(), + }) + }); + + let task = BuildTask::new( + "my-driver", + &working_dir, + None, + None, + clap_verbosity_flag::Verbosity::default(), + manifest_options, + &mock, + ); + + task.run() + .expect("expected an iterator over parsed cargo message objects") + .collect::, _>>() + .expect("expected valid cargo messages"); + } + + #[test] + fn run_forwards_locked_only_when_only_locked_is_set() { + let working_dir = PathBuf::from("C:/abs/driver"); + let manifest_options = ManifestOptions { + locked: true, + ..ManifestOptions::default() + }; + let mut expected_stdout = br#"{"reason":"build-finished","success":true}"#.to_vec(); + expected_stdout.push(b'\n'); + let expected_stdout_for_mock = expected_stdout.clone(); + + let mut mock = MockCommandExec::new(); + mock.expect_run() + .withf(|command, args, _env, _wd| { + command == "cargo" + && args.contains(&"--locked") + && !args.contains(&"--frozen") + && !args.contains(&"--offline") + }) + .return_once(move |_, _, _, _| { + Ok(Output { + status: ExitStatus::default(), + stdout: expected_stdout_for_mock, + stderr: Vec::new(), + }) + }); + + let task = BuildTask::new( + "my-driver", + &working_dir, + None, + None, + clap_verbosity_flag::Verbosity::default(), + manifest_options, + &mock, + ); + + task.run() + .expect("expected an iterator over parsed cargo message objects") + .collect::, _>>() + .expect("expected valid cargo messages"); + } } diff --git a/crates/cargo-wdk/src/actions/build/mod.rs b/crates/cargo-wdk/src/actions/build/mod.rs index ad1d9159c..9e82721b3 100644 --- a/crates/cargo-wdk/src/actions/build/mod.rs +++ b/crates/cargo-wdk/src/actions/build/mod.rs @@ -29,7 +29,7 @@ use wdk_build::{ metadata::{TryFromCargoMetadataError, Wdk}, }; -use crate::actions::Profile; +use crate::actions::{ManifestOptions, Profile}; #[double] use crate::providers::{exec::CommandExec, fs::Fs, metadata::Metadata, wdk_build::WdkBuild}; @@ -40,6 +40,7 @@ pub struct BuildActionParams<'a> { pub verify_signature: bool, pub is_sample_class: bool, pub verbosity_level: clap_verbosity_flag::Verbosity, + pub manifest_options: ManifestOptions, } /// Action that orchestrates the build and package of a driver project. Build is @@ -51,6 +52,7 @@ pub struct BuildAction<'a> { verify_signature: bool, is_sample_class: bool, verbosity_level: clap_verbosity_flag::Verbosity, + manifest_options: ManifestOptions, // Injected deps wdk_build: &'a WdkBuild, @@ -92,6 +94,7 @@ impl<'a> BuildAction<'a> { verify_signature: params.verify_signature, is_sample_class: params.is_sample_class, verbosity_level: params.verbosity_level, + manifest_options: params.manifest_options, wdk_build, command_exec, fs, @@ -336,6 +339,7 @@ impl<'a> BuildAction<'a> { self.profile, self.target_arch, self.verbosity_level, + self.manifest_options, self.command_exec, ); let output_message_iter = build_task.run()?; @@ -502,7 +506,9 @@ impl<'a> BuildAction<'a> { &self, working_dir: &Path, ) -> Result { - let args = ["rustc", "--", "--print", "cfg"]; + let mut args: Vec<&str> = vec!["rustc"]; + args.extend(self.manifest_options.cargo_args()); + args.extend(["--", "--print", "cfg"]); let output = self .command_exec .run("cargo", &args, None, Some(working_dir))?; diff --git a/crates/cargo-wdk/src/actions/build/tests.rs b/crates/cargo-wdk/src/actions/build/tests.rs index 6bb4f9973..d36a2f8a9 100644 --- a/crates/cargo-wdk/src/actions/build/tests.rs +++ b/crates/cargo-wdk/src/actions/build/tests.rs @@ -28,6 +28,7 @@ use crate::providers::{ }; use crate::{ actions::{ + ManifestOptions, Profile, build::{BuildAction, BuildActionParams, error::BuildActionError}, to_target_triple, @@ -265,6 +266,49 @@ pub fn given_a_driver_project_when_verify_signature_is_true_then_it_builds_succe ); } +#[test] +pub fn given_a_driver_project_when_manifest_options_are_set_then_they_are_forwarded_to_cargo_invocations() + { + // Input CLI args + let cwd = PathBuf::from("C:\\tmp"); + let profile = None; + let target_arch = CpuArchitecture::Amd64; + let verify_signature = false; + let sample_class = false; + let manifest_options = ManifestOptions { + frozen: true, + locked: true, + offline: true, + }; + + // Driver project data + let driver_type = "KMDF"; + let driver_name = "sample-kmdf"; + let driver_version = "0.0.1"; + let wdk_metadata = get_cargo_metadata_wdk_metadata(driver_type, 1, 33); + let (workspace_member, package) = + get_cargo_metadata_package(&cwd, driver_name, driver_version, Some(&wdk_metadata)); + + let cargo_build_output = + create_cargo_build_output_json(driver_name, driver_version, &cwd, None, profile); + + let test_build_action = &TestBuildAction::new(cwd.clone(), profile, None, sample_class) + .with_manifest_options(manifest_options) + .set_up_standalone_driver_project((workspace_member, package)) + .expect_default_build_task_steps(driver_name, Some(cargo_build_output)) + .expect_probe_target_arch_using_cargo_rustc(&cwd, target_arch, None) + .expect_default_package_task_steps(driver_name, driver_type, target_arch, verify_signature); + + assert_build_action_run_with_env_is_success( + &cwd, + profile, + None, + verify_signature, + sample_class, + test_build_action, + ); +} + #[test] pub fn given_a_driver_project_when_self_signed_exists_then_it_should_skip_calling_makecert() { // Input CLI args @@ -1602,6 +1646,7 @@ fn initialize_build_action<'a>( verify_signature, is_sample_class: sample_class, verbosity_level: clap_verbosity_flag::Verbosity::new(1, 0), + manifest_options: test_build_action.manifest_options, }, test_build_action.mock_wdk_build_provider(), test_build_action.mock_run_command(), @@ -1662,6 +1707,7 @@ struct TestBuildAction { profile: Option, target_arch: Option, sample_class: bool, + manifest_options: ManifestOptions, cargo_metadata: Option, // mocks @@ -1688,6 +1734,7 @@ impl TestBuildAction { profile, target_arch, sample_class, + manifest_options: ManifestOptions::default(), mock_run_command, mock_wdk_build_provider, mock_fs_provider, @@ -1696,6 +1743,11 @@ impl TestBuildAction { } } + fn with_manifest_options(mut self, manifest_options: ManifestOptions) -> Self { + self.manifest_options = manifest_options; + self + } + fn set_up_standalone_driver_project( mut self, package_metadata: (TestMetadataWorkspaceMemberId, TestMetadataPackage), @@ -1954,6 +2006,8 @@ impl TestBuildAction { expected_cargo_build_args.push(to_target_triple(target_arch)); } + expected_cargo_build_args.extend(self.manifest_options.cargo_args().map(String::from)); + expected_cargo_build_args.push("-v".to_string()); let expected_output = override_output.unwrap_or_else(|| Output { status: ExitStatus::default(), @@ -1991,6 +2045,12 @@ impl TestBuildAction { CpuArchitecture::Amd64 => "x86_64", CpuArchitecture::Arm64 => "aarch64", }; + let mut expected_args: Vec = vec!["rustc".to_string()]; + expected_args.extend(self.manifest_options.cargo_args().map(String::from)); + expected_args.push("--".to_string()); + expected_args.push("--print".to_string()); + expected_args.push("cfg".to_string()); + let expected_args_for_err = expected_args.clone(); self.mock_run_command .expect_run() .withf( @@ -1999,24 +2059,25 @@ impl TestBuildAction { _env_vars: &Option<&HashMap<&str, &str>>, working_dir: &Option<&Path>| { command == "cargo" - && args == ["rustc", "--", "--print", "cfg"] + && args == expected_args && working_dir.is_some_and(|d| d == expected_working_dir.as_path()) }, ) .once() .returning(move |_, _, _, _| match override_output.clone() { - Some(output) => match output.status.code() { - Some(0) => Ok(Output { - status: ExitStatus::from_raw(0), - stdout: vec![], - stderr: vec![], - }), - _ => Err(CommandError::from_output( - "cargo", - &["rustc", "--", "--print", "cfg"], - &output, - )), - }, + Some(output) => { + if output.status.code() == Some(0) { + Ok(Output { + status: ExitStatus::from_raw(0), + stdout: vec![], + stderr: vec![], + }) + } else { + let err_args: Vec<&str> = + expected_args_for_err.iter().map(String::as_str).collect(); + Err(CommandError::from_output("cargo", &err_args, &output)) + } + } None => Ok(Output { status: ExitStatus::default(), stdout: format!("target_arch=\"{arch_str}\"\n").as_bytes().to_vec(), diff --git a/crates/cargo-wdk/src/actions/mod.rs b/crates/cargo-wdk/src/actions/mod.rs index 92197b781..7174c5a03 100644 --- a/crates/cargo-wdk/src/actions/mod.rs +++ b/crates/cargo-wdk/src/actions/mod.rs @@ -90,3 +90,32 @@ impl Display for DriverType { write!(f, "{s}") } } + +/// Cargo manifest options +#[derive(clap::Args, Clone, Copy, Debug, Default, PartialEq, Eq)] +#[command(next_help_heading = "Manifest Options")] +pub struct ManifestOptions { + /// Require Cargo.lock is up to date + #[arg(long)] + pub locked: bool, + /// Run without accessing the network + #[arg(long)] + pub offline: bool, + /// Require Cargo.lock and cache are up to date + #[arg(long)] + pub frozen: bool, +} + +impl ManifestOptions { + /// Returns an iterator over the cargo CLI flags equivalent to this set of + /// options. + pub fn cargo_args(&self) -> impl Iterator { + [ + self.locked.then_some("--locked"), + self.offline.then_some("--offline"), + self.frozen.then_some("--frozen"), + ] + .into_iter() + .flatten() + } +} diff --git a/crates/cargo-wdk/src/cli.rs b/crates/cargo-wdk/src/cli.rs index 907588363..a3345adcc 100644 --- a/crates/cargo-wdk/src/cli.rs +++ b/crates/cargo-wdk/src/cli.rs @@ -14,6 +14,7 @@ use wdk_build::CpuArchitecture; use crate::actions::{ DriverType, KMDF_STR, + ManifestOptions, Profile, UMDF_STR, WDM_STR, @@ -92,6 +93,9 @@ pub struct BuildArgs { /// Build sample class driver project #[arg(long)] pub sample: bool, + + #[command(flatten)] + pub manifest_options: ManifestOptions, } /// Subcommands @@ -169,6 +173,7 @@ impl Cli { verify_signature: cli_args.verify_signature, is_sample_class: cli_args.sample, verbosity_level: self.verbose, + manifest_options: cli_args.manifest_options, }, &wdk_build, &command_exec, From 311b721a43dfb33c7bc758f5020fe152a35f2158 Mon Sep 17 00:00:00 2001 From: Shravan Vasista Date: Wed, 13 May 2026 13:24:45 +0530 Subject: [PATCH 2/4] fix: modify `get_cargo_metadata_at_path` to accept additional command-line (manifest) options --- crates/cargo-wdk/src/actions/build/mod.rs | 3 +- crates/cargo-wdk/src/actions/build/tests.rs | 33 +++++++++++++++++++-- crates/cargo-wdk/src/providers/metadata.rs | 14 +++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/crates/cargo-wdk/src/actions/build/mod.rs b/crates/cargo-wdk/src/actions/build/mod.rs index 9e82721b3..4b4d00cc1 100644 --- a/crates/cargo-wdk/src/actions/build/mod.rs +++ b/crates/cargo-wdk/src/actions/build/mod.rs @@ -317,9 +317,10 @@ impl<'a> BuildAction<'a> { .to_string_lossy() .trim_start_matches("\\\\?\\") .into(); + let other_options: Vec<&str> = self.manifest_options.cargo_args().collect(); let cargo_metadata = self .metadata - .get_cargo_metadata_at_path(&working_dir_path_trimmed)?; + .get_cargo_metadata_at_path(&working_dir_path_trimmed, &other_options)?; Ok(cargo_metadata) } diff --git a/crates/cargo-wdk/src/actions/build/tests.rs b/crates/cargo-wdk/src/actions/build/tests.rs index d36a2f8a9..24f19ee43 100644 --- a/crates/cargo-wdk/src/actions/build/tests.rs +++ b/crates/cargo-wdk/src/actions/build/tests.rs @@ -1762,10 +1762,19 @@ impl TestBuildAction { serde_json::from_str::(&cargo_toml_metadata) .expect("Failed to parse cargo metadata in set_up_standalone_driver_project"); let cargo_toml_metadata_clone = cargo_toml_metadata.clone(); + let expected_options: Vec = self + .manifest_options + .cargo_args() + .map(String::from) + .collect(); self.mock_metadata_provider .expect_get_cargo_metadata_at_path() + .withf(move |_working_dir: &Path, other_options: &[&str]| { + let actual: Vec = other_options.iter().map(|s| (*s).to_string()).collect(); + actual == expected_options + }) .once() - .returning(move |_| Ok(cargo_toml_metadata_clone.clone())); + .returning(move |_, _| Ok(cargo_toml_metadata_clone.clone())); self.cargo_metadata = Some(cargo_toml_metadata); self } @@ -1791,10 +1800,19 @@ impl TestBuildAction { ) .expect("Failed to parse cargo metadata in set_up_workspace_with_multiple_driver_projects"); let cargo_toml_metadata_clone = cargo_toml_metadata.clone(); + let expected_options: Vec = self + .manifest_options + .cargo_args() + .map(String::from) + .collect(); self.mock_metadata_provider .expect_get_cargo_metadata_at_path() + .withf(move |_working_dir: &Path, other_options: &[&str]| { + let actual: Vec = other_options.iter().map(|s| (*s).to_string()).collect(); + actual == expected_options + }) .once() - .returning(move |_| Ok(cargo_toml_metadata_clone.clone())); + .returning(move |_, _| Ok(cargo_toml_metadata_clone.clone())); self.cargo_metadata = Some(cargo_toml_metadata); self } @@ -1804,10 +1822,19 @@ impl TestBuildAction { serde_json::from_str::(cargo_toml_metadata) .expect("Failed to parse cargo metadata in set_up_with_custom_toml"); let cargo_toml_metadata_clone = cargo_toml_metadata.clone(); + let expected_options: Vec = self + .manifest_options + .cargo_args() + .map(String::from) + .collect(); self.mock_metadata_provider .expect_get_cargo_metadata_at_path() + .withf(move |_working_dir: &Path, other_options: &[&str]| { + let actual: Vec = other_options.iter().map(|s| (*s).to_string()).collect(); + actual == expected_options + }) .once() - .returning(move |_| Ok(cargo_toml_metadata_clone.clone())); + .returning(move |_, _| Ok(cargo_toml_metadata_clone.clone())); self.cargo_metadata = Some(cargo_toml_metadata); self } diff --git a/crates/cargo-wdk/src/providers/metadata.rs b/crates/cargo-wdk/src/providers/metadata.rs index 7c9eb6be2..bfea8c6b6 100644 --- a/crates/cargo-wdk/src/providers/metadata.rs +++ b/crates/cargo-wdk/src/providers/metadata.rs @@ -30,6 +30,8 @@ impl Metadata { /// /// * `working_dir` - A reference to a `Path` that specifies the path to the /// working directory. + /// * `other_options` - Additional command-line flags to forward to `cargo + /// metadata` (e.g. `--locked`, `--offline`, `--frozen`). /// /// # Returns /// @@ -42,12 +44,20 @@ impl Metadata { /// /// This function will return an error if the `cargo metadata` command fails /// to execute or if the specified path is not a valid Cargo project. - pub fn get_cargo_metadata_at_path( + pub fn get_cargo_metadata_at_path<'a>( &self, - working_dir: &Path, + working_dir: &'a Path, + other_options: &'a [&'a str], ) -> cargo_metadata::Result { cargo_metadata::MetadataCommand::new() .current_dir(working_dir) + .other_options( + other_options + .iter() + .copied() + .map(String::from) + .collect::>(), + ) .exec() } } From d243ea17c5971396d855c2ea3373ec649b326f95 Mon Sep 17 00:00:00 2001 From: Shravan Vasista Date: Thu, 21 May 2026 09:53:49 +0530 Subject: [PATCH 3/4] feat: add support for additional cargo manifest options in README and tests --- crates/cargo-wdk/README.md | 13 ++++- crates/cargo-wdk/tests/build_command_test.rs | 53 +++++++++++++++----- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/crates/cargo-wdk/README.md b/crates/cargo-wdk/README.md index 450d0509f..e6dcdcc00 100644 --- a/crates/cargo-wdk/README.md +++ b/crates/cargo-wdk/README.md @@ -69,12 +69,17 @@ Options: --sample Build sample class driver project -h, --help Print help +Manifest Options: + --locked Require Cargo.lock is up to date + --offline Run without accessing the network + --frozen Require Cargo.lock and cache are up to date + Verbosity: -v, --verbose... Increase logging verbosity -q, --quiet... Decrease logging verbosity ``` -`build` takes a number of inputs specifying build profile (`dev` or `release`), target architecture (`amd64` or `arm64`), a flag enabling signature verification and a flag indicating a sample driver along with verbosity flags. +`build` takes a number of inputs specifying build profile (`dev` or `release`), target architecture (`amd64` or `arm64`), a flag enabling signature verification and a flag indicating a sample driver along with verbosity flags. It also accepts the cargo manifest flags `--locked`, `--offline` and `--frozen`, which are forwarded to the underlying `cargo` invocations (e.g. `cargo build`, `cargo metadata`). When the command completes the packaged driver artifacts are emitted at the path `target\\-package`. @@ -113,3 +118,9 @@ If the `--verify-signature` flag is provided, the signatures are verified after ```pwsh cargo wdk build --target-arch amd64 ``` + +- To build a driver project with a strict, reproducible dependency lockfile (e.g. for CI), navigate to the root of the project and run: + + ```pwsh + cargo wdk build --locked + ``` diff --git a/crates/cargo-wdk/tests/build_command_test.rs b/crates/cargo-wdk/tests/build_command_test.rs index 0d34a4aea..028a3dfd0 100644 --- a/crates/cargo-wdk/tests/build_command_test.rs +++ b/crates/cargo-wdk/tests/build_command_test.rs @@ -29,6 +29,7 @@ fn mixed_package_kmdf_workspace_builds_successfully() { None, None, None, + None, ); } @@ -64,14 +65,30 @@ fn kmdf_driver_builds_successfully() { assert!(output.status.success()); } - clean_build_and_verify_project("kmdf", driver, None, None, None, None, None, None); + clean_build_and_verify_project("kmdf", driver, None, None, None, None, None, None, None); +} + +#[test] +fn kmdf_driver_builds_successfully_with_offline_flag() { + let driver = "kmdf-driver"; + clean_build_and_verify_project( + "kmdf", + driver, + None, + None, + None, + None, + None, + None, + Some(&["--offline"]), + ); } #[test] fn kmdf_driver_cross_compiles_with_cli_option_successfully() { let driver = "kmdf-driver"; let target_arch = cross_compile_target_arch(); - let env_overrides = nuget_wdk_content_root_path(target_arch) + let env = nuget_wdk_content_root_path(target_arch) .map(|path| vec![(WDK_CONTENT_ROOT_ENV_VAR, Some(path))]); clean_build_and_verify_project( "kmdf", @@ -80,22 +97,23 @@ fn kmdf_driver_cross_compiles_with_cli_option_successfully() { None, Some(target_arch), None, - env_overrides.as_deref(), + env.as_deref(), Some(target_arch), + None, ); } #[test] fn umdf_driver_builds_successfully() { let driver = "umdf-driver"; - clean_build_and_verify_project("umdf", driver, None, None, None, None, None, None); + clean_build_and_verify_project("umdf", driver, None, None, None, None, None, None, None); } #[test] fn umdf_driver_cross_compiles_with_cli_option_successfully() { let driver = "umdf-driver"; let target_arch = cross_compile_target_arch(); - let env_overrides = nuget_wdk_content_root_path(target_arch) + let env = nuget_wdk_content_root_path(target_arch) .map(|path| vec![(WDK_CONTENT_ROOT_ENV_VAR, Some(path))]); clean_build_and_verify_project( "umdf", @@ -104,8 +122,9 @@ fn umdf_driver_cross_compiles_with_cli_option_successfully() { None, Some(target_arch), None, - env_overrides.as_deref(), + env.as_deref(), Some(target_arch), + None, ); } @@ -114,7 +133,7 @@ fn umdf_driver_with_target_arch_cli_option_and_release_profile_builds_successful let driver = "umdf-driver"; let target_arch = "ARM64"; let profile = "release"; - let env_overrides = nuget_wdk_content_root_path(target_arch) + let env = nuget_wdk_content_root_path(target_arch) .map(|path| vec![(WDK_CONTENT_ROOT_ENV_VAR, Some(path))]); clean_build_and_verify_project( "umdf", @@ -123,15 +142,16 @@ fn umdf_driver_with_target_arch_cli_option_and_release_profile_builds_successful None, Some(target_arch), Some(profile), - env_overrides.as_deref(), + env.as_deref(), Some(target_arch), + None, ); } #[test] fn wdm_driver_builds_successfully() { let driver = "wdm-driver"; - clean_build_and_verify_project("wdm", driver, None, None, None, None, None, None); + clean_build_and_verify_project("wdm", driver, None, None, None, None, None, None, None); } #[test] @@ -147,6 +167,7 @@ fn wdm_driver_builds_successfully_with_given_version() { None, Some(&env), None, + None, ); } @@ -154,7 +175,7 @@ fn wdm_driver_builds_successfully_with_given_version() { fn wdm_driver_cross_compiles_with_cli_option_successfully() { let driver = "wdm-driver"; let target_arch = cross_compile_target_arch(); - let env_overrides = nuget_wdk_content_root_path(target_arch) + let env = nuget_wdk_content_root_path(target_arch) .map(|path| vec![(WDK_CONTENT_ROOT_ENV_VAR, Some(path))]); clean_build_and_verify_project( "wdm", @@ -163,8 +184,9 @@ fn wdm_driver_cross_compiles_with_cli_option_successfully() { None, Some(target_arch), None, - env_overrides.as_deref(), + env.as_deref(), Some(target_arch), + None, ); } @@ -243,6 +265,7 @@ mod kmdf_driver_with_target_override { None, Some(env.as_slice()), Some(target_arch), + None, ); } @@ -259,6 +282,7 @@ mod kmdf_driver_with_target_override { None, Some(env.as_slice()), Some(target_arch), + None, ); } @@ -276,6 +300,7 @@ mod kmdf_driver_with_target_override { None, Some(env.as_slice()), Some(cli_target_arch), + None, ); } @@ -292,11 +317,11 @@ mod kmdf_driver_with_target_override { None, Some(env.as_slice()), Some(target_arch), + None, ); } } -#[allow(clippy::too_many_arguments)] fn clean_build_and_verify_project( driver_type: &str, driver_name: &str, @@ -306,6 +331,7 @@ fn clean_build_and_verify_project( profile: Option<&str>, env_overrides: Option<&[(&str, Option)]>, target_arch_for_verification: Option<&str>, + additional_build_args: Option<&[&str]>, ) { let project_path = project_path.map_or_else(|| format!("tests/{driver_name}"), ToString::to_string); @@ -323,6 +349,9 @@ fn clean_build_and_verify_project( args.push("--profile"); args.push(profile); } + if let Some(additional_args) = additional_build_args { + args.extend_from_slice(additional_args); + } let cmd_args = if args.is_empty() { None } else { From b57d0754fcdd29256374c194a5435c1185fca282 Mon Sep 17 00:00:00 2001 From: Shravan Vasista Date: Thu, 21 May 2026 10:13:39 +0530 Subject: [PATCH 4/4] fix: allow clippy warning for too many arguments in clean_build_and_verify_project function --- crates/cargo-wdk/tests/build_command_test.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/cargo-wdk/tests/build_command_test.rs b/crates/cargo-wdk/tests/build_command_test.rs index 028a3dfd0..93a7404b8 100644 --- a/crates/cargo-wdk/tests/build_command_test.rs +++ b/crates/cargo-wdk/tests/build_command_test.rs @@ -322,6 +322,7 @@ mod kmdf_driver_with_target_override { } } +#[allow(clippy::too_many_arguments)] fn clean_build_and_verify_project( driver_type: &str, driver_name: &str,