mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-27 03:17:05 -06:00
winprint's PdfCreateRenderer made photocraft.exe and photocraft-cli.exe import Windows.Data.Pdf.dll at load time, so Windows images without the PDF component (NTLite-stripped, some N/LTSC builds) refused to start: "windows.data.pdf.dll was not found". Both apps now delay-load it, and PDF printing checks the DLL is installed first and reports an error instead of aborting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
45 lines
2.5 KiB
Rust
45 lines
2.5 KiB
Rust
//! Windows only: embed the app icon and version info (VERSIONINFO) into `photocraft-cli.exe`.
|
|
//!
|
|
//! On every other target this does nothing, even when `PHOTOCRAFT_REQUIRE_WINRES` is set. A
|
|
//! missing resource compiler is a warning, so a cross-compile from macOS or Linux still links,
|
|
//! unless `PHOTOCRAFT_REQUIRE_WINRES=1` (set by the release packaging script) turns it into a
|
|
//! build error.
|
|
|
|
fn main() -> std::io::Result<()> {
|
|
println!("cargo:rerun-if-changed=build.rs");
|
|
println!("cargo:rerun-if-changed=../../assets/app-icon/photocraft.ico");
|
|
println!("cargo:rerun-if-env-changed=PHOTOCRAFT_REQUIRE_WINRES");
|
|
if std::env::var("CARGO_CFG_TARGET_OS").as_deref() != Ok("windows") {
|
|
return Ok(());
|
|
}
|
|
// Printing to PDF (winprint's `PdfCreateRenderer`) imports Windows.Data.Pdf.dll, which
|
|
// stripped Windows images (NTLite, some N/LTSC builds) lack. A load-time import stops the exe
|
|
// from starting at all ("windows.data.pdf.dll was not found", #5884), so load it on first use;
|
|
// the print command checks for it first and reports an error instead.
|
|
if std::env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc") {
|
|
println!("cargo:rustc-link-arg-bins=/DELAYLOAD:windows.data.pdf.dll");
|
|
println!("cargo:rustc-link-arg-bins=delayimp.lib");
|
|
}
|
|
let mut res = winresource::WindowsResource::new();
|
|
// FileVersion / ProductVersion strings and the numeric FILEVERSION / PRODUCTVERSION are left
|
|
// to `WindowsResource::new`, which reads the Cargo package version. A pre-release such as
|
|
// `1.2.3-rc.1` stays in the strings; the numeric fields are `1.2.3.0`.
|
|
res.set_icon("../../assets/app-icon/photocraft.ico")
|
|
.set("ProductName", "PhotoCraft")
|
|
.set("FileDescription", "PhotoCraft command-line interface")
|
|
.set("CompanyName", "Learning Machines LLC")
|
|
.set("LegalCopyright", "Copyright (c) the PhotoCraft authors. MIT OR Apache-2.0.")
|
|
.set("OriginalFilename", "photocraft-cli.exe")
|
|
.set("InternalName", "photocraft-cli");
|
|
if let Err(err) = res.compile() {
|
|
if std::env::var_os("PHOTOCRAFT_REQUIRE_WINRES").is_some() {
|
|
return Err(std::io::Error::other(format!(
|
|
"embedding Windows resources into photocraft-cli.exe failed: {err}. \
|
|
Install the Windows SDK resource compiler (rc.exe) or mingw-w64 windres and rebuild."
|
|
)));
|
|
}
|
|
println!("cargo:warning=photocraft-cli.exe built without icon/version resources: {err}");
|
|
}
|
|
Ok(())
|
|
}
|