Files
BoltClam/build_windows.ps1
TheMajesticMagicianandClaude Code b262b1e664 Fix Python 3.11 detection in the Windows build script
sys.version_info[:2] prints '(3, 11)', so the old substring check for '3.11' always failed even on a valid Python install. Probe the major.minor string explicitly and support the py launcher or python on PATH.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-25 17:06:10 -06:00

104 lines
3.5 KiB
PowerShell

#requires -Version 5.1
[CmdletBinding()]
param(
[switch]$OneFile,
[switch]$SkipInstaller
)
$ErrorActionPreference = "Stop"
$Root = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $Root
function Get-Python {
$candidates = @(
@{ Command = "py"; Arguments = @("-3.11") },
@{ Command = "py"; Arguments = @("-3") },
@{ Command = "python"; Arguments = @() },
@{ Command = "python3"; Arguments = @() }
)
foreach ($candidate in $candidates) {
try {
$exe = $candidate.Command
$exeArgs = @($candidate.Arguments)
$probe = & $exe @exeArgs -c "import sys; print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" 2>$null
if ($LASTEXITCODE -eq 0 -and (($probe | Out-String).Trim() -eq "3.11")) {
return $candidate
}
} catch { }
}
throw "Python 3.11 x64 is required. Install it from python.org and retry."
}
$version = "1.0.0"
$venv = Join-Path $Root ".venv-build"
$python = Get-Python
if (-not (Test-Path $venv)) {
Write-Host "Creating build environment..."
$pythonExe = $python.Command
$pythonArgs = @($python.Arguments)
& $pythonExe @pythonArgs -m venv $venv
}
$py = Join-Path $venv "Scripts\python.exe"
if (-not (Test-Path $py)) {
throw "The build virtual environment could not be created."
}
& $py -m pip install --upgrade pip
& $py -m pip install -r (Join-Path $Root "requirements-dev.txt")
if ($LASTEXITCODE -ne 0) { throw "Dependency installation failed." }
if ($OneFile) {
$env:BOLTCLAM_ONEFILE = "1"
} else {
Remove-Item Env:BOLTCLAM_ONEFILE -ErrorAction SilentlyContinue
}
Write-Host "Building BoltClam $version..."
& $py -m PyInstaller --noconfirm --clean (Join-Path $Root "BoltClam.spec")
if ($LASTEXITCODE -ne 0) { throw "PyInstaller failed." }
$dist = Join-Path $Root "dist"
$artifacts = @()
if ($OneFile) {
$exe = Join-Path $dist "BoltClam.exe"
if (-not (Test-Path $exe)) { throw "Expected $exe was not produced." }
$artifacts += $exe
} else {
$folder = Join-Path $dist "BoltClam"
$exe = Join-Path $folder "BoltClam.exe"
if (-not (Test-Path $exe)) { throw "Expected $exe was not produced." }
$zip = Join-Path $dist "BoltClam-$version-windows-x64.zip"
if (Test-Path $zip) { Remove-Item $zip -Force }
Compress-Archive -Path (Join-Path $folder "*") -DestinationPath $zip -CompressionLevel Optimal
$artifacts += $zip
if (-not $SkipInstaller) {
$isccCandidates = @(
"${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe",
"$env:ProgramFiles\Inno Setup 6\ISCC.exe"
)
$iscc = $isccCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
if ($iscc) {
Write-Host "Building installer with $iscc..."
& $iscc "/DMyAppVersion=$version" (Join-Path $Root "installer\BoltClam.iss")
if ($LASTEXITCODE -ne 0) { throw "Inno Setup failed." }
$setup = Join-Path $dist "BoltClam-$version-Setup.exe"
if (Test-Path $setup) { $artifacts += $setup }
} else {
Write-Warning "Inno Setup 6 was not found; skipping the installer."
}
}
}
$checksumPath = Join-Path $dist "SHA256SUMS.txt"
$lines = foreach ($artifact in $artifacts) {
$hash = (Get-FileHash -Algorithm SHA256 $artifact).Hash.ToLowerInvariant()
"$hash $(Split-Path -Leaf $artifact)"
}
$lines | Set-Content -Encoding ASCII $checksumPath
Write-Host ""
Write-Host "Built:"
$artifacts | ForEach-Object { Write-Host " $_" }
Write-Host "Checksums: $checksumPath"