blob: 002135b645598ff2ffae687f669b6739165e496a [file] [log] [blame]
Andrew Gallant5b3ffee2019-01-19 08:25:30 -05001use std::env;
2use std::ffi::OsString;
Trevor Spiteri802bc112019-01-21 23:46:25 +01003use std::io::{self, Write};
Andrew Gallant5b3ffee2019-01-19 08:25:30 -05004use std::process::Command;
5
6fn main() {
7 let version = match Version::read() {
8 Ok(version) => version,
9 Err(err) => {
Trevor Spiteri802bc112019-01-21 23:46:25 +010010 writeln!(
11 &mut io::stderr(),
12 "failed to parse `rustc --version`: {}",
13 err
14 ).unwrap();
Andrew Gallant5b3ffee2019-01-19 08:25:30 -050015 return;
16 }
17 };
18 enable_i128(version);
19}
20
21fn enable_i128(version: Version) {
22 if version < (Version { major: 1, minor: 26, patch: 0 }) {
23 return;
24 }
25
26 println!("cargo:rustc-cfg=byteorder_i128");
27}
28
29#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
30struct Version {
31 major: u32,
32 minor: u32,
33 patch: u32,
34}
35
36impl Version {
37 fn read() -> Result<Version, String> {
38 let rustc = env::var_os("RUSTC").unwrap_or(OsString::from("rustc"));
39 let output = Command::new(&rustc)
40 .arg("--version")
41 .output()
42 .unwrap()
43 .stdout;
44 Version::parse(&String::from_utf8(output).unwrap())
45 }
46
47 fn parse(mut s: &str) -> Result<Version, String> {
48 if !s.starts_with("rustc ") {
49 return Err(format!("unrecognized version string: {}", s));
50 }
51 s = &s["rustc ".len()..];
52
53 let parts: Vec<&str> = s.split(".").collect();
54 if parts.len() < 3 {
55 return Err(format!("not enough version parts: {:?}", parts));
56 }
57
58 let mut num = String::new();
59 for c in parts[0].chars() {
60 if !c.is_digit(10) {
61 break;
62 }
63 num.push(c);
64 }
Trevor Spiteri802bc112019-01-21 23:46:25 +010065 let major = try!(num.parse::<u32>().map_err(|e| e.to_string()));
Andrew Gallant5b3ffee2019-01-19 08:25:30 -050066
67 num.clear();
68 for c in parts[1].chars() {
69 if !c.is_digit(10) {
70 break;
71 }
72 num.push(c);
73 }
Trevor Spiteri802bc112019-01-21 23:46:25 +010074 let minor = try!(num.parse::<u32>().map_err(|e| e.to_string()));
Andrew Gallant5b3ffee2019-01-19 08:25:30 -050075
76 num.clear();
77 for c in parts[2].chars() {
78 if !c.is_digit(10) {
79 break;
80 }
81 num.push(c);
82 }
Trevor Spiteri802bc112019-01-21 23:46:25 +010083 let patch = try!(num.parse::<u32>().map_err(|e| e.to_string()));
Andrew Gallant5b3ffee2019-01-19 08:25:30 -050084
Trevor Spiteri802bc112019-01-21 23:46:25 +010085 Ok(Version { major: major, minor: minor, patch: patch })
Andrew Gallant5b3ffee2019-01-19 08:25:30 -050086 }
87}