mirror of
https://github.com/flectar/mail.git
synced 2026-11-11 17:57:54 +00:00
chore: add Windows cross-build script
This commit is contained in:
1 parent
ddf2ce63b3
commit
6e6f9de4a9
1 file changed
+65
Executable
+65
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env bash
|
||||
# Cross-compile the Windows x64 executable from Linux for local testing.
|
||||
# Produces the same layout as the release workflow's portable ZIP:
|
||||
# target/windows/flectar-mail/ (run flectar-mail.exe from here)
|
||||
# target/windows/flectar-mail-windows-x64.zip
|
||||
#
|
||||
# One-time setup:
|
||||
# sudo apt install clang lld llvm
|
||||
# rustup target add x86_64-pc-windows-msvc
|
||||
# cargo install --locked cargo-xwin
|
||||
# cargo-xwin downloads the Microsoft CRT and Windows SDK on first use; doing so
|
||||
# accepts Microsoft's license terms for those files.
|
||||
set -euo pipefail
|
||||
|
||||
project_dir="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
|
||||
target=x86_64-pc-windows-msvc
|
||||
build_dir="$project_dir/target/windows"
|
||||
package_dir="$build_dir/flectar-mail"
|
||||
zip_path="$build_dir/flectar-mail-windows-x64.zip"
|
||||
|
||||
# Debian and Ubuntu install clang-cl, lld-link, llvm-lib and llvm-rc only
|
||||
# under the versioned LLVM prefix.
|
||||
if ! command -v clang-cl >/dev/null 2>&1 || ! command -v llvm-rc >/dev/null 2>&1; then
|
||||
llvm_bin="$(ls -d /usr/lib/llvm-*/bin 2>/dev/null | sort -V | tail -n 1 || true)"
|
||||
if [[ -n "$llvm_bin" ]]; then
|
||||
export PATH="$llvm_bin:$PATH"
|
||||
fi
|
||||
fi
|
||||
for tool in cargo-xwin clang-cl lld-link llvm-lib llvm-rc; do
|
||||
if ! command -v "$tool" >/dev/null 2>&1; then
|
||||
printf '%s is missing. See the setup steps at the top of %s.\n' "$tool" "$0" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Match the release workflow: link the C runtime statically so Windows needs no
|
||||
# VC++ redistributable. RUSTFLAGS replaces .cargo/config.toml, so retain its
|
||||
# stack setting.
|
||||
export RUSTFLAGS="-C target-feature=+crt-static -C link-arg=/STACK:8000000"
|
||||
build_args=(--locked --release --target "$target" --bin flectar-mail --manifest-path "$project_dir/Cargo.toml" --no-default-features --features remote-content,gpu-renderer)
|
||||
if [[ -n "${FLECTAR_APP_FEATURES:-}" ]]; then
|
||||
build_args+=(--features "$FLECTAR_APP_FEATURES")
|
||||
fi
|
||||
if [[ "${FLECTAR_SKIP_BUILD:-0}" != "1" ]]; then
|
||||
# Extra arguments are passed to Cargo, for example -j 4.
|
||||
cargo xwin build "${build_args[@]}" "$@"
|
||||
fi
|
||||
|
||||
executable="$project_dir/target/$target/release/flectar-mail.exe"
|
||||
if [[ ! -f "$executable" ]]; then
|
||||
printf 'The Windows executable was not built: %s\n' "$executable" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -rf "$package_dir"
|
||||
mkdir -p "$package_dir/LICENSES/Google Sans Flex" "$package_dir/LICENSES/Noto Emoji"
|
||||
python3 "$project_dir/scripts/stage-pdfium.py" win-x64 "$package_dir" --cache "$build_dir/pdfium-cache"
|
||||
cp "$executable" "$project_dir"/{README.md,LICENSE,THIRD_PARTY_NOTICES.md} "$package_dir/"
|
||||
cp -R "$project_dir"/LICENSES/. "$package_dir/LICENSES/"
|
||||
cp "$project_dir"/resources/fonts/google-sans-flex/{OFL.txt,README.md} "$package_dir/LICENSES/Google Sans Flex/"
|
||||
cp "$project_dir"/resources/fonts/noto-emoji/{OFL.txt,README.md} "$package_dir/LICENSES/Noto Emoji/"
|
||||
|
||||
rm -f "$zip_path"
|
||||
(cd "$package_dir" && python3 -m zipfile -c "$zip_path" *)
|
||||
printf 'Windows build ready:\n %s\n %s\n' "$package_dir/flectar-mail.exe" "$zip_path"
|
||||
Reference in new issue
Block a user