use std::path::PathBuf;
pub struct Build {
fat_runtime: bool,
}
pub struct Artifacts {
pub include_dir: PathBuf,
pub lib_dir: PathBuf,
pub libs: Vec<String>,
}
impl Build {
pub fn new() -> Self {
Build { fat_runtime: true }
}
pub fn fat_runtime(&mut self, v: bool) -> &mut Self {
self.fat_runtime = v;
self
}
pub fn build(&mut self) -> Artifacts {
println!(
"cargo:warning=Vendored Vectorscan build — requires: cmake, C++ compiler, ragel, boost-dev"
);
let source_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("vectorscan");
let mut config = cmake::Config::new(source_dir);
config
.define("BUILD_STATIC_LIBS", "ON")
.define("BUILD_SHARED_LIBS", "OFF")
.define("CMAKE_BUILD_TYPE", "Release")
.define("CMAKE_INSTALL_LIBDIR", "lib")
.define("BUILD_UNIT", "OFF")
.define("BUILD_TOOLS", "OFF")
.define("BUILD_EXAMPLES", "OFF")
.define("BUILD_DOC", "OFF")
.define("BUILD_BENCHMARKS", "OFF")
.define("USE_CPU_NATIVE", "OFF");
if self.fat_runtime {
config.define("FAT_RUNTIME", "ON");
}
let dst = config.build();
let lib_dir = {
let candidates: Vec<PathBuf> = vec![
dst.join("lib"),
dst.join("lib64"),
dst.join(format!("lib/{}-linux-gnu", std::env::consts::ARCH)),
];
candidates
.into_iter()
.find(|d| d.join("libhs.a").exists())
.unwrap_or_else(|| dst.join("lib"))
};
println!("cargo:rustc-link-search=native={}", lib_dir.display());
println!("cargo:rustc-link-lib=static=hs");
println!("cargo:rustc-link-lib=static=hs_runtime");
Artifacts {
include_dir: dst.join("include"),
lib_dir,
libs: vec!["hs".into(), "hs_runtime".into()],
}
}
}