From 856a9e7c785d27ab83b1745c30c62a32e194132b Mon Sep 17 00:00:00 2001 From: Nathan Fiedler Date: Tue, 22 Mar 2016 20:56:09 -0700 Subject: [PATCH] Handle building on macos a little better First, only add the special environment variable when building on Mac OS X. Second, look for the path to ensure the Xcode command line tools are installed, and panic if that is not the case. cargo test passes --- build.rs | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/build.rs b/build.rs index e95e399..c0b9be6 100644 --- a/build.rs +++ b/build.rs @@ -21,6 +21,7 @@ use std::path::Path; use std::process::Command; static HEADER: &'static str = "#include \n"; +static LIBPATH: &'static str = "/Library/Developer/CommandLineTools/usr/lib"; fn main() { // @@ -69,17 +70,24 @@ fn main() { let mw_ldflags = std::str::from_utf8(&mw_ldflags_output.stdout).unwrap().trim(); let mw_ldflags_arr: Vec<&str> = mw_ldflags.split_whitespace().collect(); // Combine all of that in the invocation of rust-bindgen. - Command::new("./rust-bindgen/target/debug/bindgen") - // always include this even though it only makes sense on Mac to - // work around https://github.com/crabtw/rust-bindgen/issues/89 - .env("DYLD_LIBRARY_PATH", "/Library/Developer/CommandLineTools/usr/lib") - .args(&mw_cflags_arr[..]) - .arg("-builtins") - .arg("-o") - .arg("src/bindings.rs") - .args(&mw_ldflags_arr[..]) - .arg("gen.h") - .status().unwrap(); + let mut cmd = &mut Command::new("./rust-bindgen/target/debug/bindgen"); + if cfg!(target_os = "macos") { + // Mac requires that the xcode tools are installed so that + // rustc can find the clang.dylib file. See also issue + // https://github.com/crabtw/rust-bindgen/issues/89 + let lib_path = Path::new(LIBPATH); + if !lib_path.exists() { + panic!("missing {}, run xcode-select --install", LIBPATH); + } + cmd.env("DYLD_LIBRARY_PATH", LIBPATH); + } + cmd.args(&mw_cflags_arr[..]) + .arg("-builtins") + .arg("-o") + .arg("src/bindings.rs") + .args(&mw_ldflags_arr[..]) + .arg("gen.h") + .status().unwrap(); // how to get the output of the command... // let output = Commad::new(...).output().unwrap(); // let out = std::str::from_utf8(&output.stdout).unwrap();