netlib-src 0.8.0

The package provides a source of BLAS and LAPACK via Netlib.
Documentation
extern crate cmake;

use cmake::Config;
use std::path::Path;
use std::{env, fs};

macro_rules! feature(($name:expr) => (env::var(concat!("CARGO_FEATURE_", $name)).is_ok()));
macro_rules! switch(($condition:expr) => (if $condition { "ON" } else { "OFF" }));

fn main() {
    let mut suffix = "";
    let kind = if feature!("STATIC") {
        "static"
    } else {
        "dylib"
    };
    let cblas = feature!("CBLAS");
    let lapacke = feature!("LAPACKE");
    let tmg = feature!("TMG");
    if !feature!("SYSTEM") {
        suffix = "-netlib";
        let output = Config::new("source")
            .define("BUILD_TESTING", "OFF")
            .define("BUILD_SHARED_LIBS", switch!(kind == "dylib"))
            .define("CBLAS", switch!(cblas))
            .define("LAPACKE_WITH_TMG", switch!(lapacke && tmg))
            .define("CMAKE_INSTALL_LIBDIR", "lib")
            .build();
        let output = output.join("lib");
        rename(&output, "blas", suffix);
        rename(&output, "lapack", suffix);
        println!("cargo:rustc-link-search={}", output.display());
    }
    println!("cargo:rustc-link-lib=dylib=gfortran");
    println!("cargo:rustc-link-lib={}=blas{}", kind, suffix);
    println!("cargo:rustc-link-lib={}=lapack{}", kind, suffix);
    if cblas {
        println!("cargo:rustc-link-lib={}=cblas", kind);
    }
    if lapacke {
        println!("cargo:rustc-link-lib={}=lapacke", kind);
        if tmg {
            println!("cargo:rustc-link-lib={}=tmglib", kind);
        }
    }
}

fn rename(directory: &Path, name: &str, suffix: &str) {
    for entry in fs::read_dir(directory).unwrap() {
        let path = entry.unwrap().path();
        let stem = path.file_stem().unwrap().to_str().unwrap();
        if !stem.starts_with("lib") || &stem[3..] != name {
            continue;
        }
        let mut new_path = path.clone();
        new_path.set_file_name(format!("lib{}{}", name, suffix));
        new_path.set_extension(path.extension().unwrap());
        fs::rename(&path, &new_path).unwrap();
        return;
    }
}