diff options
Diffstat (limited to 'build.rs')
-rw-r--r-- | build.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..3eb15d1 --- /dev/null +++ b/build.rs @@ -0,0 +1,50 @@ +extern crate bindgen; + +use std::env; +use std::fs::File; +use std::io::prelude::*; +use std::path::Path; +use std::process::Command; + +pub const SOURCE_DIR: &'static str = "db-4.8.30"; + +fn bindgen(dir: &str) { + let db_h_file = Path::new(dir).join("include").join("db.h"); + let mut bindings = bindgen::Builder::new(db_h_file.to_string_lossy().into_owned()); + bindings.link("db", bindgen::LinkType::Dynamic); + bindings.builtins(); + bindings.convert_macros(true); + bindings.macro_int_types(["uint", "uint", "uint", "ulong", "sint", "sint", "sint", "slong"].iter().map(|r| *r)); + + let generated_bindings = bindings.generate().expect("Failed to generate bindings"); + let mut file = File::create("src/ffi.rs").expect("Failed to open file"); + file.write(generated_bindings.to_string().as_bytes()).unwrap(); +} + +fn build_unix(out_dir: &str) { + let build_dir = Path::new(SOURCE_DIR).join("build_unix"); + Command::new("../dist/configure") + .arg(&format!("--prefix={}", out_dir)) + .arg("--with-pic") + .current_dir(&build_dir) + .status() + .unwrap(); + Command::new("make") + .current_dir(&build_dir) + .status() + .unwrap(); + Command::new("make") + .arg(&"install") + .current_dir(&build_dir) + .status() + .unwrap(); + + println!("cargo:rustc-link-search=native={}", Path::new(&out_dir).join("lib").to_string_lossy()); + println!("cargo:rustc-link-lib=static=db"); +} + +fn main() { + let out_dir = env::var("OUT_DIR").unwrap(); + build_unix(&out_dir); + bindgen(&out_dir); +}
\ No newline at end of file |