Files
chronara/scripts/build-windows-nsis.sh
T
naomi 74c334c939
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 2m25s
CI / Lint & Test (pull_request) Failing after 6m21s
CI / Build Linux (pull_request) Has been skipped
CI / Build Windows (cross-compile) (pull_request) Has been skipped
feat: we successfully have the installer working for windows!
Models are downloaded at runtime instead of build.
2026-01-28 17:15:13 -08:00

177 lines
5.4 KiB
Bash
Executable File

#!/bin/bash
# Build script for Windows NSIS installer from WSL2
# Pure Rust app - no Python dependencies!
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
BUILD_DIR="$PROJECT_ROOT/build"
INSTALLER_DIR="$BUILD_DIR/installer"
echo "========================================"
echo "Chronara Windows NSIS Build Script"
echo "(Pure Rust Edition)"
echo "========================================"
echo ""
# Clean previous build
echo "[1/5] Cleaning previous build..."
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
mkdir -p "$INSTALLER_DIR"
# Create model download info (models downloaded on first run)
echo "[2/5] Creating model info for first-run download..."
mkdir -p "$PROJECT_ROOT/src-tauri/resources/models"
cat > "$PROJECT_ROOT/src-tauri/resources/models/download-info.json" << 'MODELINFO'
{
"llama": {
"filename": "Llama-3.2-3B-Instruct-Q4_K_M.gguf",
"url": "https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q4_K_M.gguf",
"size_bytes": 2019377152,
"description": "Llama 3.2 3B Instruct (Q4_K_M quantization)"
},
"whisper": {
"filename": "ggml-base.en.bin",
"url": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin",
"size_bytes": 147964211,
"description": "Whisper Base English model"
}
}
MODELINFO
echo " Created download-info.json"
# Build Tauri app for Windows
echo "[3/5] Building Tauri app for Windows..."
cd "$PROJECT_ROOT"
# Build frontend
echo " Building frontend..."
pnpm install
pnpm build
# Build Tauri with cargo-xwin for Windows MSVC target
echo " Building Tauri executable (this may take a while)..."
cd "$PROJECT_ROOT/src-tauri"
cargo xwin build --release --target x86_64-pc-windows-msvc
# Create NSIS installer
echo "[4/5] Creating NSIS installer..."
# Prepare installer staging directory
STAGE_DIR="$INSTALLER_DIR/stage"
mkdir -p "$STAGE_DIR"
mkdir -p "$STAGE_DIR/models"
# Copy the executable
cp "$PROJECT_ROOT/src-tauri/target/x86_64-pc-windows-msvc/release/chronara.exe" "$STAGE_DIR/Chronara.exe"
# Copy model download info
cp "$PROJECT_ROOT/src-tauri/resources/models/download-info.json" "$STAGE_DIR/models/"
# Create NSIS script
cat > "$INSTALLER_DIR/installer.nsi" << 'NSIS_EOF'
!include "MUI2.nsh"
!include "FileFunc.nsh"
SetCompressor /SOLID lzma
Name "Chronara"
OutFile "Chronara-Setup.exe"
InstallDir "$PROGRAMFILES64\Chronara"
InstallDirRegKey HKLM "Software\Chronara" "InstallDir"
RequestExecutionLevel admin
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section "Install"
SetOutPath "$INSTDIR"
; Install main executable
File "stage\Chronara.exe"
; Install models directory (contains download-info.json)
SetOutPath "$INSTDIR\models"
File /r "stage\models\*.*"
; Create start menu shortcuts
CreateDirectory "$SMPROGRAMS\Chronara"
CreateShortcut "$SMPROGRAMS\Chronara\Chronara.lnk" "$INSTDIR\Chronara.exe"
CreateShortcut "$SMPROGRAMS\Chronara\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
; Create desktop shortcut
CreateShortcut "$DESKTOP\Chronara.lnk" "$INSTDIR\Chronara.exe"
; Write registry keys
WriteRegStr HKLM "Software\Chronara" "InstallDir" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Chronara" "DisplayName" "Chronara"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Chronara" "UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Chronara" "Publisher" "NHCarrigan"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Chronara" "DisplayVersion" "0.1.0"
; Get installed size
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
IntFmt $0 "0x%08X" $0
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Chronara" "EstimatedSize" "$0"
; Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
Section "Uninstall"
; Remove files
RMDir /r "$INSTDIR\models"
Delete "$INSTDIR\Chronara.exe"
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR"
; Remove shortcuts
Delete "$SMPROGRAMS\Chronara\Chronara.lnk"
Delete "$SMPROGRAMS\Chronara\Uninstall.lnk"
RMDir "$SMPROGRAMS\Chronara"
Delete "$DESKTOP\Chronara.lnk"
; Remove registry keys
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Chronara"
DeleteRegKey HKLM "Software\Chronara"
SectionEnd
NSIS_EOF
# Run NSIS to create installer
echo "[5/5] Running NSIS..."
cd "$INSTALLER_DIR"
makensis installer.nsi
# Move installer to output location
mv "$INSTALLER_DIR/Chronara-Setup.exe" "$BUILD_DIR/"
echo ""
echo "========================================"
echo "Build complete!"
echo "========================================"
echo ""
echo "Output:"
echo " Installer: $BUILD_DIR/Chronara-Setup.exe"
echo ""
echo "The installer is much smaller now (~15-30MB vs ~500MB+)"
echo "since we're not bundling Python!"
echo ""
echo "First-run behavior:"
echo " 1. User downloads LLaMA model (~2GB) on first use"
echo " 2. User downloads Whisper model (~150MB) on first use"
echo ""