From fe9ffb803021af17763fd628cf04227b0ec41c7c Mon Sep 17 00:00:00 2001 From: "Stephen M. Coakley" Date: Tue, 10 Sep 2024 12:38:33 -0500 Subject: [PATCH] Expose whisper.cpp version as a static string Add a `WHISPER_CPP_VERSION` static that contains the version number of whisper.cpp that whisper-rs was built with. This can be useful for downstream applications for debugging and logging purposes. This is implemented using [build script metadata](https://doc.rust-lang.org/cargo/reference/build-scripts.html#the-links-manifest-key) for whisper-rs-sys to expose the version number of whisper.cpp defined in `CMakeLists.txt` as metadata to crates that depend on it. Then whisper-rs accesses that build metadata and defines its own internal compile-time environment variable containing the same value, which is then assigned to a static variable. It seemed better to expose this information through build metadata rather than defining a static in whisper-rs-sys directly, despite the extra indirection, so as to keep whisper-rs-sys as pure bindings. --- build.rs | 5 +++++ src/lib.rs | 3 +++ sys/build.rs | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 build.rs diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..16b9b59 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +use std::env; + +fn main() { + println!("cargo:rustc-env=WHISPER_CPP_VERSION={}", env::var("DEP_WHISPER_WHISPER_CPP_VERSION").unwrap()); +} diff --git a/src/lib.rs b/src/lib.rs index a35ff93..35214e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,3 +50,6 @@ pub type WhisperLogitsFilterCallback = whisper_rs_sys::whisper_logits_filter_cal pub type WhisperAbortCallback = whisper_rs_sys::ggml_abort_callback; pub type WhisperLogCallback = whisper_rs_sys::ggml_log_callback; pub type DtwAhead = whisper_rs_sys::whisper_ahead; + +/// The version of whisper.cpp that whisper-rs was linked with. +pub static WHISPER_CPP_VERSION: &str = env!("WHISPER_CPP_VERSION"); diff --git a/sys/build.rs b/sys/build.rs index 211fe34..a32ec6e 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -4,6 +4,8 @@ extern crate bindgen; use cmake::Config; use std::env; +use std::fs::File; +use std::io::{BufRead, BufReader}; use std::path::PathBuf; fn main() { @@ -218,6 +220,13 @@ fn main() { println!("cargo:rustc-link-lib=static=whisper"); println!("cargo:rustc-link-lib=static=ggml"); + println!( + "cargo:WHISPER_CPP_VERSION={}", + get_whisper_cpp_version(&whisper_root) + .expect("Failed to read whisper.cpp CMake config") + .expect("Could not find whisper.cpp version declaration"), + ); + // for whatever reason this file is generated during build and triggers cargo complaining _ = std::fs::remove_file("bindings/javascript/package.json"); } @@ -244,3 +253,18 @@ fn add_link_search_path(dir: &std::path::Path) -> std::io::Result<()> { } Ok(()) } + +fn get_whisper_cpp_version(whisper_root: &std::path::Path) -> std::io::Result> { + let cmake_lists = BufReader::new(File::open(whisper_root.join("CMakeLists.txt"))?); + + for line in cmake_lists.lines() { + let line = line?; + + if let Some(suffix) = line.strip_prefix(r#"project("whisper.cpp" VERSION "#) { + let whisper_cpp_version = suffix.trim_end_matches(')'); + return Ok(Some(whisper_cpp_version.into())); + } + } + + Ok(None) +}