252 lines
11 KiB
Rust
252 lines
11 KiB
Rust
use curl::easy::Easy;
|
|
use flate2::read::GzDecoder;
|
|
use std::io::Write;
|
|
use std::path::{Path, PathBuf};
|
|
use std::process::Command;
|
|
use std::{env, fs, io};
|
|
use tar::Archive;
|
|
|
|
const CBLAS_SRC: &str = "https://codeload.github.com/andreytkachenko/cblas/tar.gz/v3.6.0";
|
|
|
|
fn download<P: AsRef<Path>>(source_url: &str, target_file: P) -> anyhow::Result<()> {
|
|
let f = fs::File::create(&target_file)?;
|
|
let mut writer = io::BufWriter::new(f);
|
|
let mut easy = Easy::new();
|
|
|
|
easy.useragent("Curl Download")?;
|
|
easy.url(source_url)?;
|
|
easy.write_function(move |data| Ok(writer.write(data).unwrap()))?;
|
|
easy.perform()?;
|
|
|
|
let response_code = easy.response_code()?;
|
|
if response_code == 200 {
|
|
Ok(())
|
|
} else {
|
|
Err(anyhow::anyhow!(
|
|
"Unexpected response code {} for {}",
|
|
response_code,
|
|
source_url
|
|
))
|
|
}
|
|
}
|
|
|
|
fn extract<P1: AsRef<Path>, P2: AsRef<Path>>(filename: P1, outpath: P2) -> anyhow::Result<()> {
|
|
let file = fs::File::open(&filename)?;
|
|
let tar = GzDecoder::new(file);
|
|
let mut archive = Archive::new(tar);
|
|
archive.unpack(outpath.as_ref())?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn main() {
|
|
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
|
|
let cblas_name = out_path.join("cblas.tgz");
|
|
let cblas_dir = out_path.join("cblas-3.6.0");
|
|
|
|
if !cblas_dir.exists() {
|
|
download(CBLAS_SRC, &cblas_name).unwrap();
|
|
extract(cblas_name, &out_path).unwrap();
|
|
}
|
|
|
|
|
|
Command::new("gfortran")
|
|
.current_dir(cblas_dir.join("src"))
|
|
.arg("-O3")
|
|
.arg("-c").arg(cblas_dir.join("src/cdotcsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/cdotusub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/dasumsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/ddotsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/dnrm2sub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/dsdotsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/dzasumsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/dznrm2sub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/icamaxsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/idamaxsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/isamaxsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/izamaxsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/sasumsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/scasumsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/scnrm2sub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/sdotsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/sdsdotsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/snrm2sub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/zdotcsub.f"))
|
|
.arg("-c").arg(cblas_dir.join("src/zdotusub.f"))
|
|
.status()
|
|
.expect("fortran failed");
|
|
|
|
cc::Build::new()
|
|
.warnings(false)
|
|
.extra_warnings(false)
|
|
.static_flag(true)
|
|
.define("ADD_", None)
|
|
.include(cblas_dir.join("include"))
|
|
.object(cblas_dir.join("src/cdotcsub.o"))
|
|
.object(cblas_dir.join("src/cdotusub.o"))
|
|
.object(cblas_dir.join("src/dasumsub.o"))
|
|
.object(cblas_dir.join("src/ddotsub.o"))
|
|
.object(cblas_dir.join("src/dnrm2sub.o"))
|
|
.object(cblas_dir.join("src/dsdotsub.o"))
|
|
.object(cblas_dir.join("src/dzasumsub.o"))
|
|
.object(cblas_dir.join("src/dznrm2sub.o"))
|
|
.object(cblas_dir.join("src/icamaxsub.o"))
|
|
.object(cblas_dir.join("src/idamaxsub.o"))
|
|
.object(cblas_dir.join("src/isamaxsub.o"))
|
|
.object(cblas_dir.join("src/izamaxsub.o"))
|
|
.object(cblas_dir.join("src/sasumsub.o"))
|
|
.object(cblas_dir.join("src/scasumsub.o"))
|
|
.object(cblas_dir.join("src/scnrm2sub.o"))
|
|
.object(cblas_dir.join("src/sdotsub.o"))
|
|
.object(cblas_dir.join("src/sdsdotsub.o"))
|
|
.object(cblas_dir.join("src/snrm2sub.o"))
|
|
.object(cblas_dir.join("src/zdotcsub.o"))
|
|
.object(cblas_dir.join("src/zdotusub.o"))
|
|
.file(cblas_dir.join("src/cblas_caxpy.c"))
|
|
.file(cblas_dir.join("src/cblas_ccopy.c"))
|
|
.file(cblas_dir.join("src/cblas_cdotc_sub.c"))
|
|
.file(cblas_dir.join("src/cblas_cdotu_sub.c"))
|
|
.file(cblas_dir.join("src/cblas_cgbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_cgemm.c"))
|
|
.file(cblas_dir.join("src/cblas_cgemv.c"))
|
|
.file(cblas_dir.join("src/cblas_cgerc.c"))
|
|
.file(cblas_dir.join("src/cblas_cgeru.c"))
|
|
.file(cblas_dir.join("src/cblas_chbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_chemm.c"))
|
|
.file(cblas_dir.join("src/cblas_chemv.c"))
|
|
.file(cblas_dir.join("src/cblas_cher.c"))
|
|
.file(cblas_dir.join("src/cblas_cher2.c"))
|
|
.file(cblas_dir.join("src/cblas_cher2k.c"))
|
|
.file(cblas_dir.join("src/cblas_cherk.c"))
|
|
.file(cblas_dir.join("src/cblas_chpmv.c"))
|
|
.file(cblas_dir.join("src/cblas_chpr.c"))
|
|
.file(cblas_dir.join("src/cblas_chpr2.c"))
|
|
.file(cblas_dir.join("src/cblas_cscal.c"))
|
|
.file(cblas_dir.join("src/cblas_csscal.c"))
|
|
.file(cblas_dir.join("src/cblas_cswap.c"))
|
|
.file(cblas_dir.join("src/cblas_csymm.c"))
|
|
.file(cblas_dir.join("src/cblas_csyr2k.c"))
|
|
.file(cblas_dir.join("src/cblas_csyrk.c"))
|
|
.file(cblas_dir.join("src/cblas_ctbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_ctbsv.c"))
|
|
.file(cblas_dir.join("src/cblas_ctpmv.c"))
|
|
.file(cblas_dir.join("src/cblas_ctpsv.c"))
|
|
.file(cblas_dir.join("src/cblas_ctrmm.c"))
|
|
.file(cblas_dir.join("src/cblas_ctrmv.c"))
|
|
.file(cblas_dir.join("src/cblas_ctrsm.c"))
|
|
.file(cblas_dir.join("src/cblas_ctrsv.c"))
|
|
.file(cblas_dir.join("src/cblas_dasum.c"))
|
|
.file(cblas_dir.join("src/cblas_daxpy.c"))
|
|
.file(cblas_dir.join("src/cblas_dcopy.c"))
|
|
.file(cblas_dir.join("src/cblas_ddot.c"))
|
|
.file(cblas_dir.join("src/cblas_dgbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_dgemm.c"))
|
|
.file(cblas_dir.join("src/cblas_dgemv.c"))
|
|
.file(cblas_dir.join("src/cblas_dger.c"))
|
|
.file(cblas_dir.join("src/cblas_dnrm2.c"))
|
|
.file(cblas_dir.join("src/cblas_drot.c"))
|
|
.file(cblas_dir.join("src/cblas_drotg.c"))
|
|
.file(cblas_dir.join("src/cblas_drotm.c"))
|
|
.file(cblas_dir.join("src/cblas_drotmg.c"))
|
|
.file(cblas_dir.join("src/cblas_dsbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_dscal.c"))
|
|
.file(cblas_dir.join("src/cblas_dsdot.c"))
|
|
.file(cblas_dir.join("src/cblas_dspmv.c"))
|
|
.file(cblas_dir.join("src/cblas_dspr.c"))
|
|
.file(cblas_dir.join("src/cblas_dspr2.c"))
|
|
.file(cblas_dir.join("src/cblas_dswap.c"))
|
|
.file(cblas_dir.join("src/cblas_dsymm.c"))
|
|
.file(cblas_dir.join("src/cblas_dsymv.c"))
|
|
.file(cblas_dir.join("src/cblas_dsyr.c"))
|
|
.file(cblas_dir.join("src/cblas_dsyr2.c"))
|
|
.file(cblas_dir.join("src/cblas_dsyr2k.c"))
|
|
.file(cblas_dir.join("src/cblas_dsyrk.c"))
|
|
.file(cblas_dir.join("src/cblas_dtbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_dtbsv.c"))
|
|
.file(cblas_dir.join("src/cblas_dtpmv.c"))
|
|
.file(cblas_dir.join("src/cblas_dtpsv.c"))
|
|
.file(cblas_dir.join("src/cblas_dtrmm.c"))
|
|
.file(cblas_dir.join("src/cblas_dtrmv.c"))
|
|
.file(cblas_dir.join("src/cblas_dtrsm.c"))
|
|
.file(cblas_dir.join("src/cblas_dtrsv.c"))
|
|
.file(cblas_dir.join("src/cblas_dzasum.c"))
|
|
.file(cblas_dir.join("src/cblas_dznrm2.c"))
|
|
.file(cblas_dir.join("src/cblas_globals.c"))
|
|
.file(cblas_dir.join("src/cblas_icamax.c"))
|
|
.file(cblas_dir.join("src/cblas_idamax.c"))
|
|
.file(cblas_dir.join("src/cblas_isamax.c"))
|
|
.file(cblas_dir.join("src/cblas_izamax.c"))
|
|
.file(cblas_dir.join("src/cblas_sasum.c"))
|
|
.file(cblas_dir.join("src/cblas_saxpy.c"))
|
|
.file(cblas_dir.join("src/cblas_scasum.c"))
|
|
.file(cblas_dir.join("src/cblas_scnrm2.c"))
|
|
.file(cblas_dir.join("src/cblas_scopy.c"))
|
|
.file(cblas_dir.join("src/cblas_sdot.c"))
|
|
.file(cblas_dir.join("src/cblas_sdsdot.c"))
|
|
.file(cblas_dir.join("src/cblas_sgbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_sgemm.c"))
|
|
.file(cblas_dir.join("src/cblas_sgemv.c"))
|
|
.file(cblas_dir.join("src/cblas_sger.c"))
|
|
.file(cblas_dir.join("src/cblas_snrm2.c"))
|
|
.file(cblas_dir.join("src/cblas_srot.c"))
|
|
.file(cblas_dir.join("src/cblas_srotg.c"))
|
|
.file(cblas_dir.join("src/cblas_srotm.c"))
|
|
.file(cblas_dir.join("src/cblas_srotmg.c"))
|
|
.file(cblas_dir.join("src/cblas_ssbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_sscal.c"))
|
|
.file(cblas_dir.join("src/cblas_sspmv.c"))
|
|
.file(cblas_dir.join("src/cblas_sspr.c"))
|
|
.file(cblas_dir.join("src/cblas_sspr2.c"))
|
|
.file(cblas_dir.join("src/cblas_sswap.c"))
|
|
.file(cblas_dir.join("src/cblas_ssymm.c"))
|
|
.file(cblas_dir.join("src/cblas_ssymv.c"))
|
|
.file(cblas_dir.join("src/cblas_ssyr.c"))
|
|
.file(cblas_dir.join("src/cblas_ssyr2.c"))
|
|
.file(cblas_dir.join("src/cblas_ssyr2k.c"))
|
|
.file(cblas_dir.join("src/cblas_ssyrk.c"))
|
|
.file(cblas_dir.join("src/cblas_stbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_stbsv.c"))
|
|
.file(cblas_dir.join("src/cblas_stpmv.c"))
|
|
.file(cblas_dir.join("src/cblas_stpsv.c"))
|
|
.file(cblas_dir.join("src/cblas_strmm.c"))
|
|
.file(cblas_dir.join("src/cblas_strmv.c"))
|
|
.file(cblas_dir.join("src/cblas_strsm.c"))
|
|
.file(cblas_dir.join("src/cblas_strsv.c"))
|
|
.file(cblas_dir.join("src/cblas_xerbla.c"))
|
|
.file(cblas_dir.join("src/cblas_zaxpy.c"))
|
|
.file(cblas_dir.join("src/cblas_zcopy.c"))
|
|
.file(cblas_dir.join("src/cblas_zdotc_sub.c"))
|
|
.file(cblas_dir.join("src/cblas_zdotu_sub.c"))
|
|
.file(cblas_dir.join("src/cblas_zdscal.c"))
|
|
.file(cblas_dir.join("src/cblas_zgbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_zgemm.c"))
|
|
.file(cblas_dir.join("src/cblas_zgemv.c"))
|
|
.file(cblas_dir.join("src/cblas_zgerc.c"))
|
|
.file(cblas_dir.join("src/cblas_zgeru.c"))
|
|
.file(cblas_dir.join("src/cblas_zhbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_zhemm.c"))
|
|
.file(cblas_dir.join("src/cblas_zhemv.c"))
|
|
.file(cblas_dir.join("src/cblas_zher.c"))
|
|
.file(cblas_dir.join("src/cblas_zher2.c"))
|
|
.file(cblas_dir.join("src/cblas_zher2k.c"))
|
|
.file(cblas_dir.join("src/cblas_zherk.c"))
|
|
.file(cblas_dir.join("src/cblas_zhpmv.c"))
|
|
.file(cblas_dir.join("src/cblas_zhpr.c"))
|
|
.file(cblas_dir.join("src/cblas_zhpr2.c"))
|
|
.file(cblas_dir.join("src/cblas_zscal.c"))
|
|
.file(cblas_dir.join("src/cblas_zswap.c"))
|
|
.file(cblas_dir.join("src/cblas_zsymm.c"))
|
|
.file(cblas_dir.join("src/cblas_zsyr2k.c"))
|
|
.file(cblas_dir.join("src/cblas_zsyrk.c"))
|
|
.file(cblas_dir.join("src/cblas_ztbmv.c"))
|
|
.file(cblas_dir.join("src/cblas_ztbsv.c"))
|
|
.file(cblas_dir.join("src/cblas_ztpmv.c"))
|
|
.file(cblas_dir.join("src/cblas_ztpsv.c"))
|
|
.file(cblas_dir.join("src/cblas_ztrmm.c"))
|
|
.file(cblas_dir.join("src/cblas_ztrmv.c"))
|
|
.file(cblas_dir.join("src/cblas_ztrsm.c"))
|
|
.file(cblas_dir.join("src/cblas_ztrsv.c"))
|
|
// TODO build fortran files aswell
|
|
.compile("libcblas");
|
|
}
|