aboutsummaryrefslogtreecommitdiff
path: root/build.rs
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2019-01-19 08:25:30 -0500
committerAndrew Gallant <jamslam@gmail.com>2019-01-19 09:01:19 -0500
commit5b3ffeeed2d04ec5051336ea2c6e6d36abc94581 (patch)
treef9acbb831121cbdb934d6d664cc6aa4f0b19a568 /build.rs
parentce4489fc040716d3748c4a4e9705f6416e2abd70 (diff)
downloadbyteorder-5b3ffeeed2d04ec5051336ea2c6e6d36abc94581.tar.gz
i128: enable support for 128-bit integers automatically
This adds a build.rs to byteorder that will set a conditional compilation flag automatically if the current Rust compiler supports 128-bit integers. This makes the i128 feature itself a no-op. We continue to allow the feature to be supplied for backwards compatibility. Addresses https://github.com/TyOverby/bincode/issues/250
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..a2c8d18
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,82 @@
+use std::env;
+use std::ffi::OsString;
+use std::process::Command;
+
+fn main() {
+ let version = match Version::read() {
+ Ok(version) => version,
+ Err(err) => {
+ eprintln!("failed to parse `rustc --version`: {}", err);
+ return;
+ }
+ };
+ enable_i128(version);
+}
+
+fn enable_i128(version: Version) {
+ if version < (Version { major: 1, minor: 26, patch: 0 }) {
+ return;
+ }
+
+ println!("cargo:rustc-cfg=byteorder_i128");
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
+struct Version {
+ major: u32,
+ minor: u32,
+ patch: u32,
+}
+
+impl Version {
+ fn read() -> Result<Version, String> {
+ let rustc = env::var_os("RUSTC").unwrap_or(OsString::from("rustc"));
+ let output = Command::new(&rustc)
+ .arg("--version")
+ .output()
+ .unwrap()
+ .stdout;
+ Version::parse(&String::from_utf8(output).unwrap())
+ }
+
+ fn parse(mut s: &str) -> Result<Version, String> {
+ if !s.starts_with("rustc ") {
+ return Err(format!("unrecognized version string: {}", s));
+ }
+ s = &s["rustc ".len()..];
+
+ let parts: Vec<&str> = s.split(".").collect();
+ if parts.len() < 3 {
+ return Err(format!("not enough version parts: {:?}", parts));
+ }
+
+ let mut num = String::new();
+ for c in parts[0].chars() {
+ if !c.is_digit(10) {
+ break;
+ }
+ num.push(c);
+ }
+ let major = num.parse::<u32>().map_err(|e| e.to_string())?;
+
+ num.clear();
+ for c in parts[1].chars() {
+ if !c.is_digit(10) {
+ break;
+ }
+ num.push(c);
+ }
+ let minor = num.parse::<u32>().map_err(|e| e.to_string())?;
+
+ num.clear();
+ for c in parts[2].chars() {
+ if !c.is_digit(10) {
+ break;
+ }
+ num.push(c);
+ }
+ let patch = num.parse::<u32>().map_err(|e| e.to_string())?;
+
+ Ok(Version { major, minor, patch })
+ }
+}