From f7e36925c566cd8336e71eb507c8a766240f03a0 Mon Sep 17 00:00:00 2001 From: Weicao-CatilGrass <1992414357@qq.com> Date: Mon, 9 Mar 2026 19:42:12 +0800 Subject: Add C FFI bindings for library usage --- build.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 11 deletions(-) (limited to 'build.rs') diff --git a/build.rs b/build.rs index d69d05e..4c8cec0 100644 --- a/build.rs +++ b/build.rs @@ -1,13 +1,64 @@ +use std::{env, path::PathBuf, str::FromStr}; + fn main() { + build_butck_ffi(); + #[cfg(target_os = "windows")] build_win32_gui(); } +fn build_butck_ffi() { + // Check if cbindgen is installed + let cbindgen_check = std::process::Command::new("cbindgen") + .arg("--version") + .output(); + + if let Err(e) = cbindgen_check { + if e.kind() == std::io::ErrorKind::NotFound { + eprintln!("Error: cbindgen is not installed. Please install it with:"); + eprintln!(" cargo install cbindgen"); + std::process::exit(1); + } else { + eprintln!("Error: Failed to check cbindgen installation: {}", e); + std::process::exit(1); + } + } + + let target_dir = get_target_dir(); + + // Try to run cbindgen to generate C bindings + // > cbindgen --config cbindgen.toml ffi --output ffi/.temp/jvlib.h --quiet + let output = std::process::Command::new("cbindgen") + .args([ + "--config", + "cbindgen.toml", + ".", + "--output", + &format!("{}/lib_butck.h", target_dir.display()), + "--quiet", + ]) + .output(); + + match output { + Ok(output) if output.status.success() => { + // Successfully generated bindings + } + Ok(_) => { + eprintln!("cbindgen failed to generate bindings"); + } + Err(e) if e.kind() == std::io::ErrorKind::NotFound => { + eprintln!("cbindgen not found, skipping C binding generation"); + } + Err(e) => { + eprintln!("Failed to run cbindgen: {}", e); + } + } +} + fn build_win32_gui() { use std::fs; - use std::path::{Path, PathBuf}; + use std::path::Path; use std::process::Command; - use std::str::FromStr; const EXE_NAME: &str = "butckg.exe"; @@ -34,15 +85,7 @@ fn build_win32_gui() { .join("gui\\win32\\build\\bin") .join(EXE_NAME); if exe_path.exists() { - let out_dir = std::env::var("OUT_DIR").unwrap(); - let out_dir_path = PathBuf::from_str(&out_dir).unwrap(); - let target_dir = out_dir_path - .parent() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap(); + let target_dir = get_target_dir(); let dest_path = target_dir.join(EXE_NAME); if let Err(e) = fs::copy(&exe_path, &dest_path) { @@ -55,3 +98,16 @@ fn build_win32_gui() { eprintln!("Warning: Executable not found at: {:?}", exe_path); } } + +fn get_target_dir() -> PathBuf { + let out_dir = std::env::var("OUT_DIR").unwrap(); + let out_dir_path = PathBuf::from_str(&out_dir).unwrap(); + out_dir_path + .parent() + .unwrap() + .parent() + .unwrap() + .parent() + .unwrap() + .to_path_buf() +} -- cgit