fn main() {
if std::env::var_os("CARGO_FEATURE_BUILTIN_KERNELS").is_none() {
return; }
let kernels_dir = std::path::Path::new("../cpp/kernels");
if !kernels_dir.is_dir() {
panic!(
"feature `builtin-kernels` 需要 ../cpp/kernels/(C++ 内置算子),但它不存在。\n\
这些算子在 crate 目录之外,不随发布的 crate 一起分发 —— 因此该 feature 只在 \
lm-flow 仓库内可用。\n\
从 crates.io 使用请去掉该 feature(默认即纯 Rust 引擎),用 \
`lmflow::register_kernel::<T>()` 注册自己的 Rust 算子。"
);
}
let mut build = cc::Build::new();
build
.cpp(true)
.std("c++17")
.include("../include")
.warnings(true);
let mut kernels: Vec<std::path::PathBuf> = std::fs::read_dir(kernels_dir)
.expect("读取 ../cpp/kernels 目录失败")
.filter_map(|e| e.ok().map(|e| e.path()))
.filter(|p| p.extension().is_some_and(|x| x == "cc"))
.collect();
kernels.sort(); for k in &kernels {
build.file(k);
}
build.file("../cpp/abi_assert.cc");
build.compile("flow_cpp");
println!("cargo:rerun-if-changed=../cpp");
println!("cargo:rerun-if-changed=../include");
println!("cargo:include={}/../include", env!("CARGO_MANIFEST_DIR"));
}