1
use std::process::Command;
2

            
3
4
fn main() {
4
4
    let crate_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
5

            
6
    // Rerun if source files change (for cbindgen)
7
4
    println!("cargo:rerun-if-changed=src/lib.rs");
8
4
    println!("cargo:rerun-if-changed=src/generated.rs");
9
4
    println!("cargo:rerun-if-changed=cbindgen.toml");
10

            
11
    // Step 1: Generate Rust structs from org document using emacs
12
4
    println!("cargo:rerun-if-changed=../../doc/nomisync-script-format.org");
13

            
14
4
    let status = Command::new("emacs")
15
4
        .args([
16
4
            "-q",
17
4
            "--batch",
18
4
            "../../doc/nomisync-script-format.org",
19
4
            "--eval",
20
4
            "(setq org-confirm-babel-evaluate nil)",
21
4
            "--eval",
22
4
            "(org-babel-goto-named-src-block \"generate-structs\")",
23
4
            "--eval",
24
4
            "(org-babel-execute-src-block)",
25
4
            "-f",
26
4
            "kill-emacs",
27
4
        ])
28
4
        .status();
29

            
30
4
    match status {
31
4
        Ok(s) if s.success() => {}
32
        Ok(s) => eprintln!("Warning: org-babel-tangle exited with {s}"),
33
        Err(e) => eprintln!("Warning: Failed to run emacs for org-babel-tangle: {e}"),
34
    }
35

            
36
    // Step 2: Generate C header from Rust code using cbindgen
37
4
    let header_path = format!("{crate_dir}/scripting_format.h");
38
4
    let config_path = format!("{crate_dir}/cbindgen.toml");
39

            
40
4
    match cbindgen::Builder::new()
41
4
        .with_crate(&crate_dir)
42
4
        .with_config(cbindgen::Config::from_file(&config_path).unwrap())
43
4
        .with_src(format!("{crate_dir}/src/lib.rs"))
44
4
        .with_src(format!("{crate_dir}/src/generated.rs"))
45
4
        .generate()
46
    {
47
4
        Ok(bindings) => {
48
4
            bindings.write_to_file(&header_path);
49
4
            eprintln!("Generated C header: {header_path}");
50
4
        }
51
        Err(e) => eprintln!("Warning: cbindgen failed: {e}"),
52
    }
53
4
}