diff --git a/packaging/windows/package.ps1 b/packaging/windows/package.ps1 index 7f1320c8..e1630b11 100644 --- a/packaging/windows/package.ps1 +++ b/packaging/windows/package.ps1 @@ -6,6 +6,7 @@ Produces, in $env:DIST (default: dist/release): effectcraft--windows-.msi per-machine installer (WiX v5) effectcraft--windows--portable.zip effectcraft.exe + effectcraft-cli.exe + effectcraft-cli--windows-.zip effectcraft-cli.exe standalone The binaries link the C runtime statically (+crt-static), so neither the MSI nor the portable zip needs the Visual C++ redistributable. Signing is delegated to sign.ps1 (skipped with a @@ -56,6 +57,17 @@ if (-not $env:EFFECTCRAFT_BUILD_DATE) { $env:EFFECTCRAFT_BUILD_DATE = (Get-Date) Write-Output "EffectCraft $Version for Windows $Arch ($Target)" if (-not $SkipBuild) { + # Locate rc.exe if not in PATH + if (-not (Get-Command rc.exe -ErrorAction SilentlyContinue)) { + $kits = Join-Path ${env:ProgramFiles(x86)} 'Windows Kits\10\bin' + $foundRc = Get-ChildItem -Path $kits -Recurse -Filter rc.exe -ErrorAction SilentlyContinue | + Where-Object { $_.FullName -match '\\x64\\rc\.exe$' } | + Sort-Object FullName -Descending | Select-Object -First 1 + if ($foundRc) { + $env:PATH = "$($foundRc.DirectoryName);$env:PATH" + } + } + # Static CRT: no VC++ redistributable needed. Scoped to the target so host build scripts and # proc-macros are unaffected. $flagVar = 'CARGO_TARGET_' + ($Target.ToUpper() -replace '-', '_') + '_RUSTFLAGS' @@ -114,6 +126,19 @@ $Zip = Join-Path $Dist "effectcraft-$Version-windows-$Arch-portable.zip" Remove-Item -Force $Zip -ErrorAction SilentlyContinue Compress-Archive -Path $Portable -DestinationPath $Zip +# ---- cli zip ----------------------------------------------------------------------------------- +$CliPortable = Join-Path $TargetDir "windows-package\effectcraft-cli-$Version-windows-$Arch" +Remove-Item -Recurse -Force $CliPortable -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Force -Path $CliPortable | Out-Null +Copy-Item (Join-Path $Stage 'effectcraft-cli.exe') $CliPortable +foreach ($f in 'README.md', 'LICENSE', 'LICENSE-MIT', 'LICENSE-APACHE') { + $p = Join-Path $Root $f + if (Test-Path $p) { Copy-Item $p $CliPortable } +} +$CliZip = Join-Path $Dist "effectcraft-cli-$Version-windows-$Arch.zip" +Remove-Item -Force $CliZip -ErrorAction SilentlyContinue +Compress-Archive -Path $CliPortable -DestinationPath $CliZip + # Smoke-test the CLI when this machine can run it. An ARM64 build made on an x64 runner can't run # here; .github/workflows/windows-arm64.yml installs and runs it on ARM64 instead. $HostArch = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture.ToString().ToLowerInvariant() @@ -122,4 +147,4 @@ if ($Arch -ne 'arm64' -or $HostArch -eq 'arm64') { } else { Write-Output "skipping effectcraft-cli --version: an $Arch build doesn't run on this $HostArch machine" } -Get-Item $Msi, $Zip | Format-Table Name, Length +Get-Item $Msi, $Zip, $CliZip | Format-Table Name, Length