fn main() {
use std::env;
let target_family = env::var("CARGO_CFG_TARGET_FAMILY").unwrap_or_default();
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
let target_env = env::var("CARGO_CFG_TARGET_ENV").unwrap_or_default();
let is_windows = target_family == "windows";
let is_msvc = is_windows && (target_env == "msvc");
let is_unix = target_family == "unix";
let is_x86_64 = target_arch == "x86_64";
let is_aarch64 = target_arch == "aarch64";
let x64_asm = is_x86_64 && (is_windows || is_unix);
let aarch64_asm = is_aarch64 && is_unix;
let can_enable_asm = x64_asm || aarch64_asm;
if cfg!(feature = "asm") && (!can_enable_asm) {
panic!(
"Asm feature is not available for target {} on {}!",
target_arch, target_family
);
}
if cfg!(any(feature = "asm", feature = "detect-asm")) && can_enable_asm {
println!("cargo:rerun-if-changed=src/machine/asm/execute_x64.S");
println!("cargo:rerun-if-changed=src/machine/asm/execute_aarch64.S");
println!("cargo:rerun-if-changed=src/machine/asm/cdefinitions_generated.h");
let mut build = cc::Build::new();
if x64_asm {
build.file("src/machine/asm/execute_x64.S");
if is_msvc {
build.compiler("gcc");
}
} else if aarch64_asm {
build.file("src/machine/asm/execute_aarch64.S");
}
build.include("src/machine/asm").compile("asm");
println!("cargo:rustc-cfg=has_asm")
}
}