blob: 6d058134fb8c89790c42b45d5062293171f4feca [file] [log] [blame]
use std::env;
use std::fmt;
#[derive(Clone, Copy, PartialEq, Eq)]
enum PolyfillLevel {
// Native, ie no polyfill. Just reexport from core::sync::atomic
Native,
// Full polyfill: polyfill both load/store and CAS with critical sections
Polyfill,
}
impl fmt::Display for PolyfillLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match *self {
Self::Native => "native",
Self::Polyfill => "polyfill",
};
write!(f, "{}", s)
}
}
fn main() {
let target = env::var("TARGET").unwrap();
use PolyfillLevel::*;
let patterns = [
("riscv32imac-*", (Native, Polyfill)),
("riscv32gc-*", (Native, Polyfill)),
("riscv32imc-*-espidf", (Native, Native)),
("riscv32*", (Polyfill, Polyfill)),
("avr-*", (Polyfill, Polyfill)),
("thumbv4t-*", (Polyfill, Polyfill)),
("thumbv6m-*", (Polyfill, Polyfill)),
("thumbv7m-*", (Native, Polyfill)),
("thumbv7em-*", (Native, Polyfill)),
("thumbv8m.base-*", (Native, Polyfill)),
("thumbv8m.main-*", (Native, Polyfill)),
("xtensa-*-espidf", (Native, Native)),
("xtensa-esp32-*", (Native, Polyfill)),
("xtensa-esp32s2-*", (Polyfill, Polyfill)),
("xtensa-esp32s3-*", (Native, Polyfill)),
("xtensa-esp8266-*", (Polyfill, Polyfill)),
];
if let Some((_, (level, level64))) = patterns
.iter()
.find(|(pattern, _)| matches(pattern, &target))
{
if *level == PolyfillLevel::Polyfill {
println!("cargo:rustc-cfg=polyfill_u8");
println!("cargo:rustc-cfg=polyfill_u16");
println!("cargo:rustc-cfg=polyfill_u32");
println!("cargo:rustc-cfg=polyfill_usize");
println!("cargo:rustc-cfg=polyfill_i8");
println!("cargo:rustc-cfg=polyfill_i16");
println!("cargo:rustc-cfg=polyfill_i32");
println!("cargo:rustc-cfg=polyfill_isize");
println!("cargo:rustc-cfg=polyfill_ptr");
println!("cargo:rustc-cfg=polyfill_bool");
}
if *level64 == PolyfillLevel::Polyfill {
println!("cargo:rustc-cfg=polyfill_u64");
println!("cargo:rustc-cfg=polyfill_i64");
}
} else {
// If we don't know about the target, just reexport the entire `core::atomic::*`
// This doesn't polyfill anything, but it's guaranteed to never fail build.
println!("cargo:rustc-cfg=reexport_core");
}
if target.starts_with("avr-") {
println!("cargo:rustc-cfg=missing_refunwindsafe")
}
}
// tiny glob replacement to avoid pulling in more crates.
// Supports 0 or 1 wildcards `*`
fn matches(pattern: &str, val: &str) -> bool {
if let Some(p) = pattern.find('*') {
let prefix = &pattern[..p];
let suffix = &pattern[p + 1..];
val.len() >= prefix.len() + suffix.len() && val.starts_with(prefix) && val.ends_with(suffix)
} else {
val == pattern
}
}