summaryrefslogtreecommitdiffstats
path: root/vendor/rustversion/build/build.rs
blob: 15312510d683629d98fbbb866b85099fb6462265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#![allow(
    clippy::enum_glob_use,
    clippy::must_use_candidate,
    clippy::single_match_else
)]

mod rustc;

use std::env;
use std::ffi::OsString;
use std::fs;
use std::path::Path;
use std::process::{self, Command};

fn main() {
    let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
    let output = match Command::new(&rustc).arg("--version").output() {
        Ok(output) => output,
        Err(e) => {
            let rustc = rustc.to_string_lossy();
            eprintln!("Error: failed to run `{} --version`: {}", rustc, e);
            process::exit(1);
        }
    };

    let string = match String::from_utf8(output.stdout) {
        Ok(string) => string,
        Err(e) => {
            let rustc = rustc.to_string_lossy();
            eprintln!(
                "Error: failed to parse output of `{} --version`: {}",
                rustc, e,
            );
            process::exit(1);
        }
    };

    let version = match rustc::parse(&string) {
        Some(version) => format!("{:#?}\n", version),
        None => {
            eprintln!(
                "Error: unexpected output from `rustc --version`: {:?}\n\n\
                 Please file an issue in https://github.com/dtolnay/rustversion",
                string
            );
            process::exit(1);
        }
    };

    let out_dir = env::var_os("OUT_DIR").expect("OUT_DIR not set");
    let out_file = Path::new(&out_dir).join("version.rs");
    fs::write(out_file, version).expect("failed to write version.rs");
}