use std::env;
use std::path::PathBuf;
fn main() {
println!("cargo:rerun-if-changed=wrapper.cpp");
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let mut src_dir = manifest_dir.join("cpp");
if !src_dir.exists() {
src_dir = manifest_dir
.parent()
.expect("can't access ../src")
.join("src")
}
cc::Build::new()
.cpp(true)
.std("c++14")
.files([
src_dir.join("blockfilter.cpp"),
src_dir.join("crypto/sha256.cpp"),
src_dir.join("crypto/siphash.cpp"),
src_dir.join("primitives/block.cpp"),
src_dir.join("primitives/transaction.cpp"),
src_dir.join("script/script.cpp"),
src_dir.join("util/strencodings.cpp"),
src_dir.join("util/bytevectorhash.cpp"),
src_dir.join("uint256.cpp"),
manifest_dir.join("wrapper.cpp"),
])
.warnings(false)
.include(src_dir.as_path())
.compile("chikbip158");
let bindings = bindgen::Builder::default()
.header(manifest_dir.join("wrapper.h").to_str().unwrap())
.clang_arg("-x")
.clang_arg("c++")
.clang_arg(format!("-I{}", src_dir.to_str().unwrap()))
.clang_arg("-std=c++14")
.blocklist_item("GCSFilter.+")
.blocklist_item("ByteVector.*")
.opaque_type("GCSFilter")
.opaque_type("std.*")
.allowlist_type("GCSFilter")
.allowlist_type("Slice")
.allowlist_function("create_filter")
.allowlist_function("encode_filter")
.allowlist_function("filter_match")
.allowlist_function("filter_match_any")
.allowlist_function("free_slice")
.allowlist_function("free_filter")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}