use std::process::{Command, Output};
use std::{env, str};
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let version = rustc_minor_version();
if version >= 77 {
set_cfg("rustc_1_77");
}
}
fn rustc_version_cmd(is_clippy_driver: bool) -> Output {
let rustc = env::var_os("RUSTC").expect("Failed to get rustc version: missing RUSTC env");
let mut cmd = match env::var_os("RUSTC_WRAPPER") {
Some(ref wrapper) if wrapper.is_empty() => Command::new(rustc),
Some(wrapper) => {
let mut cmd = Command::new(wrapper);
cmd.arg(rustc);
if is_clippy_driver {
cmd.arg("--rustc");
}
cmd
}
None => Command::new(rustc),
};
cmd.arg("--version");
let output = cmd.output().expect("Failed to get rustc version");
if !output.status.success() {
panic!(
"failed to run rustc: {}",
String::from_utf8_lossy(output.stderr.as_slice())
);
}
output
}
fn rustc_minor_version() -> u32 {
let mut output = rustc_version_cmd(false);
if str::from_utf8(&output.stdout)
.unwrap()
.starts_with("clippy")
{
output = rustc_version_cmd(true);
}
let version = str::from_utf8(&output.stdout).unwrap();
let mut pieces = version.split('.');
if pieces.next() != Some("rustc 1") {
panic!("Rust version missing beginning `rustc 1.` tag");
}
pieces.next().unwrap().parse().unwrap()
}
fn set_cfg(cfg: &str) {
println!("cargo:rustc-cfg={}", cfg);
}