use env::consts::{EXE_EXTENSION, EXE_SUFFIX}; use std::env; use std::ffi::OsString; use std::path::PathBuf; /// Given an executable called `name`, return the filename for the /// executable for a particular target. pub fn exe(name: &PathBuf) -> PathBuf { if EXE_EXTENSION != "" && name.extension() != Some(EXE_EXTENSION.as_ref()) { let mut name: OsString = name.clone().into(); name.push(EXE_SUFFIX); name.into() } else { name.clone() } } fn main() { let host = env::var("HOST").unwrap(); println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-env-changed=RUSTC"); println!("cargo:rustc-env=BUILD_TRIPLE={}", host); // This may not be a canonicalized path. let mut rustc = PathBuf::from(env::var_os("RUSTC").unwrap()); if rustc.is_relative() { println!("cargo:rerun-if-env-changed=PATH"); for dir in env::split_paths(&env::var_os("PATH").unwrap_or_default()) { let absolute = dir.join(&exe(&rustc)); if absolute.exists() { rustc = absolute; break; } } } assert!(rustc.is_absolute()); // FIXME: if the path is not utf-8, this is going to break. Unfortunately // Cargo doesn't have a way for us to specify non-utf-8 paths easily, so // we'll need to invent some encoding scheme if this becomes a problem. println!("cargo:rustc-env=RUSTC={}", rustc.to_str().unwrap()); }