diff options
| author | Valentin Popov <valentin@popov.link> | 2026-06-25 06:41:26 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-06-25 10:45:38 +0300 |
| commit | 0caa36d923ef6561eb21e3a1b323be229dd11527 (patch) | |
| tree | b2e229a6eeb2e47e63532657066c607457c1759c | |
| parent | 25d26a87a494840bbc03373b843879302b3b17e3 (diff) | |
| download | fparkan-0caa36d923ef6561eb21e3a1b323be229dd11527.tar.xz fparkan-0caa36d923ef6561eb21e3a1b323be229dd11527.zip | |
build(vulkan-smoke): capture build toolchain metadata
| -rw-r--r-- | apps/fparkan-vulkan-smoke/build.rs | 39 | ||||
| -rw-r--r-- | apps/fparkan-vulkan-smoke/src/main.rs | 33 |
2 files changed, 69 insertions, 3 deletions
diff --git a/apps/fparkan-vulkan-smoke/build.rs b/apps/fparkan-vulkan-smoke/build.rs index b8c2f42..25e9178 100644 --- a/apps/fparkan-vulkan-smoke/build.rs +++ b/apps/fparkan-vulkan-smoke/build.rs @@ -6,6 +6,8 @@ use std::process::Command; fn main() { println!("cargo:rerun-if-env-changed=TARGET"); + println!("cargo:rerun-if-env-changed=RUSTC"); + println!("cargo:rerun-if-env-changed=RUSTUP_TOOLCHAIN"); println!("cargo:rerun-if-env-changed=GITHUB_SHA"); println!("cargo:rerun-if-env-changed=SOURCE_VERSION"); println!("cargo:rerun-if-env-changed=BUILD_VCS_NUMBER"); @@ -13,6 +15,9 @@ fn main() { if let Ok(target) = env::var("TARGET") { println!("cargo:rustc-env=FPARKAN_BUILD_TARGET_TRIPLE={target}"); } + if let Some(toolchain) = rustc_release() { + println!("cargo:rustc-env=FPARKAN_BUILD_RUST_TOOLCHAIN={toolchain}"); + } let workspace_root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("manifest dir")).join("../.."); @@ -23,6 +28,9 @@ fn main() { if let Some(commit_sha) = env_commit_sha().or_else(|| git_head_commit_sha(&workspace_root)) { println!("cargo:rustc-env=FPARKAN_BUILD_COMMIT_SHA={commit_sha}"); } + if let Some(git_dirty) = git_dirty(&workspace_root) { + println!("cargo:rustc-env=FPARKAN_BUILD_GIT_DIRTY={git_dirty}"); + } } fn env_commit_sha() -> Option<String> { @@ -47,6 +55,19 @@ fn git_head_commit_sha(workspace_root: &Path) -> Option<String> { is_commit_sha(&value).then_some(value) } +fn git_dirty(workspace_root: &Path) -> Option<bool> { + let output = Command::new("git") + .args(["-C"]) + .arg(workspace_root) + .args(["status", "--short"]) + .output() + .ok()?; + output + .status + .success() + .then(|| !String::from_utf8_lossy(&output.stdout).trim().is_empty()) +} + fn git_dir(workspace_root: &Path) -> Option<PathBuf> { let output = Command::new("git") .args(["-C"]) @@ -69,6 +90,7 @@ fn emit_git_rerun_hints(git_dir: &Path) { "cargo:rerun-if-changed={}", git_dir.join("packed-refs").display() ); + println!("cargo:rerun-if-changed={}", git_dir.join("index").display()); let Some(reference) = std::fs::read_to_string(&head).ok().and_then(|value| { value .strip_prefix("ref: ") @@ -86,3 +108,20 @@ fn emit_git_rerun_hints(git_dir: &Path) { fn is_commit_sha(value: &str) -> bool { value.len() == 40 && value.chars().all(|ch| ch.is_ascii_hexdigit()) } + +fn rustc_release() -> Option<String> { + let rustc = env::var("RUSTC").unwrap_or_else(|_| "rustc".to_string()); + let output = Command::new(rustc).arg("-Vv").output().ok()?; + if !output.status.success() { + return None; + } + String::from_utf8(output.stdout) + .ok()? + .lines() + .find_map(|line| { + line.strip_prefix("release: ") + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToString::to_string) + }) +} diff --git a/apps/fparkan-vulkan-smoke/src/main.rs b/apps/fparkan-vulkan-smoke/src/main.rs index 5495950..41fe385 100644 --- a/apps/fparkan-vulkan-smoke/src/main.rs +++ b/apps/fparkan-vulkan-smoke/src/main.rs @@ -198,10 +198,10 @@ impl SmokeApp { let smoke_report = SmokeReport { schema_version: SCHEMA_VERSION, commit_sha: compiled_commit_sha(), - git_dirty: current_git_dirty(), + git_dirty: compiled_git_dirty(), runner_identity: measured_runner_identity(), runner_architecture: actual_architecture(), - rust_toolchain: current_rustc_release(), + rust_toolchain: compiled_rust_toolchain(), target_triple: compiled_target_triple(), platform: actual_platform(), status, @@ -559,7 +559,13 @@ fn runtime_git_commit_sha() -> String { .unwrap_or_else(|| "unknown".to_string()) } -fn current_git_dirty() -> bool { +fn compiled_git_dirty() -> bool { + option_env!("FPARKAN_BUILD_GIT_DIRTY") + .and_then(parse_bool_env) + .unwrap_or_else(runtime_git_dirty) +} + +fn runtime_git_dirty() -> bool { Command::new("git") .args(["status", "--short"]) .output() @@ -569,6 +575,12 @@ fn current_git_dirty() -> bool { .is_some_and(|output| !output.trim().is_empty()) } +fn compiled_rust_toolchain() -> String { + option_env!("FPARKAN_BUILD_RUST_TOOLCHAIN") + .filter(|value| !value.trim().is_empty()) + .map_or_else(current_rustc_release, ToString::to_string) +} + fn current_rustc_release() -> String { Command::new("rustc") .arg("-Vv") @@ -624,6 +636,14 @@ fn is_commit_sha(value: &str) -> bool { value.len() == 40 && value.chars().all(|ch| ch.is_ascii_hexdigit()) } +fn parse_bool_env(value: &str) -> Option<bool> { + match value { + "true" => Some(true), + "false" => Some(false), + _ => None, + } +} + #[cfg(test)] mod tests { use super::*; @@ -725,6 +745,13 @@ mod tests { } #[test] + fn parses_bool_env_values() { + assert_eq!(parse_bool_env("true"), Some(true)); + assert_eq!(parse_bool_env("false"), Some(false)); + assert_eq!(parse_bool_env("1"), None); + } + + #[test] fn smoke_report_json_contains_expected_fields() { let json = serde_json::to_string_pretty(&SmokeReport { schema_version: SCHEMA_VERSION, |
