Lines
92.31 %
Functions
100 %
Branches
use std::process::Command;
fn main() {
let crate_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
// Rerun if source files change (for cbindgen)
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=src/generated.rs");
println!("cargo:rerun-if-changed=cbindgen.toml");
// Step 1: Generate Rust structs from org document using emacs
println!("cargo:rerun-if-changed=../../doc/nomisync-script-format.org");
let status = Command::new("emacs")
.args([
"-q",
"--batch",
"../../doc/nomisync-script-format.org",
"--eval",
"(setq org-confirm-babel-evaluate nil)",
"(org-babel-goto-named-src-block \"generate-structs\")",
"(org-babel-execute-src-block)",
"-f",
"kill-emacs",
])
.status();
match status {
Ok(s) if s.success() => {}
Ok(s) => eprintln!("Warning: org-babel-tangle exited with {s}"),
Err(e) => eprintln!("Warning: Failed to run emacs for org-babel-tangle: {e}"),
}
// Step 2: Generate C header from Rust code using cbindgen
let header_path = format!("{crate_dir}/scripting_format.h");
let config_path = format!("{crate_dir}/cbindgen.toml");
match cbindgen::Builder::new()
.with_crate(&crate_dir)
.with_config(cbindgen::Config::from_file(&config_path).unwrap())
.with_src(format!("{crate_dir}/src/lib.rs"))
.with_src(format!("{crate_dir}/src/generated.rs"))
.generate()
{
Ok(bindings) => {
bindings.write_to_file(&header_path);
eprintln!("Generated C header: {header_path}");
Err(e) => eprintln!("Warning: cbindgen failed: {e}"),