use std::env;
use std::fs;
use std::path::Path;
use std::process::Command;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let target = env::var("TARGET").unwrap_or_default();
let is_wasm_target = target.contains("wasm32");
if env::var("CARGO_FEATURE_EMBED_WASM").is_ok() && !is_wasm_target {
build_wasm(&out_dir);
build_loader(&out_dir);
}
println!("cargo:rustc-env=SOREX_OUT_DIR={out_dir}");
}
fn build_wasm(out_dir: &str) {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let pkg_dir = Path::new(&manifest_dir).join("pkg");
let wasm_dest = Path::new(out_dir).join("sorex_bg.wasm");
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=src/search.rs");
println!("cargo:rerun-if-changed=src/types.rs");
println!("cargo:rerun-if-changed=src/scoring.rs");
println!("cargo:rerun-if-changed=src/levenshtein.rs");
println!("cargo:rerun-if-changed=src/levenshtein_dfa.rs");
let wasm_src = pkg_dir.join("sorex_bg.wasm");
if !wasm_src.exists() {
println!("cargo:warning=Building WASM module with wasm-pack...");
let wasm_target_dir = Path::new(out_dir).join("wasm-target");
let mut cmd = Command::new("wasm-pack");
cmd.args([
"build",
"--target",
"web",
"--no-default-features",
"--features",
"wasm",
])
.current_dir(&manifest_dir)
.env("CARGO_TARGET_DIR", &wasm_target_dir);
for (key, _) in env::vars() {
if key.starts_with("CARGO") && key != "CARGO_TARGET_DIR" {
cmd.env_remove(&key);
}
}
let status = cmd
.status()
.expect("Failed to run wasm-pack. Install it with: cargo install wasm-pack");
if !status.success() {
panic!("wasm-pack build failed");
}
}
fs::copy(&wasm_src, &wasm_dest).expect("Failed to copy WASM to OUT_DIR");
}
fn build_loader(out_dir: &str) {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let loader_src_dir = Path::new(&manifest_dir).join("src/build/loader");
let loader_src = Path::new(&manifest_dir).join("target/loader/sorex-loader.js");
let loader_map_src = Path::new(&manifest_dir).join("target/loader/sorex-loader.js.map");
let loader_dest = Path::new(out_dir).join("sorex-loader.js");
let loader_map_dest = Path::new(out_dir).join("sorex-loader.js.map");
println!("cargo:rerun-if-changed=src/build/loader/index.ts");
println!("cargo:rerun-if-changed=src/build/loader/parser.ts");
println!("cargo:rerun-if-changed=src/build/loader/searcher.ts");
println!("cargo:rerun-if-changed=src/build/loader/wasm-state.ts");
println!("cargo:rerun-if-changed=src/build/loader/imports.ts");
println!("cargo:rerun-if-changed=src/build/loader/build.ts");
if !loader_src.exists() {
println!("cargo:warning=Building JavaScript loader with bun...");
let status = Command::new("bun")
.args(["run", "build.ts"])
.current_dir(&loader_src_dir)
.status()
.expect("Failed to run bun. Install it from: https://bun.sh");
if !status.success() {
panic!("bun build failed");
}
}
fs::copy(&loader_src, &loader_dest).expect("Failed to copy loader JS to OUT_DIR");
fs::copy(&loader_map_src, &loader_map_dest).expect("Failed to copy loader map to OUT_DIR");
}