#!/bin/sh # Windows installer (NSIS, x64) cross-built on macOS → ../release/desktop/Kestrove__x64-setup.exe # # Needs: brew install llvm lld nsis; cargo install --locked cargo-xwin; rustup target add x86_64-pc-windows-msvc; # Docker. cargo-xwin downloads the Microsoft CRT and Windows SDK: setting XWIN_ACCEPT_LICENSE=1 accepts # Microsoft's license for them (done only after the maintainer agreed to it). # # Homebrew's makensis 3.13 crashes on macOS (std::bad_alloc even for a trivial script), so Tauri's bundling # step is expected to fail here; the generated installer.nsi is then compiled with NSIS 3.11 from Debian 13 # in a container, with the same absolute paths mounted. set -eu cd "$(dirname "$0")/.." : "${XWIN_ACCEPT_LICENSE:?set XWIN_ACCEPT_LICENSE=1 to accept the Microsoft CRT/SDK license used by cargo-xwin}" export XWIN_ACCEPT_LICENSE PATH="/opt/homebrew/opt/llvm/bin:/opt/homebrew/opt/lld/bin:$PATH" V=$(node -p 'require("./package.json").version') T="$PWD/src-tauri/target/x86_64-pc-windows-msvc/release" OUT="$PWD/../release/desktop" mkdir -p "$OUT" npm run tauri build -- --runner cargo-xwin --target x86_64-pc-windows-msvc --bundles nsis || true [ -f "$T/nsis/x64/installer.nsi" ] || { echo "no installer.nsi: the app build failed" >&2; exit 1; } CACHE="$HOME/Library/Caches/tauri" docker run --rm --platform linux/arm64 -v "$PWD:$PWD" -v "$CACHE:$CACHE:ro" -w "$T/nsis/x64" debian:13 \ sh -c 'apt-get update -qq >/dev/null && apt-get install -y -qq nsis >/dev/null && makensis -INPUTCHARSET UTF8 -V2 installer.nsi' cp "$T/nsis/x64/nsis-output.exe" "$OUT/Kestrove_${V}_x64-setup.exe" cp "$T/kestrove-nmh.exe" "$OUT/kestrove-nmh-windows-x86_64.exe" ls -l "$OUT"/*.exe