diff --git a/Cargo.lock b/Cargo.lock index c5c4082..e6975a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1036,7 +1036,7 @@ checksum = "6c89eaf493b3dfc730cda42a77014aad65e03213992c7afe0dff60a9f7d3dd94" [[package]] name = "rustc_codegen_spirv-types" version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu?rev=e97524f6b4816056b3edaa70c3e0e0c656392c05#e97524f6b4816056b3edaa70c3e0e0c656392c05" +source = "git+https://github.com/Rust-GPU/rust-gpu?rev=86d74b65d218bc506f6f68eea42bea56fbc413ec#86d74b65d218bc506f6f68eea42bea56fbc413ec" dependencies = [ "rspirv", "serde", @@ -1216,7 +1216,7 @@ dependencies = [ [[package]] name = "spirv-builder" version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu?rev=e97524f6b4816056b3edaa70c3e0e0c656392c05#e97524f6b4816056b3edaa70c3e0e0c656392c05" +source = "git+https://github.com/Rust-GPU/rust-gpu?rev=86d74b65d218bc506f6f68eea42bea56fbc413ec#86d74b65d218bc506f6f68eea42bea56fbc413ec" dependencies = [ "cargo_metadata", "clap", diff --git a/Cargo.toml b/Cargo.toml index de7d918..1efc3ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ exclude = [ resolver = "2" [workspace.dependencies] -spirv-builder = { git = "https://github.com/Rust-GPU/rust-gpu", rev = "e97524f6b4816056b3edaa70c3e0e0c656392c05", default-features = false } +spirv-builder = { git = "https://github.com/Rust-GPU/rust-gpu", rev = "86d74b65d218bc506f6f68eea42bea56fbc413ec", default-features = false } anyhow = "1.0.98" clap = { version = "4.5.41", features = ["derive"] } crossterm = "0.29.0" 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..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")); + 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 cd16561..e079d21 100644 --- a/crates/cargo-gpu/src/lib.rs +++ b/crates/cargo-gpu/src/lib.rs @@ -105,6 +105,12 @@ 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), + /// Show some useful values. Show(Show), @@ -140,13 +146,25 @@ impl Command { ); command.install.run()?; } - Self::Build(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, )?; + #[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:#?}"); if command.build.watch { 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