use std::env;
fn main() {
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=RUSTFLAGS");
if target_arch == "x86_64" || target_arch == "x86" {
if is_x86_feature_detected("avx512f") {
println!("cargo:rustc-cfg=has_avx512");
println!("cargo:rustc-cfg=has_avx2");
println!("cargo:warning=Building with AVX-512 support");
}
else if is_x86_feature_detected("avx2") {
println!("cargo:rustc-cfg=has_avx2");
println!("cargo:warning=Building with AVX2 support");
}
else if is_x86_feature_detected("sse4.2") {
println!("cargo:rustc-cfg=has_sse42");
println!("cargo:warning=Building with SSE4.2 support");
}
} else if target_arch == "aarch64" {
println!("cargo:rustc-cfg=has_neon");
println!("cargo:warning=Building with ARM NEON support");
}
if env::var("CARGO_FEATURE_SIMD_NATIVE").is_ok() {
println!("cargo:rustc-env=RUSTFLAGS=-C target-cpu=native");
println!("cargo:warning=Building with native CPU optimizations (-C target-cpu=native)");
}
if let Ok(pg_config) = env::var("PG_CONFIG") {
println!("cargo:rerun-if-env-changed=PG_CONFIG");
println!("cargo:warning=Using pg_config at: {}", pg_config);
}
print_feature_status();
}
fn is_x86_feature_detected(feature: &str) -> bool {
if let Ok(rustflags) = env::var("RUSTFLAGS") {
if rustflags.contains("target-cpu=native") {
return check_native_feature(feature);
}
if rustflags.contains(&format!("target-feature=+{}", feature)) {
return true;
}
}
match feature {
"avx512f" => env::var("CARGO_FEATURE_SIMD_AVX512").is_ok(),
"avx2" => env::var("CARGO_FEATURE_SIMD_AVX2").is_ok(),
"sse4.2" => true, _ => false,
}
}
fn check_native_feature(feature: &str) -> bool {
#[cfg(target_arch = "x86_64")]
{
match feature {
"avx512f" => std::is_x86_feature_detected!("avx512f"),
"avx2" => std::is_x86_feature_detected!("avx2"),
"sse4.2" => std::is_x86_feature_detected!("sse4.2"),
_ => false,
}
}
#[cfg(not(target_arch = "x86_64"))]
{
let _ = feature;
false
}
}
fn print_feature_status() {
println!("cargo:warning=Feature Status:");
if env::var("CARGO_FEATURE_INDEX_HNSW").is_ok() {
println!("cargo:warning= ✓ HNSW index enabled");
}
if env::var("CARGO_FEATURE_INDEX_IVFFLAT").is_ok() {
println!("cargo:warning= ✓ IVFFlat index enabled");
}
if env::var("CARGO_FEATURE_QUANTIZATION_SCALAR").is_ok() {
println!("cargo:warning= ✓ Scalar quantization enabled");
}
if env::var("CARGO_FEATURE_QUANTIZATION_PRODUCT").is_ok() {
println!("cargo:warning= ✓ Product quantization enabled");
}
if env::var("CARGO_FEATURE_QUANTIZATION_BINARY").is_ok() {
println!("cargo:warning= ✓ Binary quantization enabled");
}
if env::var("CARGO_FEATURE_HYBRID_SEARCH").is_ok() {
println!("cargo:warning= ✓ Hybrid search enabled");
}
if env::var("CARGO_FEATURE_FILTERED_SEARCH").is_ok() {
println!("cargo:warning= ✓ Filtered search enabled");
}
if env::var("CARGO_FEATURE_NEON_COMPAT").is_ok() {
println!("cargo:warning= ✓ Neon compatibility enabled");
}
}