From ee84b309baaac9c3d1ab4f3fe9a7d95140d9c795 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 4 Oct 2025 22:32:59 +0200 Subject: [PATCH] build.rs: don't build compile-shaders if shaders are unchanged --- Cargo.lock | 1 + Cargo.toml | 2 ++ build/vulkan.rs | 7 +++++- build/vulkan/hash.rs | 32 ++++++++++++++++++++++++++++ compile-shaders/build-rs/src/main.rs | 9 +------- compile-shaders/core/src/lib.rs | 32 +--------------------------- 6 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 build/vulkan/hash.rs diff --git a/Cargo.lock b/Cargo.lock index 8db7819e..2dd4e5f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -637,6 +637,7 @@ dependencies = [ "tiny-skia", "tracy-client-sys", "uapi", + "walkdir", "with_builtin_macros", ] diff --git a/Cargo.toml b/Cargo.toml index 05379806..3dbce079 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,6 +74,8 @@ repc = "0.1.1" anyhow = "1.0.79" bstr = { version = "1.9.0", default-features = false, features = ["std"] } cc = "1.0.86" +blake3 = "1.8.2" +walkdir = "2.5.0" #[profile.dev.build-override] #opt-level = 3 diff --git a/build/vulkan.rs b/build/vulkan.rs index 9318d331..6a903a43 100644 --- a/build/vulkan.rs +++ b/build/vulkan.rs @@ -1,9 +1,14 @@ -use {anyhow::bail, std::process::Command}; +mod hash; + +use {crate::vulkan::hash::unchanged, anyhow::bail, std::process::Command}; pub fn main() -> anyhow::Result<()> { if !std::fs::exists("compile-shaders")? { return Ok(()); } + if unchanged() { + return Ok(()); + } let code = Command::new("cargo") .args([ "run", diff --git a/build/vulkan/hash.rs b/build/vulkan/hash.rs new file mode 100644 index 00000000..dabd45fc --- /dev/null +++ b/build/vulkan/hash.rs @@ -0,0 +1,32 @@ +use {std::fmt::Write, walkdir::WalkDir}; + +pub const ROOT: &str = "src/gfx_apis/vulkan/shaders"; +pub const HASH: &str = "src/gfx_apis/vulkan/shaders_hash.txt"; + +fn calculate_hash() -> anyhow::Result { + let dir = WalkDir::new(ROOT); + let mut files = vec![]; + for file in dir { + let file = file?; + if file.file_type().is_file() { + files.push(file.path().to_path_buf()); + } + } + files.sort(); + let mut out = String::new(); + for file in files { + let data = std::fs::read(&file)?; + writeln!(out, "{} {}", blake3::hash(&data).to_hex(), file.display())?; + } + Ok(out) +} + +pub fn unchanged() -> bool { + let Ok(actual) = std::fs::read_to_string(HASH) else { + return false; + }; + let Ok(expected) = calculate_hash() else { + return false; + }; + actual == expected +} diff --git a/compile-shaders/build-rs/src/main.rs b/compile-shaders/build-rs/src/main.rs index 13895519..8e62c22d 100644 --- a/compile-shaders/build-rs/src/main.rs +++ b/compile-shaders/build-rs/src/main.rs @@ -1,14 +1,7 @@ -use { - anyhow::bail, - compile_shaders_core::{ROOT, unchanged}, - std::process::Command, -}; +use {anyhow::bail, compile_shaders_core::ROOT, std::process::Command}; fn main() -> anyhow::Result<()> { println!("cargo:rerun-if-changed={}", ROOT); - if unchanged() { - return Ok(()); - } let code = Command::new("cargo") .args([ "run", diff --git a/compile-shaders/core/src/lib.rs b/compile-shaders/core/src/lib.rs index b9a7b348..53647204 100644 --- a/compile-shaders/core/src/lib.rs +++ b/compile-shaders/core/src/lib.rs @@ -1,36 +1,6 @@ -use {std::fmt::Write, walkdir::WalkDir}; +include!("../../../build/vulkan/hash.rs"); -pub const ROOT: &str = "src/gfx_apis/vulkan/shaders"; pub const BIN: &str = "src/gfx_apis/vulkan/shaders_bin"; -pub const HASH: &str = "src/gfx_apis/vulkan/shaders_hash.txt"; - -fn calculate_hash() -> anyhow::Result { - let dir = WalkDir::new(ROOT); - let mut files = vec![]; - for file in dir { - let file = file?; - if file.file_type().is_file() { - files.push(file.path().to_path_buf()); - } - } - files.sort(); - let mut out = String::new(); - for file in files { - let data = std::fs::read(&file)?; - writeln!(out, "{} {}", blake3::hash(&data).to_hex(), file.display())?; - } - Ok(out) -} - -pub fn unchanged() -> bool { - let Ok(actual) = std::fs::read_to_string(HASH) else { - return false; - }; - let Ok(expected) = calculate_hash() else { - return false; - }; - actual == expected -} pub fn update_hash() -> anyhow::Result<()> { std::fs::write(HASH, calculate_hash()?)?;