use std::fs::metadata; use std::env; use std::fs::{self}; use std::path::{Path}; use std::process::{Command}; // use std::io::{stderr}; // use std::io::{self,Write}; static ARCHIVE: &'static str = "librocksdb.a"; static LIBNAME: &'static str = "rocksdb"; static PROJECT: &'static str = "rocksdb"; fn main() { configure_rocksdb(); } fn configure_rocksdb() { //let mut stderr = io::stderr(); let src = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).join(PROJECT); let archive = src.join(ARCHIVE); //writeln!(&mut stderr,"looking for {}", archive.display()).unwrap(); if !metadata(archive.clone()).is_ok() { let mut make = Command::new("make"); make.current_dir(&src); // writeln!(&mut stderr,"running: {:?}", make).unwrap(); let _ = make.arg("static_lib").status().unwrap(); } // writeln!(&mut stderr, "validating that archive exists").unwrap(); assert!(metadata(archive.clone()).is_ok(), "Error: archive does not exist after build"); // copy to the output folder let out = &env::var("OUT_DIR").unwrap(); let dst = Path::new(out); // writeln!(&mut stderr, "creating {}",dst.display()).unwrap(); let _ = fs::create_dir_all(&dst).unwrap(); match fs::copy(&archive, &dst.join(ARCHIVE)) { Ok(_) => {}, Err(a) => { panic!(format!("Error {:?} when copying \n{} \nto {}", a, archive.display(), dst.display())); } } println!("cargo:rustc-flags=-L native={} -l static={} -l dylib=stdc++ -l dylib=z -l dylib=bz2",dst.display(), LIBNAME); }