aboutsummaryrefslogtreecommitdiff
path: root/build.rs
diff options
context:
space:
mode:
authorMatthew Maurer <mmaurer@google.com>2020-06-02 11:14:58 -0700
committerMatthew Maurer <mmaurer@google.com>2020-06-02 11:14:58 -0700
commit8d6ab18cc73132d731cccc5778efabc27bece5a3 (patch)
tree9ae90daa1f25b66570ebbc66b4976c55e01f6923 /build.rs
parent7453dcebd20b0e025f469e7267e11f8e3bd3c0c4 (diff)
downloadanyhow-8d6ab18cc73132d731cccc5778efabc27bece5a3.tar.gz
Import anyhow-1.0.28
Change-Id: I004738cd6c92decd379de4e4b85ec925de956d12
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs62
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()
+}