libsamplerate-sys 0.1.3

FFI bindings for libsamplerate
Documentation
extern crate bindgen;
extern crate pathdiff;

use pathdiff::diff_paths;
use std::env;
use std::fs;
use std::path::PathBuf;
use std::process::Command;

fn run(cmd: &mut Command) {
    match cmd.status() {
        Ok(status) => assert!(status.success()),
        Err(e) => panic!("Unable to execute {:?}! {}", cmd, e),
    }
}

fn build_libsamplerate_unix(src: &PathBuf, dst: &PathBuf) {
    run(Command::new("cmake").args(&["-DCMAKE_C_FLAGS=-fPIC", diff_paths(&src, &dst).unwrap().to_str().unwrap()]).current_dir(&dst));
    run(Command::new("make").args(&["samplerate"]).current_dir(&dst));
    let shlib = src.join("src/.libs");
    let _ = fs::copy(&shlib.join("libsamplerate.a"), &dst.join("libsamplerate.a"));
    println!("cargo:rustc-flags=-l static=samplerate");
    println!("cargo:rustc-flags=-L {}", dst.display());
    println!("cargo:rerun-if-changed={}", src.to_str().unwrap());
}

fn build_libsamplerate_windows(src: &PathBuf, dst: &PathBuf) {
    run(Command::new("cmake").args(&[
        "-DCMAKE_SYSTEM_NAME=Windows",
        "-DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc",
        "-DCMAKE_C_FLAGS=-fPIC",
        "-DBUILD_SHARED_LIBS=off",
        "-DWIN32=on",
        "-DSNDFILE_INCLUDE_DIR=/usr/include",
        "-DBUILD_EXAMPLES=OFF",
        diff_paths(&src, &dst).unwrap().to_str().unwrap(),
    ]).current_dir(&dst));
    run(Command::new("make").args(&["samplerate"]).current_dir(&dst));
    println!("cargo:rustc-flags=-l static=samplerate");
    println!("cargo:rustc-flags=-L {}", dst.display());
    println!("cargo:rerun-if-changed={}", src.to_str().unwrap());
}

fn main() {
    let src = PathBuf::from(&env::var_os("CARGO_MANIFEST_DIR").unwrap()).join("libsamplerate");
    let dst = PathBuf::from(&env::var_os("OUT_DIR").unwrap());
    let _ = fs::create_dir(&dst);
    match env::var("CARGO_CFG_TARGET_OS").as_ref().map(|x| &**x) {
        Ok("windows") => build_libsamplerate_windows(&src, &dst),
        _ => build_libsamplerate_unix(&src, &dst),
    };
    let bindings = bindgen::Builder::default()
        .header("wrapper.h")
        .generate()
        .expect("Unable to generate bindings");
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}