Skip to content

Commit a77c258

Browse files
committed
fix: build scripts fall back gracefully when icon.ico is absent
1 parent dc10dec commit a77c258

File tree

2 files changed

+42
-30
lines changed

2 files changed

+42
-30
lines changed

crates/fastpack-gui/build.rs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,37 @@
11
use std::{env, fs, io::BufReader, path::PathBuf};
22

33
fn main() {
4-
println!("cargo:rerun-if-changed=../../assets/icon.ico");
5-
4+
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
5+
let ico_path = manifest_dir.join("../../assets/icon.ico");
66
let out = PathBuf::from(env::var("OUT_DIR").unwrap());
7-
let ico_path = "../../assets/icon.ico";
8-
9-
let file = BufReader::new(fs::File::open(ico_path).expect("assets/icon.ico not found"));
10-
let dir = ico::IconDir::read(file).expect("parse icon.ico");
117

12-
let entry = dir
13-
.entries()
14-
.iter()
15-
.max_by_key(|e| e.width())
16-
.expect("icon.ico is empty");
17-
18-
let image = entry.decode().expect("decode icon entry");
19-
let (w, h) = (image.width(), image.height());
20-
let rgba = image.rgba_data().to_vec();
8+
println!("cargo:rerun-if-changed=../../assets/icon.ico");
219

22-
fs::write(out.join("icon.rgba"), &rgba).expect("write icon.rgba");
23-
fs::write(
24-
out.join("icon_meta.rs"),
25-
format!(
26-
"const ICON_WIDTH: u32 = {};\nconst ICON_HEIGHT: u32 = {};\n",
27-
w, h
28-
),
29-
)
30-
.expect("write icon_meta.rs");
10+
if ico_path.exists() {
11+
let file = BufReader::new(fs::File::open(&ico_path).expect("open icon.ico"));
12+
let dir = ico::IconDir::read(file).expect("parse icon.ico");
13+
let entry = dir
14+
.entries()
15+
.iter()
16+
.max_by_key(|e| e.width())
17+
.expect("icon.ico is empty");
18+
let image = entry.decode().expect("decode icon entry");
19+
let (w, h) = (image.width(), image.height());
20+
let rgba = image.rgba_data().to_vec();
21+
fs::write(out.join("icon.rgba"), &rgba).expect("write icon.rgba");
22+
fs::write(
23+
out.join("icon_meta.rs"),
24+
format!("const ICON_WIDTH: u32 = {w};\nconst ICON_HEIGHT: u32 = {h};\n"),
25+
)
26+
.expect("write icon_meta.rs");
27+
} else {
28+
// No icon available (e.g. during `cargo publish` verification).
29+
// Write a 1×1 transparent placeholder so the crate still compiles.
30+
fs::write(out.join("icon.rgba"), [0u8, 0, 0, 0]).expect("write icon.rgba");
31+
fs::write(
32+
out.join("icon_meta.rs"),
33+
"const ICON_WIDTH: u32 = 1;\nconst ICON_HEIGHT: u32 = 1;\n",
34+
)
35+
.expect("write icon_meta.rs");
36+
}
3137
}

crates/fastpack/build.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
fn main() {
22
println!("cargo:rerun-if-changed=../../assets/icon.ico");
3+
34
#[cfg(target_os = "windows")]
4-
embed_icon_resource();
5+
embed_if_present();
56
}
67

78
#[cfg(target_os = "windows")]
8-
fn embed_icon_resource() {
9-
winresource::WindowsResource::new()
10-
.set_icon("../../assets/icon.ico")
11-
.compile()
12-
.expect("winresource compile failed");
9+
fn embed_if_present() {
10+
use std::{env, path::PathBuf};
11+
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
12+
let ico_path = manifest_dir.join("../../assets/icon.ico");
13+
if ico_path.exists() {
14+
winresource::WindowsResource::new()
15+
.set_icon(ico_path.to_str().expect("icon path is not valid UTF-8"))
16+
.compile()
17+
.expect("winresource compile failed");
18+
}
1319
}

0 commit comments

Comments
 (0)