use std::env;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum Arch {
arm,
x86,
x86_64,
}
#[derive(Debug, Clone, Copy)]
pub struct Configuration {
pub arch: Arch,
pub v128: bool,
pub v256: bool,
pub vale: bool,
pub inline_asm: bool,
pub intrinsics: bool,
pub native_u128: bool,
}
impl Configuration {
pub fn new() -> Self {
if env::var("EVERCRYPT_FAILSAFE").is_ok() {
return Self::failsafe();
}
let arch = env::var("CARGO_CFG_TARGET_ARCH").expect("Cannot determine target architecture");
match arch.as_str() {
"arm" | "aarch64" => Self {
arch: Arch::arm,
v128: false,
v256: false,
vale: false,
inline_asm: false,
intrinsics: false,
native_u128: false,
},
"x86" => Self {
arch: Arch::x86,
v128: false,
v256: false,
vale: false,
inline_asm: false,
intrinsics: true,
native_u128: false,
},
"x86_64" => Self {
arch: Arch::x86_64,
v128: false,
v256: false,
vale: true,
inline_asm: true,
intrinsics: true,
native_u128: false,
},
arch => {
panic!("Unsupported target platform {arch}")
}
}
}
pub fn failsafe() -> Self {
let arch = env::var("CARGO_CFG_TARGET_ARCH").expect("Cannot determine target architecture");
let arch = match arch.as_str() {
"arm" | "aarch64" => Arch::arm,
"x86" => Arch::x86,
"x86_64" => Arch::x86_64,
arch => panic!("Unsupported target platform {arch}"),
};
Self { arch, v128: false, v256: false, vale: false, inline_asm: false, intrinsics: false, native_u128: false }
}
}