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

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

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

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

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

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

            
58
4
    if profile == "release" {
59
        cmd.arg("--release");
60
4
    }
61

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

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

            
75
4
    let out_wasm = out_dir.join("nomisync_frontend_bg.wasm");
76

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

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

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