From 8a1d8b86c8cdf4c19779b944b999ddc00467f821 Mon Sep 17 00:00:00 2001 From: firestar99 Date: Mon, 22 Dec 2025 10:13:01 +0100 Subject: [PATCH 1/3] clippy: add `cargo gpu clippy` --- crates/cargo-gpu/src/build.rs | 22 ++++++++++++++++++---- crates/cargo-gpu/src/config.rs | 2 +- crates/cargo-gpu/src/lib.rs | 9 ++++++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/crates/cargo-gpu/src/build.rs b/crates/cargo-gpu/src/build.rs index e8e620c..c00f8cc 100644 --- a/crates/cargo-gpu/src/build.rs +++ b/crates/cargo-gpu/src/build.rs @@ -21,14 +21,19 @@ pub struct BuildArgs { #[clap(long, short, action)] pub watch: bool, - /// the flattened [`SpirvBuilder`] + /// The flattened [`SpirvBuilder`] #[clap(flatten)] #[serde(flatten)] pub spirv_builder: SpirvBuilder, - ///Renames the manifest.json file to the given name + /// Renames the `manifest.json` file to the given name #[clap(long, short, default_value = "manifest.json")] pub manifest_file: String, + + /// When building fails with [`SpirvBuilderError::NoArtifactProduced`], count it as a success anyway. + /// Used for e.g. `clippy`, which doesn't produce any artifacts. Defaults to false. + #[clap(skip)] + pub allow_no_artifacts: bool, } impl Default for BuildArgs { @@ -39,6 +44,7 @@ impl Default for BuildArgs { watch: false, spirv_builder: SpirvBuilder::default(), manifest_file: String::from("manifest.json"), + allow_no_artifacts: false, } } } @@ -116,8 +122,16 @@ impl Build { "Compiling shaders at {}...\n", self.install.shader_crate.display() ); - let result = self.build.spirv_builder.build()?; - self.parse_compilation_result(&result)?; + let result = self.build.spirv_builder.build(); + match result { + Ok(result) => { + self.parse_compilation_result(&result)?; + } + // conditionally ignore NoArtifactProduced + Err(SpirvBuilderError::NoArtifactProduced { .. }) + if self.build.allow_no_artifacts => {} + Err(err) => return Err(err.into()), + } } Ok(()) } diff --git a/crates/cargo-gpu/src/config.rs b/crates/cargo-gpu/src/config.rs index 3c3d667..2d9696b 100644 --- a/crates/cargo-gpu/src/config.rs +++ b/crates/cargo-gpu/src/config.rs @@ -31,7 +31,7 @@ impl Config { ) -> anyhow::Result { let mut config = metadata.as_json(shader_crate_path)?; - env_args.retain(|arg| !(arg == "build" || arg == "install")); + env_args.retain(|arg| !(arg == "build" || arg == "install" || arg == "clippy")); let cli_args_json = Self::cli_args_to_json(env_args)?; Self::json_merge(&mut config, cli_args_json, None)?; diff --git a/crates/cargo-gpu/src/lib.rs b/crates/cargo-gpu/src/lib.rs index d482278..949bcb9 100644 --- a/crates/cargo-gpu/src/lib.rs +++ b/crates/cargo-gpu/src/lib.rs @@ -104,6 +104,9 @@ pub enum Command { /// Compile a shader crate to SPIR-V. Build(Box), + /// Run clippy on a shader crate with a SPIR-V target + Clippy(Box), + /// Show some useful values. Show(Show), @@ -139,13 +142,17 @@ impl Command { ); command.install.run()?; } - Self::Build(build) => { + Self::Build(build) | Self::Clippy(build) => { let shader_crate_path = &build.install.shader_crate; let mut command = config::Config::clap_command_with_cargo_config( shader_crate_path, env_args, metadata_cache, )?; + if let Self::Clippy(_) = self { + command.build.spirv_builder.cargo_cmd = Some("clippy".into()); + command.build.allow_no_artifacts = true; + } log::debug!("building with final merged arguments: {command:#?}"); if command.build.watch { From bdcac3616dd4e7200a62d118512008fcd9c6551a Mon Sep 17 00:00:00 2001 From: firestar99 Date: Mon, 22 Dec 2025 13:22:13 +0100 Subject: [PATCH 2/3] template: add `unexpected_cfgs` for spirv --- crates/shader-crate-template/Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/shader-crate-template/Cargo.toml b/crates/shader-crate-template/Cargo.toml index a3363f4..96f0422 100644 --- a/crates/shader-crate-template/Cargo.toml +++ b/crates/shader-crate-template/Cargo.toml @@ -6,6 +6,9 @@ edition = "2021" [lib] crate-type = ["rlib", "cdylib"] +[lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(target_arch, values("spirv"))'] } + # Dependencies for CPU and GPU code [dependencies] # TODO: use a simple crate version once v0.10.0 is released From 6fcc1d8fad6a17c04cd97b691b2c7cd913c1112f Mon Sep 17 00:00:00 2001 From: firestar99 Date: Tue, 23 Dec 2025 17:49:53 +0100 Subject: [PATCH 3/3] clippy: add `cargo gpu check` --- crates/cargo-gpu/src/config.rs | 4 +++- crates/cargo-gpu/src/lib.rs | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/crates/cargo-gpu/src/config.rs b/crates/cargo-gpu/src/config.rs index 2d9696b..c8df371 100644 --- a/crates/cargo-gpu/src/config.rs +++ b/crates/cargo-gpu/src/config.rs @@ -31,7 +31,9 @@ impl Config { ) -> anyhow::Result { let mut config = metadata.as_json(shader_crate_path)?; - env_args.retain(|arg| !(arg == "build" || arg == "install" || arg == "clippy")); + env_args.retain(|arg| { + !(arg == "build" || arg == "install" || arg == "check" || arg == "clippy") + }); let cli_args_json = Self::cli_args_to_json(env_args)?; Self::json_merge(&mut config, cli_args_json, None)?; diff --git a/crates/cargo-gpu/src/lib.rs b/crates/cargo-gpu/src/lib.rs index 949bcb9..cc81dce 100644 --- a/crates/cargo-gpu/src/lib.rs +++ b/crates/cargo-gpu/src/lib.rs @@ -104,6 +104,9 @@ pub enum Command { /// Compile a shader crate to SPIR-V. Build(Box), + /// Run `cargo check` on the shader crate with a SPIR-V target without building the actual shaders + Check(Box), + /// Run clippy on a shader crate with a SPIR-V target Clippy(Box), @@ -142,16 +145,24 @@ impl Command { ); command.install.run()?; } - Self::Build(build) | Self::Clippy(build) => { + Self::Build(build) | Self::Check(build) | Self::Clippy(build) => { let shader_crate_path = &build.install.shader_crate; let mut command = config::Config::clap_command_with_cargo_config( shader_crate_path, env_args, metadata_cache, )?; - if let Self::Clippy(_) = self { - command.build.spirv_builder.cargo_cmd = Some("clippy".into()); - command.build.allow_no_artifacts = true; + #[expect(clippy::wildcard_enum_match_arm, reason = "unreachable")] + match self { + Self::Check(_) => { + command.build.spirv_builder.cargo_cmd = Some("check".into()); + command.build.allow_no_artifacts = true; + } + Self::Clippy(_) => { + command.build.spirv_builder.cargo_cmd = Some("clippy".into()); + command.build.allow_no_artifacts = true; + } + _ => {} } log::debug!("building with final merged arguments: {command:#?}");