From 7a6260321db136d62dad56bfd5f7ac62d10d7940 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 10 Feb 2018 19:56:46 -0800 Subject: [PATCH] Detect FreeBSD OpenSSL automatically Closes #686 --- CHANGELOG.md | 4 ++++ openssl-sys/build.rs | 54 ++++++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7991824d..210c0052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +* OpenSSL is now automatically detected on FreeBSD systems. + ## [v0.10.2] - 2018-01-11 ### Added diff --git a/openssl-sys/build.rs b/openssl-sys/build.rs index ff875be5..3d682962 100644 --- a/openssl-sys/build.rs +++ b/openssl-sys/build.rs @@ -1,7 +1,7 @@ +extern crate cc; extern crate pkg_config; #[cfg(target_env = "msvc")] extern crate vcpkg; -extern crate cc; use std::collections::HashSet; use std::env; @@ -89,17 +89,15 @@ fn main() { let libs_env = env("OPENSSL_LIBS"); let libs = match libs_env.as_ref().and_then(|s| s.to_str()) { Some(ref v) => v.split(":").collect(), - None => { - match version { - Version::Openssl101 | - Version::Openssl102 if target.contains("windows") => vec!["ssleay32", "libeay32"], - Version::Openssl110 if target.contains("windows") => vec!["libssl", "libcrypto"], - _ => vec!["ssl", "crypto"], + None => match version { + Version::Openssl101 | Version::Openssl102 if target.contains("windows") => { + vec!["ssleay32", "libeay32"] } - } + Version::Openssl110 if target.contains("windows") => vec!["libssl", "libcrypto"], + _ => vec!["ssl", "crypto"], + }, }; - let kind = determine_mode(Path::new(&lib_dir), &libs); for lib in libs.into_iter() { println!("cargo:rustc-link-lib={}={}", kind, lib); @@ -109,7 +107,7 @@ fn main() { fn find_openssl_dir(target: &str) -> OsString { let host = env::var("HOST").unwrap(); - if host.contains("apple-darwin") && target.contains("apple-darwin") { + if host == target && target.contains("apple-darwin") { let homebrew = Path::new("/usr/local/opt/openssl@1.1"); if homebrew.exists() { return homebrew.to_path_buf().into(); @@ -123,6 +121,11 @@ fn find_openssl_dir(target: &str) -> OsString { try_pkg_config(); try_vcpkg(); + // FreeBSD ships with OpenSSL but doesn't include a pkg-config file :( + if host == target && target.contains("freebsd") { + return OsString::from("/usr"); + } + let mut msg = format!( " @@ -228,9 +231,10 @@ fn try_pkg_config() { return; } - let lib = match pkg_config::Config::new().print_system_libs(false).find( - "openssl", - ) { + let lib = match pkg_config::Config::new() + .print_system_libs(false) + .find("openssl") + { Ok(lib) => lib, Err(e) => { println!("run pkg_config fail: {:?}", e); @@ -253,7 +257,6 @@ fn try_pkg_config() { /// should emit all of the cargo metadata that we need. #[cfg(target_env = "msvc")] fn try_vcpkg() { - // vcpkg will not emit any metadata if it can not find libraries // appropriate for the target triple with the desired linkage. @@ -264,8 +267,10 @@ fn try_vcpkg() { .probe("openssl"); if let Err(e) = lib { - println!("note: vcpkg did not find openssl as libcrypto and libssl : {:?}", - e); + println!( + "note: vcpkg did not find openssl as libcrypto and libssl : {:?}", + e + ); lib = vcpkg::Config::new() .emit_includes(true) .lib_name("libeay32") @@ -273,8 +278,10 @@ fn try_vcpkg() { .probe("openssl"); } if let Err(e) = lib { - println!("note: vcpkg did not find openssl as ssleay32 and libeay32: {:?}", - e); + println!( + "note: vcpkg did not find openssl as ssleay32 and libeay32: {:?}", + e + ); return; } @@ -516,12 +523,11 @@ fn determine_mode(libdir: &Path, libs: &[&str]) -> &'static str { .map(|e| e.file_name()) .filter_map(|e| e.into_string().ok()) .collect::>(); - let can_static = libs.iter().all(|l| { - files.contains(&format!("lib{}.a", l)) || files.contains(&format!("{}.lib", l)) - }); + let can_static = libs.iter() + .all(|l| files.contains(&format!("lib{}.a", l)) || files.contains(&format!("{}.lib", l))); let can_dylib = libs.iter().all(|l| { - files.contains(&format!("lib{}.so", l)) || files.contains(&format!("{}.dll", l)) || - files.contains(&format!("lib{}.dylib", l)) + files.contains(&format!("lib{}.so", l)) || files.contains(&format!("{}.dll", l)) + || files.contains(&format!("lib{}.dylib", l)) }); match (can_static, can_dylib) { (true, false) => return "static", @@ -529,7 +535,7 @@ fn determine_mode(libdir: &Path, libs: &[&str]) -> &'static str { (false, false) => { panic!( "OpenSSL libdir at `{}` does not contain the required files \ - to either statically or dynamically link OpenSSL", + to either statically or dynamically link OpenSSL", libdir.display() ); }