|  | use std::env; | 
|  | use std::io::Write; | 
|  | use std::process::{Command, Stdio}; | 
|  |  | 
|  | fn main() { | 
|  | if probe("fn main() { 0i128; }") { | 
|  | println!("cargo:rustc-cfg=has_i128"); | 
|  | } else if env::var_os("CARGO_FEATURE_I128").is_some() { | 
|  | panic!("i128 support was not detected!"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /// Test if a code snippet can be compiled | 
|  | fn probe(code: &str) -> bool { | 
|  | let rustc = env::var_os("RUSTC").unwrap_or_else(|| "rustc".into()); | 
|  | let out_dir = env::var_os("OUT_DIR").expect("environment variable OUT_DIR"); | 
|  |  | 
|  | let mut child = Command::new(rustc) | 
|  | .arg("--out-dir") | 
|  | .arg(out_dir) | 
|  | .arg("--emit=obj") | 
|  | .arg("-") | 
|  | .stdin(Stdio::piped()) | 
|  | .spawn() | 
|  | .expect("rustc probe"); | 
|  |  | 
|  | child | 
|  | .stdin | 
|  | .as_mut() | 
|  | .expect("rustc stdin") | 
|  | .write_all(code.as_bytes()) | 
|  | .expect("write rustc stdin"); | 
|  |  | 
|  | child.wait().expect("rustc probe").success() | 
|  | } |