Lines
80.25 %
Functions
50 %
Branches
100 %
use std::env;
use std::path::PathBuf;
use std::process::Command;
use wasm_bindgen_cli_support::Bindgen;
fn main() {
let output = Command::new("git")
.args(["rev-parse", "HEAD"])
.output()
.expect("Can't get git revision");
let git_hash = String::from_utf8(output.stdout)
.expect("Can't parse git revision")
.trim()
.to_owned();
println!("cargo:rustc-env=GIT_HASH={git_hash}");
let build_date = chrono::Utc::now().to_rfc3339();
println!("cargo:rustc-env=BUILD_DATE={build_date}");
println!("cargo:rerun-if-changed=frontend/src");
build_wasm_frontend();
}
fn build_wasm_frontend() {
let profile = env::var("PROFILE").unwrap_or_else(|_| "debug".to_string());
let project_root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())
.parent()
.unwrap()
.to_path_buf();
let wasm_target_dir = project_root.join("target-wasm");
let wasm_file = wasm_target_dir
.join("wasm32-unknown-unknown")
.join(&profile)
.join("nomisync_frontend.wasm");
let cargo = env::var("CARGO").unwrap_or_else(|_| "cargo".to_string());
let mut cmd = Command::new(&cargo);
cmd.args([
"build",
"-p",
"nomisync-frontend",
"--target",
"wasm32-unknown-unknown",
"-j",
"1",
])
.current_dir(&project_root)
.env("CARGO_TARGET_DIR", &wasm_target_dir)
.env_remove("CARGO_MAKEFLAGS")
.env_remove("MAKEFLAGS")
.env_remove("RUSTC_WRAPPER")
.env_remove("RUSTC_WORKSPACE_WRAPPER")
.env_remove("RUSTFLAGS")
.env_remove("CARGO_ENCODED_RUSTFLAGS");
if profile == "release" {
cmd.arg("--release");
assert!(
cmd.status().expect("Failed to execute cargo").success(),
"Failed to build WASM frontend"
);
wasm_file.exists(),
"WASM file not found: {}",
wasm_file.display()
let out_dir = PathBuf::from("static/wasm");
std::fs::create_dir_all(&out_dir).expect("Failed to create output directory");
let out_wasm = out_dir.join("nomisync_frontend_bg.wasm");
Bindgen::new()
.input_path(&wasm_file)
.web(true)
.expect("Failed to set web mode")
.omit_default_module_path(false)
.typescript(false)
.generate(&out_dir)
.expect("Failed to generate WASM bindings");
let status = Command::new("wasm-opt")
.args(["-Oz", "--output"])
.arg(&out_wasm)
.status();
if let Ok(status) = status {
if !status.success() {
eprintln!("Warning: wasm-opt failed, skipping optimization");
} else {
eprintln!("Warning: wasm-opt not found, skipping optimization");