build.rs (1541B)
1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 use std::env; 6 use std::process::Command; 7 use std::str::{self, FromStr}; 8 9 fn main() { 10 println!("cargo:rustc-cfg=build_script_ran"); 11 let minor = match rustc_minor_version() { 12 Some(minor) => minor, 13 None => return, 14 }; 15 16 let target = env::var("TARGET").unwrap(); 17 18 if minor >= 34 { 19 println!("cargo:rustc-cfg=is_new_rustc"); 20 } else { 21 println!("cargo:rustc-cfg=is_old_rustc"); 22 } 23 24 if target.contains("android") { 25 println!("cargo:rustc-cfg=is_android"); 26 } 27 if target.contains("darwin") { 28 println!("cargo:rustc-cfg=is_mac"); 29 } 30 31 // Check that we can get a `rustenv` variable from the build script. 32 let _ = env!("BUILD_SCRIPT_TEST_VARIABLE"); 33 } 34 35 fn rustc_minor_version() -> Option<u32> { 36 let rustc = match env::var_os("RUSTC") { 37 Some(rustc) => rustc, 38 None => return None, 39 }; 40 41 let output = match Command::new(rustc).arg("--version").output() { 42 Ok(output) => output, 43 Err(_) => return None, 44 }; 45 46 let version = match str::from_utf8(&output.stdout) { 47 Ok(version) => version, 48 Err(_) => return None, 49 }; 50 51 let mut pieces = version.split('.'); 52 if pieces.next() != Some("rustc 1") { 53 return None; 54 } 55 56 let next = match pieces.next() { 57 Some(next) => next, 58 None => return None, 59 }; 60 61 u32::from_str(next).ok() 62 }