|
| 1 | +use std::env; |
| 2 | + |
| 3 | +fn main() { |
| 4 | + println!("cargo::rerun-if-changed=build.rs"); |
| 5 | + println!( |
| 6 | + "cargo::rustc-check-cfg=cfg(tail_abi, values(\"Rust\", \"C-unwind\", \"sysv64-unwind\", \"rust-preserve-none\"))" |
| 7 | + ); |
| 8 | + println!("cargo::rustc-check-cfg=cfg(simd_backend, values(\"generic\", \"wasm\", \"x86\"))"); |
| 9 | + |
| 10 | + let arch = env::var("CARGO_CFG_TARGET_ARCH").expect("Cargo target architecture"); |
| 11 | + let features = env::var("CARGO_CFG_TARGET_FEATURE").unwrap_or_default(); |
| 12 | + let x86_v3 = ["sse4.2", "avx", "avx2", "bmi1", "bmi2", "fma", "lzcnt", "movbe", "popcnt"] |
| 13 | + .iter() |
| 14 | + .all(|required| features.split(',').any(|enabled| enabled == *required)); |
| 15 | + let simd = match arch.as_str() { |
| 16 | + "wasm32" | "wasm64" => "wasm", |
| 17 | + "x86_64" if env::var_os("CARGO_FEATURE_SIMD_X86").is_some() && x86_v3 => "x86", |
| 18 | + _ => "generic", |
| 19 | + }; |
| 20 | + println!("cargo::rustc-cfg=simd_backend={simd:?}"); |
| 21 | + |
| 22 | + if env::var_os("CARGO_FEATURE_NIGHTLY_TAIL_CALLS").is_none() { |
| 23 | + return; |
| 24 | + } |
| 25 | + |
| 26 | + let width = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").expect("Cargo target pointer width"); |
| 27 | + let os = env::var("CARGO_CFG_TARGET_OS").expect("Cargo target OS"); |
| 28 | + let preserve_none = env::var_os("CARGO_FEATURE_NIGHTLY_RUST_PRESERVE_NONE").is_some(); |
| 29 | + let abi = match (arch.as_str(), width.as_str(), os.as_str(), preserve_none) { |
| 30 | + ("aarch64", "32", _, _) => "C-unwind", |
| 31 | + ("x86_64", _, _, true) | ("aarch64", "64", _, true) => "rust-preserve-none", |
| 32 | + ("x86_64", _, "windows", _) => "sysv64-unwind", |
| 33 | + _ => "Rust", |
| 34 | + }; |
| 35 | + println!("cargo::rustc-cfg=tail_abi={abi:?}"); |
| 36 | +} |
0 commit comments