solace-rs-sys 0.1.3

Solace binding generated by bindgen
extern crate bindgen;
use std::{env, io::Write, path::PathBuf};

#[cfg(target_os = "windows")]
const SOLCLIENT_GZ_PATH: &str = "solclient_Win_vs2015_7.26.1.8.tar.gz";

#[cfg(target_os = "macos")]
const SOLCLIENT_GZ_PATH: &str = "solclient_Darwin-universal2_opt_7.26.1.8.tar.gz";

#[cfg(all(target_os = "linux", target_arch = "x86_64"))]
const SOLCLIENT_GZ_PATH: &str = "solclient_Linux26-x86_64_opt_7.26.1.8.tar.gz";

#[cfg(all(target_os = "linux", target_arch = "aarch64"))]
const SOLCLIENT_GZ_PATH: &str = "solclient_Linux-aarch64_opt_7.26.1.8.tar.gz";

#[cfg(all(target_os = "linux", target_arch = "x86_64", target_env = "musl"))]
const SOLCLIENT_GZ_PATH: &str = "solclient_Linux_musl-x86_64_opt_7.26.1.8.tar.gz";

fn download_and_unpack(url: &str, tarball_path: PathBuf, tarball_unpack_path: PathBuf) {
    let resp = reqwest::blocking::get(url).unwrap();
    let content = resp.bytes().unwrap();

    let mut file_gz = std::fs::File::create(tarball_path.clone()).unwrap();
    file_gz.write_all(&content).unwrap();
    file_gz.sync_data().unwrap();

    let file_gz = std::fs::File::open(tarball_path).unwrap();
    let mut archive = tar::Archive::new(flate2::read::GzDecoder::new(file_gz));
    archive
        .entries()
        .unwrap()
        .filter_map(|r| r.ok())
        .map(|mut entry| -> std::io::Result<PathBuf> {
            let strip_path = entry.path()?.iter().skip(1).collect::<std::path::PathBuf>();
            let path = tarball_unpack_path.join(strip_path);
            entry.unpack(&path)?;
            Ok(path)
        })
        .filter_map(|e| e.ok())
        .for_each(|x| println!("> {}", x.display()));
}

fn main() {
    cfg_if::cfg_if! {
        if #[cfg(target_os = "windows")] {
            panic!("Windows not supported");
        }
    }

    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());

    let solclient_folder_name = "solclient-7.26.1.8";
    let solclient_folder_path = out_dir.join(solclient_folder_name);

    let solclient_tarball_default_url = format!(
        "https://github.com/asimsedhain/solace-rs/releases/download/0.0.0.0/{SOLCLIENT_GZ_PATH}"
    );

    let solclient_tarball_url =
        env::var("SOLCLIENT_TARBALL_URL").unwrap_or(solclient_tarball_default_url);

    let solclient_tarball_path = out_dir.join(format!("{solclient_folder_name}.tar.gz"));

    if !solclient_folder_path.is_dir() {
        eprintln!(
            "Solclient not found. Downloading from {}",
            solclient_tarball_url
        );
        download_and_unpack(
            &solclient_tarball_url,
            solclient_tarball_path,
            solclient_folder_path.clone(),
        );
    }

    let lib_dir = solclient_folder_path.join("lib");

    println!(
        "cargo:rustc-link-search=native={}",
        lib_dir.as_path().display()
    );

    cfg_if::cfg_if! {
        if #[cfg(target_os = "macos")] {
            println!("cargo:rustc-link-lib=dylib=gssapi_krb5");
        }
    }

    println!("cargo:rustc-link-lib=static=crypto");
    println!("cargo:rustc-link-lib=static=ssl");
    println!("cargo:rustc-link-lib=static=solclient");
    println!("cargo:rustc-link-lib=static=solclientssl");
}