xref: /third_party/rust/crates/syn/build.rs (revision fad3a1d3)
1use std::env;
2use std::ffi::OsString;
3use std::process::{self, Command, Stdio};
4
5// The rustc-cfg strings below are *not* public API. Please let us know by
6// opening a GitHub issue if your build environment requires some way to enable
7// these cfgs other than by executing our build script.
8fn main() {
9    println!("cargo:rerun-if-changed=build.rs");
10
11    // Note: add "/build.rs" to package.include in Cargo.toml if adding any
12    // conditional compilation within the library.
13
14    if !unstable() {
15        println!("cargo:rustc-cfg=syn_disable_nightly_tests");
16    }
17}
18
19fn unstable() -> bool {
20    let rustc = cargo_env_var("RUSTC");
21
22    // Pick up Cargo rustc configuration.
23    let mut cmd = if let Some(wrapper) = env::var_os("RUSTC_WRAPPER") {
24        let mut cmd = Command::new(wrapper);
25        // The wrapper's first argument is supposed to be the path to rustc.
26        cmd.arg(rustc);
27        cmd
28    } else {
29        Command::new(rustc)
30    };
31
32    cmd.stdin(Stdio::null());
33    cmd.stdout(Stdio::null());
34    cmd.stderr(Stdio::null());
35    cmd.arg("-");
36
37    // Find out whether this is a nightly or dev build.
38    cmd.env_remove("RUSTC_BOOTSTRAP");
39    cmd.arg("-Zcrate-attr=feature(rustc_private)");
40
41    // Pass `-Zunpretty` to terminate earlier without writing out any "emit"
42    // files. Use `expanded` to proceed far enough to actually apply crate
43    // attrs. With `unpretty=normal` or `--print`, not enough compilation
44    // happens to recognize that the feature attribute is unstable.
45    cmd.arg("-Zunpretty=expanded");
46
47    // Set #![no_std] to bypass loading libstd.rlib. This is a 7.5% speedup.
48    cmd.arg("-Zcrate-attr=no_std");
49
50    cmd.arg("--crate-type=lib");
51    cmd.arg("--edition=2021");
52
53    if let Some(target) = env::var_os("TARGET") {
54        cmd.arg("--target").arg(target);
55    }
56
57    // If Cargo wants to set RUSTFLAGS, use that.
58    if let Ok(rustflags) = env::var("CARGO_ENCODED_RUSTFLAGS") {
59        if !rustflags.is_empty() {
60            for arg in rustflags.split('\x1f') {
61                cmd.arg(arg);
62            }
63        }
64    }
65
66    // This rustc invocation should take around 0.03 seconds.
67    match cmd.status() {
68        Ok(status) => status.success(),
69        Err(_) => false,
70    }
71}
72
73fn cargo_env_var(key: &str) -> OsString {
74    env::var_os(key).unwrap_or_else(|| {
75        eprintln!(
76            "Environment variable ${} is not set during execution of build script",
77            key,
78        );
79        process::exit(1);
80    })
81}
82