extern crate cc;
extern crate cmake;
use std::path::PathBuf;
use cc::Build;
use std::{env, str};
use cmake::Config;
fn main() {
let mut build = build_rocksdb();
build.cpp(true).file("crocksdb/c.cc");
if !cfg!(target_os = "windows") {
build.flag("-std=c++11");
}
link_cpp(&mut build);
build.warnings(false).compile("libcrocksdb.a");
}
fn link_cpp(build: &mut Build) {
let tool = build.get_compiler();
let stdlib = if tool.is_like_gnu() {
"libstdc++.a"
} else if tool.is_like_clang() {
"libc++.a"
} else {
return;
};
let output = tool.to_command().arg("--print-file-name").arg(stdlib).output().unwrap();
if !output.status.success() || output.stdout.is_empty() {
return;
}
let path = match str::from_utf8(&output.stdout) {
Ok(path) => PathBuf::from(path),
Err(_) => return,
};
if !path.is_absolute() {
return;
}
println!("cargo:rustc-link-lib=static={}", &stdlib[3..stdlib.len() - 2]);
println!("cargo:rustc-link-search=native={}", path.parent().unwrap().display());
build.cpp_link_stdlib(None);
}
fn build_rocksdb() -> Build {
let mut build = Build::new();
for e in env::vars() {
println!("{:?}", e);
}
let mut cfg = Config::new("rocksdb");
if cfg!(feature = "portable") {
cfg.define("PORTABLE", "ON");
}
if cfg!(feature = "sse") {
cfg.define("FORCE_SSE42", "ON");
}
let dst = cfg.register_dep("Z").define("WITH_ZLIB", "ON")
.register_dep("BZIP2").define("WITH_BZ2", "ON")
.register_dep("ZSTD").define("WITH_ZSTD", "ON")
.build_target("rocksdb").build();
let build_dir = format!("{}/build", dst.display());
if cfg!(target_os = "windows") {
let profile = match &*env::var("PROFILE").unwrap_or("debug".to_owned()) {
"bench" | "release" => "Release",
_ => "Debug",
};
println!("cargo:rustc-link-search=native={}/{}", build_dir, profile);
build.define("OS_WIN", None);
} else {
println!("cargo:rustc-link-search=native={}", build_dir);
build.define("ROCKSDB_PLATFORM_POSIX", None);
}
if cfg!(target_os = "macos") {
build.define("OS_MACOSX", None);
}
let cur_dir = env::current_dir().unwrap();
build.include(cur_dir.join("rocksdb").join("include"));
build.include(cur_dir.join("rocksdb"));
println!("cargo:rustc-link-lib=static=rocksdb");
println!("cargo:rustc-link-lib=static=z");
println!("cargo:rustc-link-lib=static=bz2");
println!("cargo:rustc-link-lib=static=zstd");
build
}