use std::env; use std::path::PathBuf; fn main() { let header = PathBuf::from("../../include/hunjing/lingtai.h") .canonicalize() .expect("找不到引擎公共头"); let bindings = bindgen::Builder::default() .header(header.to_string_lossy()) .allowlist_function("hj_.*") .allowlist_type("Hj.*") .allowlist_var("HJ_.*") .generate() .expect("bindgen 生成失败(需要 libclang)"); let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_dir.join("bindings.rs")) .expect("写 bindings.rs 失败"); println!("cargo:rerun-if-changed={}", header.display()); // 直接编译引擎源码(自包含) let src = PathBuf::from("../../src").canonicalize().expect("找不到引擎源码"); for cpp in ["lingtai.cpp", "transform.cpp", "modules.cpp"] { println!("cargo:rustc-cxx=g++"); let _ = cpp; } // 用 cc crate 风格手动调用:为最小依赖,此处直接输出编译指令给 rustc 链接预编译静态库 // 简化:编译为单个静态库由 build.rs 调用 clang++ // 逐个编译 .o,再归档为静态库 let objects: Vec<_> = ["lingtai.cpp", "transform.cpp", "modules.cpp"] .iter() .map(|cpp| { let obj = out_dir.join(format!("{}.o", cpp.replace(".cpp", ""))); let status = std::process::Command::new("clang++") .args(["-std=c++23", "-O2", "-c"]) .arg(src.join(cpp)) .arg("-I").arg(src.parent().unwrap().join("include")) .arg("-I").arg(&src) .arg("-fvisibility=hidden") .arg("-o").arg(&obj) .status() .expect("clang++ 启动失败"); assert!(status.success(), "引擎编译失败:{cpp}"); obj }) .collect(); let out_lib = out_dir.join("libhunjing_engine.a"); let status = std::process::Command::new("ar") .arg("crus").arg(&out_lib) .args(&objects) .status() .expect("ar 启动失败"); assert!(status.success(), "归档失败"); println!("cargo:rustc-link-search=native={}", out_dir.display()); println!("cargo:rustc-link-lib=static=hunjing_engine"); println!("cargo:rustc-link-lib=dylib=c++"); }