Acord/windows/build.rs

66 lines
2.1 KiB
Rust

fn main() {
#[cfg(target_os = "windows")]
{
let svg = "../assets/Acord.svg";
let ico = "icon.ico";
let rc = "icon.rc";
let res = "icon.res";
let tmp = "icon_tmp";
println!("cargo:rerun-if-changed={svg}");
// Rasterize SVG → PNGs → ICO.
let _ = std::fs::create_dir_all(tmp);
let sizes = [16, 24, 32, 48, 64, 128, 256];
let mut pngs = Vec::new();
for size in sizes {
let out = format!("{tmp}/icon_{size}.png");
let s = size.to_string();
if !run(&["rsvg-convert", "--width", &s, "--height", &s, svg, "-o", &out]) {
println!("cargo:warning=rsvg-convert failed — no icon");
let _ = std::fs::remove_dir_all(tmp);
return;
}
pngs.push(out);
}
let mut magick_args: Vec<&str> = pngs.iter().map(|s| s.as_str()).collect();
magick_args.push(ico);
if !run_vec("magick", &magick_args) {
println!("cargo:warning=magick failed — no icon");
let _ = std::fs::remove_dir_all(tmp);
return;
}
let _ = std::fs::remove_dir_all(tmp);
// Write .rc and compile with llvm-windres directly.
std::fs::write(rc, "1 ICON \"icon.ico\"\r\n").ok();
if !run(&["llvm-windres", rc, "-o", res]) {
println!("cargo:warning=llvm-windres failed — no icon");
return;
}
// Tell the linker to include the compiled resource.
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
println!("cargo:rustc-link-arg-bins={manifest_dir}/{res}");
println!("cargo:warning=icon embedded via llvm-windres");
}
}
#[cfg(target_os = "windows")]
fn run(args: &[&str]) -> bool {
std::process::Command::new(args[0])
.args(&args[1..])
.status()
.map(|s| s.success())
.unwrap_or(false)
}
#[cfg(target_os = "windows")]
fn run_vec(cmd: &str, args: &[&str]) -> bool {
std::process::Command::new(cmd)
.args(args)
.status()
.map(|s| s.success())
.unwrap_or(false)
}