netlib-provider 0.4.1

The package provides BLAS and LAPACK using the Netlib implementation.
extern crate cmake;

use cmake::Config;
use std::env::var;
use std::fs::metadata;
use std::path::PathBuf;
use std::process::Command;

macro_rules! switch(($condition:expr) => (if $condition { "ON" } else { "OFF" }));

fn main() {
    let kind = if var("CARGO_FEATURE_STATIC").is_ok() { "static" } else { "dylib" };
    let cblas = var("CARGO_FEATURE_CBLAS").is_ok();
    let lapacke = var("CARGO_FEATURE_LAPACKE").is_ok();

    if !var("CARGO_FEATURE_SYSTEM").is_ok() {
        let source = PathBuf::from(&var("CARGO_MANIFEST_DIR").unwrap()).join("source");

        if metadata(&source.join("CBLAS/CMAKE")).is_err() {
            let _ = Command::new("ln")
                            .args(&["-s", "cmake", "CMAKE"])
                            .current_dir(&source.join("CBLAS"))
                            .status();
        }

        let output = Config::new(&source)
                            .define("BUILD_TESTING", "OFF")
                            .define("BUILD_SHARED_LIBS", switch!(kind == "dylib"))
                            .define("CBLAS", switch!(cblas))
                            .define("LAPACKE", switch!(lapacke))
                            .define("CMAKE_INSTALL_LIBDIR", "lib")
                            .build();

        println!("cargo:rustc-link-search={}", output.join("lib").display());
    }

    println!("cargo:rustc-link-lib={}=blas", kind);
    println!("cargo:rustc-link-lib={}=lapack", kind);
    println!("cargo:rustc-link-lib=dylib=gfortran");
    if cblas {
        println!("cargo:rustc-link-lib={}=cblas", kind);
    }
    if lapacke {
        println!("cargo:rustc-link-lib={}=lapacke", kind);
    }
}