diff options
author | Matthew Maurer <mmaurer@google.com> | 2020-06-02 11:14:58 -0700 |
---|---|---|
committer | Matthew Maurer <mmaurer@google.com> | 2020-06-02 11:14:58 -0700 |
commit | 8d6ab18cc73132d731cccc5778efabc27bece5a3 (patch) | |
tree | 9ae90daa1f25b66570ebbc66b4976c55e01f6923 /build.rs | |
parent | 7453dcebd20b0e025f469e7267e11f8e3bd3c0c4 (diff) | |
download | anyhow-8d6ab18cc73132d731cccc5778efabc27bece5a3.tar.gz |
Import anyhow-1.0.28
Change-Id: I004738cd6c92decd379de4e4b85ec925de956d12
Diffstat (limited to 'build.rs')
-rw-r--r-- | build.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..056164d --- /dev/null +++ b/build.rs @@ -0,0 +1,62 @@ +use std::env; +use std::fs; +use std::path::Path; +use std::process::{Command, ExitStatus}; + +// 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 anyhow. +const 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!() + } + } +"#; + +fn main() { + if !cfg!(feature = "std") { + return; + } + match compile_probe() { + Some(status) if status.success() => println!("cargo:rustc-cfg=backtrace"), + _ => {} + } +} + +fn compile_probe() -> 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=anyhow_build") + .arg("--crate-type=lib") + .arg("--emit=metadata") + .arg("--out-dir") + .arg(out_dir) + .arg(probefile) + .status() + .ok() +} |