use std::io::Write; use std::env; fn dlerror_is_mtsafe(target_os: &str) { match target_os { // Confirmed MT-safe: "linux" | "android" | "openbsd" | "macos" | "ios" | "solaris" | "illumos" | "redox" | "fuchsia" => { println!("cargo:rustc-cfg=mtsafe_dlerror"); } // Confirmed not MT-safe: "freebsd" | "dragonfly" | "netbsd" | "bitrig" | "haiku" => {} // Unknown: _ => {} } } fn link_libraries(target_os: &str) { match target_os { "linux" | "android" => println!("cargo:rustc-link-lib=dl"), "freebsd" | "dragonfly" => println!("cargo:rustc-link-lib=c"), // netbsd claims dl* will be available to any dynamically linked binary, but I haven’t // found any libraries that have to be linked to on other platforms. // What happens if the executable is not linked up dynamically? "openbsd" | "bitrig" | "netbsd" | "macos" | "ios" => {} "solaris" | "illumos" => {} "haiku" => {} "redox" => {} "fuchsia" => {} // dependencies come with winapi "windows" => {} tos => { writeln!(::std::io::stderr(), "Building for an unknown target_os=`{:?}`!\nPlease report an issue ", tos).expect("could not report the error"); ::std::process::exit(0xfc); } } } fn main() { match env::var("CARGO_CFG_TARGET_OS") { Ok(target_os) => { dlerror_is_mtsafe(&target_os); link_libraries(&target_os); } Err(e) => { writeln!(::std::io::stderr(), "Unable to get target_os=`{}`!", e).expect("could not report the error"); ::std::process::exit(0xfd); } } }