Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 1 | use std::env; |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 2 | use std::process::Command; |
| 3 | use std::str; |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 4 | |
| 5 | fn main() { |
| 6 | println!("cargo:rerun-if-changed=build.rs"); |
| 7 | |
| 8 | let target = env::var("TARGET").unwrap(); |
| 9 | |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 10 | if !enable_use_proc_macro(&target) { |
David Tolnay | 2ff99ce | 2018-09-01 09:40:51 -0700 | [diff] [blame] | 11 | return; |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 12 | } |
| 13 | println!("cargo:rustc-cfg=use_proc_macro"); |
| 14 | |
| 15 | let minor = match rustc_minor_version() { |
| 16 | Some(n) => n, |
| 17 | None => return, |
| 18 | }; |
| 19 | |
David Tolnay | e839e4f | 2018-09-06 09:36:43 -0700 | [diff] [blame] | 20 | // Rust 1.29 stabilized the necessary APIs in the `proc_macro` crate |
| 21 | if minor >= 29 || cfg!(feature = "nightly") { |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 22 | println!("cargo:rustc-cfg=wrap_proc_macro"); |
| 23 | |
| 24 | if cfg!(procmacro2_semver_exempt) { |
| 25 | println!("cargo:rustc-cfg=super_unstable"); |
| 26 | } |
David Tolnay | e839e4f | 2018-09-06 09:36:43 -0700 | [diff] [blame] | 27 | } |
| 28 | |
| 29 | if minor == 29 { |
| 30 | println!("cargo:rustc-cfg=slow_extend"); |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 31 | } |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 32 | } |
| 33 | |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 34 | fn enable_use_proc_macro(target: &str) -> bool { |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 35 | // wasm targets don't have the `proc_macro` crate, disable this feature. |
| 36 | if target.contains("wasm32") { |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 37 | return false; |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 38 | } |
| 39 | |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 40 | // Otherwise, only enable it if our feature is actually enabled. |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 41 | cfg!(feature = "proc-macro") |
| 42 | } |
| 43 | |
| 44 | fn rustc_minor_version() -> Option<u32> { |
| 45 | macro_rules! otry { |
David Tolnay | 2ff99ce | 2018-09-01 09:40:51 -0700 | [diff] [blame] | 46 | ($e:expr) => { |
| 47 | match $e { |
| 48 | Some(e) => e, |
| 49 | None => return None, |
| 50 | } |
| 51 | }; |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 52 | } |
Alex Crichton | ce0904d | 2018-08-27 17:29:49 -0700 | [diff] [blame] | 53 | let rustc = otry!(env::var_os("RUSTC")); |
| 54 | let output = otry!(Command::new(rustc).arg("--version").output().ok()); |
| 55 | let version = otry!(str::from_utf8(&output.stdout).ok()); |
| 56 | let mut pieces = version.split('.'); |
| 57 | if pieces.next() != Some("rustc 1") { |
| 58 | return None; |
| 59 | } |
| 60 | otry!(pieces.next()).parse().ok() |
Alex Crichton | 5354848 | 2018-08-11 21:54:05 -0700 | [diff] [blame] | 61 | } |