1
use std::env;
2
use std::path::PathBuf;
3
use std::process::Command;
4
use wasm_bindgen_cli_support::Bindgen;
5

            
6
6
fn main() {
7
6
    let output = Command::new("git")
8
6
        .args(["rev-parse", "HEAD"])
9
6
        .output()
10
6
        .expect("Can't get git revision");
11
6
    let git_hash = String::from_utf8(output.stdout)
12
6
        .expect("Can't parse git revision")
13
6
        .trim()
14
6
        .to_owned();
15
6
    println!("cargo:rustc-env=GIT_HASH={git_hash}");
16

            
17
6
    let build_date = chrono::Utc::now().to_rfc3339();
18
6
    println!("cargo:rustc-env=BUILD_DATE={build_date}");
19

            
20
6
    println!("cargo:rerun-if-changed=frontend/src");
21
6
    build_wasm_frontend();
22
6
}
23

            
24
6
fn build_wasm_frontend() {
25
6
    let profile = env::var("PROFILE").unwrap_or_else(|_| "debug".to_string());
26
6
    let project_root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())
27
6
        .parent()
28
6
        .unwrap()
29
6
        .to_path_buf();
30
6
    let wasm_target_dir = project_root.join("target-wasm");
31
6
    let wasm_file = wasm_target_dir
32
6
        .join("wasm32-unknown-unknown")
33
6
        .join(&profile)
34
6
        .join("nomisync_frontend.wasm");
35

            
36
6
    let cargo = env::var("CARGO").unwrap_or_else(|_| "cargo".to_string());
37
6
    let mut cmd = Command::new(&cargo);
38
6
    cmd.args([
39
6
        "build",
40
6
        "-p",
41
6
        "nomisync-frontend",
42
6
        "--target",
43
6
        "wasm32-unknown-unknown",
44
6
        "-j",
45
6
        "1",
46
6
    ])
47
6
    .current_dir(&project_root)
48
6
    .env("CARGO_TARGET_DIR", &wasm_target_dir)
49
6
    .env_remove("CARGO_MAKEFLAGS")
50
6
    .env_remove("MAKEFLAGS")
51
6
    .env_remove("RUSTC_WRAPPER")
52
6
    .env_remove("RUSTC_WORKSPACE_WRAPPER")
53
6
    .env_remove("RUSTFLAGS")
54
6
    .env_remove("CARGO_ENCODED_RUSTFLAGS");
55

            
56
6
    if profile == "release" {
57
        cmd.arg("--release");
58
6
    }
59

            
60
6
    assert!(
61
6
        cmd.status().expect("Failed to execute cargo").success(),
62
        "Failed to build WASM frontend"
63
    );
64
6
    assert!(
65
6
        wasm_file.exists(),
66
        "WASM file not found: {}",
67
        wasm_file.display()
68
    );
69

            
70
6
    let out_dir = PathBuf::from("static/wasm");
71
6
    std::fs::create_dir_all(&out_dir).expect("Failed to create output directory");
72

            
73
6
    let out_wasm = out_dir.join("nomisync_frontend_bg.wasm");
74

            
75
6
    Bindgen::new()
76
6
        .input_path(&wasm_file)
77
6
        .web(true)
78
6
        .expect("Failed to set web mode")
79
6
        .omit_default_module_path(false)
80
6
        .typescript(false)
81
6
        .generate(&out_dir)
82
6
        .expect("Failed to generate WASM bindings");
83

            
84
6
    if profile == "release" {
85
        let status = Command::new("wasm-opt")
86
            .args(["-Oz", "--output"])
87
            .arg(&out_wasm)
88
            .arg(&out_wasm)
89
            .status();
90

            
91
        if let Ok(status) = status {
92
            if !status.success() {
93
                eprintln!("Warning: wasm-opt failed, skipping optimization");
94
            }
95
        } else {
96
            eprintln!("Warning: wasm-opt not found, skipping optimization");
97
        }
98
6
    }
99
6
}