1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
extern crate bindgen;
fn create_svn_bindings(
svn_path: &std::path::Path,
out_path: &std::path::Path,
include_paths: &[&std::path::Path],
) {
let client_feature_enabled = std::env::var("CARGO_FEATURE_CLIENT").is_ok();
let mut builder = bindgen::Builder::default()
.header(svn_path.join("svn_dirent_uri.h").to_str().unwrap())
.header(svn_path.join("svn_version.h").to_str().unwrap())
.header(svn_path.join("svn_error.h").to_str().unwrap())
.header(svn_path.join("svn_opt.h").to_str().unwrap())
.header(svn_path.join("svn_repos.h").to_str().unwrap())
.header(svn_path.join("svn_time.h").to_str().unwrap())
.header(svn_path.join("svn_types.h").to_str().unwrap())
.header(svn_path.join("svn_types_impl.h").to_str().unwrap())
.header(svn_path.join("svn_wc.h").to_str().unwrap())
.header(svn_path.join("svn_props.h").to_str().unwrap())
.allowlist_file(".*/svn_.*.h")
.blocklist_type("apr_.*")
.derive_default(true)
.clang_args(
include_paths
.iter()
.map(|path| format!("-I{}", path.display())),
);
if client_feature_enabled {
builder = builder.header(svn_path.join("svn_client.h").to_str().unwrap());
}
// Generate bindings using bindgen
let svn_bindings = builder.generate().expect("Failed to generate bindings");
svn_bindings
.write_to_file(out_path.join("subversion.rs"))
.expect("Failed to write bindings");
}
fn main() {
let deps = system_deps::Config::new().probe().unwrap();
let svn = deps.get_by_name("libsvn_subr").unwrap();
let svn_path = svn
.include_paths
.iter()
.find(|x| x.join("svn_config.h").exists())
.expect("Failed to find svn_config.h");
let out_path = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
create_svn_bindings(
svn_path.as_path(),
out_path.as_path(),
svn.include_paths
.iter()
.map(|x| x.as_path())
.collect::<Vec<_>>()
.as_slice(),
);
}
|