chore(build): bind Windows cargo-test binaries to Common-Controls v6 manifest (#1257)

On Windows/MSVC the test executables for `psysonic-analysis`, `psysonic-audio`
and the top `psysonic` crate link the wry/tao windowing runtime (via the tauri
dependency) and statically import `TaskDialogIndirect` from comctl32. That symbol
only exists in Common-Controls v6; System32 comctl32.dll is v5.82 and lacks it,
so an unmanifested test exe aborts at startup with STATUS_ENTRYPOINT_NOT_FOUND
(0xC0000139) before any test runs. The app binary avoids this through the
manifest tauri_build embeds.

Declare the Common-Controls v6 dependency on the test binaries via build-script
link args, gated to windows-msvc. The app binary's manifest is unchanged
(byte-identical: tauri_build already embeds the same dependency, the linker
dedupes). Non-Windows/CI builds are unaffected.
This commit is contained in:
Psychotoxical
2026-07-07 18:55:41 +02:00
committed by GitHub
parent fbd3aaa094
commit 89140523dc
3 changed files with 55 additions and 0 deletions
+17
View File
@@ -1,3 +1,20 @@
fn main() {
// Windows/MSVC test binaries only: bind to Common-Controls v6.
//
// The library test harness (`--lib` unittests) links the wry/tao windowing
// runtime and statically imports `TaskDialogIndirect` from comctl32, which
// exists only in Common-Controls v6 (WinSxS). The real app binary gets that
// manifest from `tauri_build`, but the separate test executable does not, so
// it aborts at startup with STATUS_ENTRYPOINT_NOT_FOUND (0xC0000139). Add the
// dependency to test targets only — never the app binary (which already has a
// manifest via tauri_build) nor non-Windows/CI builds.
let is_windows_msvc = std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows")
&& std::env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc");
if is_windows_msvc {
println!(
"cargo::rustc-link-arg=/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
);
}
tauri_build::build()
}
@@ -0,0 +1,19 @@
fn main() {
// Windows/MSVC test binaries only: bind to Common-Controls v6.
//
// The `tauri` dev-dependency pulls the wry/tao windowing runtime into this
// crate's *test* executables, which statically import `TaskDialogIndirect`
// from comctl32. That symbol lives only in Common-Controls v6 (WinSxS); the
// bare System32 comctl32.dll is v5.82 and does not export it, so an
// unmanifested test exe aborts at startup with STATUS_ENTRYPOINT_NOT_FOUND
// (0xC0000139) before any test runs. The app binary avoids this through its
// embedded manifest — mirror that here, scoped to test targets only (never
// the app, the rlib, or non-Windows/CI builds).
let is_windows_msvc = std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows")
&& std::env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc");
if is_windows_msvc {
println!(
"cargo::rustc-link-arg=/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
);
}
}
+19
View File
@@ -0,0 +1,19 @@
fn main() {
// Windows/MSVC test binaries only: bind to Common-Controls v6.
//
// The `tauri` dev-dependency pulls the wry/tao windowing runtime into this
// crate's *test* executables, which statically import `TaskDialogIndirect`
// from comctl32. That symbol lives only in Common-Controls v6 (WinSxS); the
// bare System32 comctl32.dll is v5.82 and does not export it, so an
// unmanifested test exe aborts at startup with STATUS_ENTRYPOINT_NOT_FOUND
// (0xC0000139) before any test runs. The app binary avoids this through its
// embedded manifest — mirror that here, scoped to test targets only (never
// the app, the rlib, or non-Windows/CI builds).
let is_windows_msvc = std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows")
&& std::env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc");
if is_windows_msvc {
println!(
"cargo::rustc-link-arg=/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
);
}
}