use std::env;
use std::path::PathBuf;
fn validate_version() {
let version = env!("CARGO_PKG_VERSION");
if version == "0.1.0" {
panic!(
"ERROR: Version is set to default 0.1.0\n\
This suggests the package was not properly configured.\n\
Please ensure Cargo.toml has the correct version number.\n\
This prevents the version mismatch issue reported in Issue #63."
);
}
if version.is_empty() {
panic!("ERROR: CARGO_PKG_VERSION is empty. Check your build environment.");
}
let parts: Vec<&str> = version.split('.').collect();
if parts.len() < 3 {
panic!(
"ERROR: Version '{}' does not follow semantic versioning (major.minor.patch)\n\
Please use a valid version format like '1.4.2'",
version
);
}
for (i, part) in parts.iter().take(3).enumerate() {
if part.parse::<u32>().is_err() {
panic!(
"ERROR: Version component '{}' at position {} is not a valid number\n\
Version: {}",
part, i, version
);
}
}
println!("cargo:rustc-env=SHIMMY_BUILD_VERSION={}", version);
println!("cargo:rerun-if-changed=Cargo.toml");
println!("cargo:warning=Building shimmy version {}", version);
}
fn main() {
validate_version();
println!("cargo:rerun-if-changed=libs/");
if env::var("SHIMMY_USE_PREBUILT_LLAMA").is_ok() {
println!("cargo:warning=Using pre-built llama.cpp libraries");
let target = env::var("TARGET").unwrap();
let lib_dir = match target.as_str() {
"x86_64-pc-windows-msvc" => "libs/windows-x86_64",
"x86_64-apple-darwin" => "libs/macos-intel",
"aarch64-apple-darwin" => "libs/macos-arm64",
"x86_64-unknown-linux-gnu" => "libs/linux-x86_64",
"aarch64-unknown-linux-gnu" => "libs/linux-arm64",
_ => {
println!(
"cargo:warning=No pre-built library for target {}, falling back to compilation",
target
);
return;
}
};
let lib_path = PathBuf::from(lib_dir).join(if target.contains("windows") {
"llama.lib"
} else {
"libllama.a"
});
if lib_path.exists() {
println!(
"cargo:warning=Found pre-built library: {}",
lib_path.display()
);
println!("cargo:rustc-link-search=native={}", lib_dir);
println!("cargo:rustc-link-lib=static=llama");
println!("cargo:rustc-env=LLAMA_CPP_PREBUILT=1");
println!("cargo:rustc-env=LLAMA_CPP_LIB_DIR={}", lib_dir);
println!("cargo:rustc-env=LLAMA_CPP_SKIP_BUILD=1");
} else {
println!(
"cargo:warning=Pre-built library not found: {}, falling back to compilation",
lib_path.display()
);
}
}
}