diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 03:57:19 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 03:57:19 +0000 |
commit | a0b8f38ab54ac451646aa00cd5e91b6c76f22a84 (patch) | |
tree | fc451898ccaf445814e26b46664d78702178101d /vendor/eyre/build.rs | |
parent | Adding debian version 1.71.1+dfsg1-2. (diff) | |
download | rustc-a0b8f38ab54ac451646aa00cd5e91b6c76f22a84.tar.xz rustc-a0b8f38ab54ac451646aa00cd5e91b6c76f22a84.zip |
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/eyre/build.rs')
-rw-r--r-- | vendor/eyre/build.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/vendor/eyre/build.rs b/vendor/eyre/build.rs new file mode 100644 index 000000000..60371ab91 --- /dev/null +++ b/vendor/eyre/build.rs @@ -0,0 +1,98 @@ +use std::env; +use std::fs; +use std::path::Path; +use std::process::{Command, ExitStatus}; +use std::str; + +// This code exercises the surface area that we expect of the std Backtrace +// type. If the current toolchain is able to compile it, we go ahead and use +// backtrace in eyre. +const BACKTRACE_PROBE: &str = r#" + #![feature(backtrace)] + #![allow(dead_code)] + + use std::backtrace::{Backtrace, BacktraceStatus}; + use std::error::Error; + use std::fmt::{self, Display}; + + #[derive(Debug)] + struct E; + + impl Display for E { + fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result { + unimplemented!() + } + } + + impl Error for E { + fn backtrace(&self) -> Option<&Backtrace> { + let backtrace = Backtrace::capture(); + match backtrace.status() { + BacktraceStatus::Captured | BacktraceStatus::Disabled | _ => {} + } + unimplemented!() + } + } +"#; + +const TRACK_CALLER_PROBE: &str = r#" + #![allow(dead_code)] + + #[track_caller] + fn foo() { + let _location = std::panic::Location::caller(); + } +"#; + +fn main() { + match compile_probe(BACKTRACE_PROBE) { + Some(status) if status.success() => println!("cargo:rustc-cfg=backtrace"), + _ => {} + } + + match compile_probe(TRACK_CALLER_PROBE) { + Some(status) if status.success() => println!("cargo:rustc-cfg=track_caller"), + _ => {} + } + + let rustc = match rustc_minor_version() { + Some(rustc) => rustc, + None => return, + }; + + if rustc < 52 { + println!("cargo:rustc-cfg=eyre_no_fmt_arguments_as_str"); + } + + if rustc < 58 { + println!("cargo:rustc-cfg=eyre_no_fmt_args_capture"); + } +} + +fn compile_probe(probe: &str) -> Option<ExitStatus> { + let rustc = env::var_os("RUSTC")?; + let out_dir = env::var_os("OUT_DIR")?; + let probefile = Path::new(&out_dir).join("probe.rs"); + fs::write(&probefile, probe).ok()?; + Command::new(rustc) + .arg("--edition=2018") + .arg("--crate-name=eyre_build") + .arg("--crate-type=lib") + .arg("--emit=metadata") + .arg("--out-dir") + .arg(out_dir) + .arg(probefile) + .status() + .ok() +} + +fn rustc_minor_version() -> Option<u32> { + let rustc = env::var_os("RUSTC")?; + let output = Command::new(rustc).arg("--version").output().ok()?; + let version = str::from_utf8(&output.stdout).ok()?; + let mut pieces = version.split('.'); + if pieces.next() != Some("rustc 1") { + return None; + } + pieces.next()?.parse().ok() +} |