Upload build-installer-win.ps1
This commit is contained in:
parent
5791f594de
commit
57371321e6
1 changed files with 175 additions and 0 deletions
175
scripts/build-installer-win.ps1
Normal file
175
scripts/build-installer-win.ps1
Normal file
|
|
@ -0,0 +1,175 @@
|
||||||
|
param(
|
||||||
|
[string]$Version = "",
|
||||||
|
[string]$BuildDir = "build\win",
|
||||||
|
[string]$StagingDir = "dist\win",
|
||||||
|
[switch]$Sign,
|
||||||
|
[string]$SignCert = ""
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
# Color output functions
|
||||||
|
function Write-Info { Write-Host $args -ForegroundColor Cyan }
|
||||||
|
function Write-Success { Write-Host $args -ForegroundColor Green }
|
||||||
|
function Write-Error { Write-Host $args -ForegroundColor Red }
|
||||||
|
|
||||||
|
try {
|
||||||
|
Write-Info "=== DragonMoonlight Windows Installer Build ==="
|
||||||
|
|
||||||
|
# Determine version
|
||||||
|
if ([string]::IsNullOrEmpty($Version)) {
|
||||||
|
Write-Info "Version not provided, attempting git describe..."
|
||||||
|
try {
|
||||||
|
$Version = git describe --tags --abbrev=0 2>$null
|
||||||
|
if ([string]::IsNullOrEmpty($Version)) {
|
||||||
|
$Version = "0.1.0"
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
$Version = "0.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Success "Building DragonMoonlight version: $Version"
|
||||||
|
|
||||||
|
# Check prerequisites
|
||||||
|
Write-Info "Checking prerequisites..."
|
||||||
|
$prerequisites = @("cmake", "cargo", "iscc", "windeployqt")
|
||||||
|
foreach ($tool in $prerequisites) {
|
||||||
|
try {
|
||||||
|
if ($tool -eq "iscc") {
|
||||||
|
$result = Get-Command "iscc.exe" -ErrorAction Stop
|
||||||
|
} elseif ($tool -eq "windeployqt") {
|
||||||
|
$result = Get-Command "windeployqt.exe" -ErrorAction Stop
|
||||||
|
} else {
|
||||||
|
$result = Get-Command $tool -ErrorAction Stop
|
||||||
|
}
|
||||||
|
Write-Success "✓ $tool found"
|
||||||
|
} catch {
|
||||||
|
Write-Error "✗ $tool not found. Please install it before proceeding."
|
||||||
|
throw "Missing prerequisite: $tool"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Build boringtun
|
||||||
|
Write-Info "Building boringtun..."
|
||||||
|
& pwsh scripts\build-boringtun-win.ps1
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "boringtun build failed"
|
||||||
|
}
|
||||||
|
Write-Success "boringtun built successfully"
|
||||||
|
|
||||||
|
# CMake configure
|
||||||
|
Write-Info "Running CMake configure..."
|
||||||
|
cmake -B $BuildDir -DCMAKE_BUILD_TYPE=Release
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "CMake configure failed"
|
||||||
|
}
|
||||||
|
Write-Success "CMake configure completed"
|
||||||
|
|
||||||
|
# CMake build
|
||||||
|
Write-Info "Building with CMake..."
|
||||||
|
cmake --build $BuildDir --config Release
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "CMake build failed"
|
||||||
|
}
|
||||||
|
Write-Success "CMake build completed"
|
||||||
|
|
||||||
|
# Create staging directory and copy executable
|
||||||
|
Write-Info "Staging release files..."
|
||||||
|
if (-not (Test-Path $StagingDir)) {
|
||||||
|
New-Item -ItemType Directory -Path $StagingDir -Force | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
$exePath = Join-Path $BuildDir "Release\DragonMoonlight.exe"
|
||||||
|
if (-not (Test-Path $exePath)) {
|
||||||
|
throw "DragonMoonlight.exe not found at $exePath"
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy-Item -Path $exePath -Destination $StagingDir -Force
|
||||||
|
Write-Success "Copied DragonMoonlight.exe to $StagingDir"
|
||||||
|
|
||||||
|
# Run windeployqt
|
||||||
|
Write-Info "Running windeployqt..."
|
||||||
|
$stagedExe = Join-Path $StagingDir "DragonMoonlight.exe"
|
||||||
|
windeployqt --release --qmldir app $stagedExe
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "windeployqt failed"
|
||||||
|
}
|
||||||
|
Write-Success "windeployqt completed"
|
||||||
|
|
||||||
|
# Download wintun.dll
|
||||||
|
Write-Info "Downloading Wintun..."
|
||||||
|
$wintunUrl = "https://www.wintun.net/builds/wintun-0.14.1.zip"
|
||||||
|
$tempDir = Join-Path $env:TEMP "wintun_build"
|
||||||
|
if (-not (Test-Path $tempDir)) {
|
||||||
|
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
$wintunZip = Join-Path $tempDir "wintun-0.14.1.zip"
|
||||||
|
|
||||||
|
try {
|
||||||
|
Write-Info "Downloading from $wintunUrl..."
|
||||||
|
Invoke-WebRequest -Uri $wintunUrl -OutFile $wintunZip -UseBasicParsing
|
||||||
|
|
||||||
|
Write-Info "Extracting wintun.dll..."
|
||||||
|
Expand-Archive -Path $wintunZip -DestinationPath $tempDir -Force
|
||||||
|
|
||||||
|
$wintunDll = Join-Path $tempDir "wintun\bin\amd64\wintun.dll"
|
||||||
|
if (-not (Test-Path $wintunDll)) {
|
||||||
|
throw "wintun.dll not found in extracted archive"
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy-Item -Path $wintunDll -Destination $StagingDir -Force
|
||||||
|
Write-Success "Wintun.dll extracted and copied to $StagingDir"
|
||||||
|
} finally {
|
||||||
|
if (Test-Path $wintunZip) {
|
||||||
|
Remove-Item -Path $wintunZip -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run Inno Setup
|
||||||
|
Write-Info "Building installer with Inno Setup..."
|
||||||
|
|
||||||
|
$issArgs = @("/DMyAppVersion=$Version", "scripts\DragonMoonlight.iss")
|
||||||
|
|
||||||
|
if ($Sign -or -not [string]::IsNullOrEmpty($SignCert)) {
|
||||||
|
$cert = $SignCert
|
||||||
|
if ([string]::IsNullOrEmpty($cert) -and -not [string]::IsNullOrEmpty($env:SIGNTOOL_CERT)) {
|
||||||
|
$cert = $env:SIGNTOOL_CERT
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not [string]::IsNullOrEmpty($cert)) {
|
||||||
|
Write-Info "Code signing enabled with certificate: $cert"
|
||||||
|
$env:SIGNTOOL_CERT = $cert
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iscc @issArgs
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "Inno Setup build failed"
|
||||||
|
}
|
||||||
|
Write-Success "Inno Setup build completed"
|
||||||
|
|
||||||
|
# Report results
|
||||||
|
$outputExe = Join-Path "dist" "DragonMoonlight-$Version-Setup.exe"
|
||||||
|
if (Test-Path $outputExe) {
|
||||||
|
Write-Success "Installer created: $outputExe"
|
||||||
|
|
||||||
|
$sha256 = (Get-FileHash -Path $outputExe -Algorithm SHA256).Hash
|
||||||
|
Write-Success "SHA256: $sha256"
|
||||||
|
|
||||||
|
Write-Info "Installer build successful!"
|
||||||
|
} else {
|
||||||
|
throw "Installer file not found at expected location: $outputExe"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Error "Build failed: $_"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
# Clean up temporary files
|
||||||
|
$tempDir = Join-Path $env:TEMP "wintun_build"
|
||||||
|
if (Test-Path $tempDir) {
|
||||||
|
Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue