Commit c4f8427b authored by Steven Fackler's avatar Steven Fackler
Browse files

Stop hardcoding things in openssl-sys build.rs

This more properly handles Windows builds as well as cross compiles.
parent 15ff737b
Loading
Loading
Loading
Loading
+23 −26
Original line number Diff line number Diff line
#![feature(env, path)]
#![feature(env, path, core)]

extern crate "pkg-config" as pkg_config;
extern crate gcc;
@@ -6,39 +6,36 @@ extern crate gcc;
use std::env;

fn main() {
    let target = env::var("TARGET").unwrap();

    if target.contains("android") {
        let path = env::var("OPENSSL_PATH").ok()
            .expect("Android does not provide openssl libraries, please build them yourself \
                     (instructions in the README) and provide their location through \
                     $OPENSSL_PATH.");
        println!("cargo:rustc-flags=-L native={} -l crypto:static -l ssl:static", path);
    if let Ok(info) = pkg_config::find_library("openssl") {
        build_old_openssl_shim(info.include_paths);
        return;
    }

    if target.contains("win32") || target.contains("win64") || target.contains("windows") {
        println!("cargo:rustc-flags=-l crypto -l ssl -l gdi32 -l wsock32");
        build_old_openssl_shim(vec![]);
        return;
    }
    let (libcrypto, libssl) = if env::var("TARGET").unwrap().contains("windows") {
    	("eay32", "ssl32")
    } else {
    	("crypto", "ssl")
    };

    let err = match pkg_config::find_library("openssl") {
        Ok(info) => {
            build_old_openssl_shim(info.include_paths);
            return;
        }
        Err(err) => err,
    let mode = if env::var_os("OPENSSL_STATIC").is_some() {
    	"static"
    } else {
    	"dylib"
    };

    // pkg-config doesn't know of OpenSSL on FreeBSD 10.1 and OpenBSD uses LibreSSL
    if target.contains("bsd") {
        println!("cargo:rustc-flags=-l crypto -l ssl");
        build_old_openssl_shim(vec![]);
        return;
    if let Ok(lib_dir) = env::var("OPENSSL_LIB_DIR") {
    	println!("cargo:rustc-flags=-L native={}", lib_dir);
    }

    println!("cargo:rustc-flags=-l {0}={1} -l {0}={2}", mode, libcrypto, libssl);

    let mut include_dirs = vec![];

    if let Ok(include_dir) = env::var("OPENSSL_INCLUDE_DIR") {
    	include_dirs.push(Path::new(include_dir));
    }

    panic!("unable to find openssl: {}", err);
    build_old_openssl_shim(include_dirs);
}

fn build_old_openssl_shim(include_paths: Vec<Path>) {