Statically link WebView2Loader - single exe, no DLL needed
build.rs swaps the dynamic import library with the static archive from webview2-com-sys, so the WebView2 loader code is baked into the exe. msvc_compat.rs provides the MSVC CRT symbols (security cookie, thread-safe init, C++ operators) that the MSVC-compiled static library expects.
This commit is contained in:
@@ -7,5 +7,75 @@ fn main() {
|
||||
std::env::set_var("PATH", mingw_bin);
|
||||
}
|
||||
|
||||
// On GNU targets, replace the WebView2Loader import library with the static
|
||||
// library so the loader is baked into the exe — no DLL to ship.
|
||||
#[cfg(target_env = "gnu")]
|
||||
swap_webview2_to_static();
|
||||
|
||||
tauri_build::build()
|
||||
}
|
||||
|
||||
/// Replace `WebView2Loader.dll.lib` (dynamic import lib) with the contents of
|
||||
/// `WebView2LoaderStatic.lib` (static archive) in the webview2-com-sys build
|
||||
/// output. The linker then statically links the WebView2 loader code, removing
|
||||
/// the runtime dependency on WebView2Loader.dll.
|
||||
#[cfg(target_env = "gnu")]
|
||||
fn swap_webview2_to_static() {
|
||||
use std::fs;
|
||||
use std::path::PathBuf;
|
||||
|
||||
let out_dir = std::env::var("OUT_DIR").unwrap_or_default();
|
||||
// OUT_DIR = target/.../build/core-cooldown-HASH/out
|
||||
// We need: target/.../build/ (two levels up)
|
||||
let build_dir = PathBuf::from(&out_dir)
|
||||
.parent() // core-cooldown-HASH
|
||||
.and_then(|p| p.parent()) // build/
|
||||
.map(|p| p.to_path_buf());
|
||||
|
||||
let build_dir = match build_dir {
|
||||
Some(d) => d,
|
||||
None => return,
|
||||
};
|
||||
|
||||
let target_arch = match std::env::var("CARGO_CFG_TARGET_ARCH")
|
||||
.unwrap_or_default()
|
||||
.as_str()
|
||||
{
|
||||
"x86_64" => "x64",
|
||||
"x86" => "x86",
|
||||
"aarch64" => "arm64",
|
||||
_ => return,
|
||||
};
|
||||
|
||||
let entries = match fs::read_dir(&build_dir) {
|
||||
Ok(e) => e,
|
||||
Err(_) => return,
|
||||
};
|
||||
|
||||
for entry in entries.flatten() {
|
||||
let name = entry.file_name();
|
||||
let name = name.to_string_lossy();
|
||||
if !name.starts_with("webview2-com-sys-") {
|
||||
continue;
|
||||
}
|
||||
|
||||
let lib_dir = entry.path().join("out").join(target_arch);
|
||||
let import_lib = lib_dir.join("WebView2Loader.dll.lib");
|
||||
let static_lib = lib_dir.join("WebView2LoaderStatic.lib");
|
||||
|
||||
if static_lib.exists() && import_lib.exists() {
|
||||
if let Ok(static_bytes) = fs::read(&static_lib) {
|
||||
match fs::write(&import_lib, &static_bytes) {
|
||||
Ok(_) => println!(
|
||||
"cargo:warning=Swapped WebView2Loader to static linking ({})",
|
||||
lib_dir.display()
|
||||
),
|
||||
Err(e) => println!(
|
||||
"cargo:warning=Failed to swap WebView2Loader lib: {}",
|
||||
e
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user