summaryrefslogtreecommitdiff
path: root/build.rs
diff options
context:
space:
mode:
authorWeicao-CatilGrass <1992414357@qq.com>2026-03-09 19:42:12 +0800
committerWeicao-CatilGrass <1992414357@qq.com>2026-03-09 19:42:12 +0800
commitf7e36925c566cd8336e71eb507c8a766240f03a0 (patch)
treeba92f1d6a69a738e00a1d77b5f19cbbe7c57deab /build.rs
parent2827668ab5f38c05f95a0060988313c449436267 (diff)
Add C FFI bindings for library usage
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs78
1 files changed, 67 insertions, 11 deletions
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()
+}