diff --git a/README.md b/README.md index 33727d0de7da419fd58be080d2608fba7848ff32..16155fbde95566bbe1c5058abaa6f14f7d29169f 100644 --- a/README.md +++ b/README.md @@ -48,25 +48,25 @@ make -j$(nproc) make install ``` -### OSX +### macOS -Although OpenSSL 0.9.8 is preinstalled on OSX this library is being phased out -of OSX and this crate also does not support that version of OpenSSL. To use this -crate on OSX you'll need to install OpenSSL via some alternate means, typically +Although OpenSSL 0.9.8 is preinstalled on macOS this library is being phased out +of macOS and this crate also does not support that version of OpenSSL. To use this +crate on macOS you'll need to install OpenSSL via some alternate means, typically Homebrew: ```bash brew install openssl ``` -Occasionally an update of XCode or MacOS will cause the linker to fail after compilation, to rectify this you may want to try and run: +Occasionally an update of XCode or macOS will cause the linker to fail after compilation, to rectify this you may want to try and run: ```bash xcode-select --install ``` -If Homebrew is installed to the default location of `/usr/local`, OpenSSL will be -automatically detected. +If you're using latest version of Homebrew which supports `--prefix` command, +OpenSSL will be automatically detected. ### Windows MSVC diff --git a/openssl-sys/build.rs b/openssl-sys/build.rs index 0b8341fad06bd56b4ece86f5451ff57170b4bba2..c5630556dc8e721ad79c568ab9edce8f2ebdfcbc 100644 --- a/openssl-sys/build.rs +++ b/openssl-sys/build.rs @@ -104,6 +104,8 @@ fn find_openssl_dir(target: &str) -> OsString { let host = env::var("HOST").unwrap(); if host == target && target.contains("apple-darwin") { + // Check up default Homebrew installation location first + // for quick resolution if possible. let homebrew = Path::new("/usr/local/opt/openssl@1.1"); if homebrew.exists() { return homebrew.to_path_buf().into(); @@ -112,6 +114,22 @@ fn find_openssl_dir(target: &str) -> OsString { if homebrew.exists() { return homebrew.to_path_buf().into(); } + // Calling `brew --prefix ` command usually slow and + // takes seconds, and will be used only as a last resort. + let output = execute_command_and_get_output("brew", &["--prefix", "openssl@1.1"]); + if let Some(ref output) = output { + let homebrew = Path::new(&output); + if homebrew.exists() { + return homebrew.to_path_buf().into(); + } + } + let output = execute_command_and_get_output("brew", &["--prefix", "openssl"]); + if let Some(ref output) = output { + let homebrew = Path::new(&output); + if homebrew.exists() { + return homebrew.to_path_buf().into(); + } + } } try_pkg_config(); @@ -548,3 +566,19 @@ fn determine_mode(libdir: &Path, libs: &[&str]) -> &'static str { // practices with security libs", let's link dynamically. "dylib" } + + + +fn execute_command_and_get_output(cmd: &str, args: &[&str]) -> Option { + let out = Command::new(cmd).args(args).output(); + if let Ok(ref r1) = out { + if r1.status.success() { + let r2 = String::from_utf8(r1.stdout.clone()); + if let Ok(r3) = r2 { + return Some(r3.trim().to_string()); + } + } + } + return None; +} +