extern crate cbindgen; extern crate cc; use std::fs::DirEntry; // include src/header directories that don't start with '_' #[allow(dead_code)] fn include_dir(d: &DirEntry) -> bool { d.metadata().map(|m| m.is_dir()).unwrap_or(false) && d.path() .iter() .nth(2) .map_or(false, |c| c.to_str().map_or(false, |x| !x.starts_with("_"))) } // fn generate_bindings(cbindgen_config_path: &Path) { // let relative_path = cbindgen_config_path // .strip_prefix("src/header") // .ok() // .and_then(|p| p.parent()) // .and_then(|p| p.to_str()) // .unwrap() // .replace("_", "/"); // let header_path = Path::new("target/include") // .join(&relative_path) // .with_extension("h"); // let mod_path = cbindgen_config_path.with_file_name("mod.rs"); // let config = cbindgen::Config::from_file(cbindgen_config_path).unwrap(); // cbindgen::Builder::new() // .with_config(config) // .with_src(mod_path) // .generate() // .expect("Unable to generate bindings") // .write_to_file(header_path); // } fn main() { // let crate_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); // Generate C includes // - based on contents of src/header/** // - headers written to target/include // fs::read_dir(&Path::new("src/header")) // .unwrap() // .into_iter() // .filter_map(Result::ok) // .filter(|d| include_dir(d)) // .map(|d| d.path().as_path().join("cbindgen.toml")) // .filter(|p| p.exists()) // .for_each(|p| { // println!("cargo:rerun-if-changed={:?}", p.parent().unwrap()); // println!("cargo:rerun-if-changed={:?}", p); // println!("cargo:rerun-if-changed={:?}", p.with_file_name("mod.rs")); // generate_bindings(&p); // }); // // 指定链接搜索路径 // println!("cargo:rustc-link-search=native=./dlibc"); // // 链接 dlibc 库 // println!("cargo:rustc-link-lib=dlibc"); }