use std::env;
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let mut arch_flag_set = false;
if let Ok(flags) = env::var("MATMULFLAGS") {
let user_flags = flags.split(",").map(|s| s.trim()).collect::<Vec<_>>();
let arch_flags = &[
"arch_generic4x4",
"arch_generic4x4fma",
"arch_penryn",
"arch_sandybridge",
"arch_haswell",
];
let other_flags = &[
"ftz_daz",
"prefetch",
"no_multithreading",
];
for user_flag in user_flags.iter() {
if arch_flags.iter().any(|flag| flag == user_flag) {
println!("cargo:rustc-cfg={}", user_flag);
arch_flag_set = true;
} else if other_flags.iter().any(|flag| flag == user_flag) {
println!("cargo:rustc-cfg={}", user_flag);
} else {
panic!("matrixmultiply_mt: Environment variable MATMULFLAGS contained unrecognised flag: {}", user_flag);
}
}
} else {
println!("matrixmultiply_mt: Environment variable MATMULFLAGS was not set");
}
if !arch_flag_set{
if let Ok(features) = env::var("CARGO_CFG_TARGET_FEATURE"){
println!("matrixmultiply_mt: Guessing CPU architecture from features: {}", features);
if features.split(",").map(|s| s.trim()).any(|feat| feat == "avx2") {
println!("cargo:rustc-cfg=arch_haswell");
} else if features.split(",").map(|s| s.trim()).any(|feat| feat == "avx") {
println!("cargo:rustc-cfg=arch_sandybridge");
} else if features.split(",").map(|s| s.trim()).any(|feat| feat == "64bit-mode")
&& features.split(",").map(|s| s.trim()).any(|feat| feat == "sse") {
println!("cargo:rustc-cfg=arch_penryn");
} else if features.split(",").map(|s| s.trim()).any(|feat| feat == "fma" || feat == "fma4") {
println!("cargo:rustc-cfg=generic4x4fma");
}
} else {
println!("matrixmultiply_mt: Cannot guess CPU architecture as CARGO_CFG_TARGET_FEATURE is not available, use environment variable MATMULFLAGS to set arch");
}
}
}