#!/usr/bin/env pwsh #Requires -Version 7.0 [CmdletBinding()] param( [switch] $Test, [ValidateRange(1,25)] [int] $Day, [switch] $Release, [switch] $NoStrip, [string[]] $ExtraOdinFlags = @() ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $C = @{ White = "`e[1;37m" Green = "`e[1;32m" Red = "`e[1;31m" End = "`e[0m" } function Fail([string]$msg) { Write-Host ("{0}{1}{2}" -f $C.Red, $msg, $C.End) exit 1 } function Run([string]$exe, [string[]]$arguments) { & $exe @arguments if ($LASTEXITCODE -ne 0) { Fail "FAIL ($LASTEXITCODE): $exe $($arguments -join ' ')" } } $projectName = Split-Path -Leaf (Get-Location).Path $binName = [System.IO.Path]::ChangeExtension($projectName, '.exe') $binDir = Join-Path (Get-Location) 'bin' if (-not (Test-Path $binDir -PathType Container)) { New-Item -ItemType Directory -Path $binDir | Out-Null } $commonFlags = if ($Release) { @('-o:speed','-no-bounds-check','-disable-assert','-extra-linker-flags:"-Wl,--gc-sections"') } else { @('-debug','-vet','-strict-style','-warnings-as-errors') } Write-Host ("{0}Using Odin flags:{1}" -f $C.White, $C.End) ($commonFlags + $ExtraOdinFlags) | ForEach-Object { Write-Host " $_" } Push-Location $binDir try { if ($Test) { Write-Host "" Write-Host ("{0}Running tests{1}" -f $C.White, $C.End) if ($PSBoundParameters.ContainsKey('Day')) { $dayStr = "{0:D2}" -f $Day Run 'odin' (@('test', "../src/day_$dayStr") + $commonFlags + $ExtraOdinFlags) } else { Run 'odin' (@('test','../src','--all-packages') + $commonFlags + $ExtraOdinFlags) } Write-Host "" return } $outPath = Join-Path (Get-Location) $binName Write-Host ("{0}Building:{1} {2}" -f $C.White, $C.End, $outPath) Run 'odin' (@('build','../src',"-out:$binName",'-show-timings') + $commonFlags + $ExtraOdinFlags) Write-Host "" Write-Host ("{0}OK{1}" -f $C.Green, $C.End) if ($Release -and -not $NoStrip) { Run 'strip' @('-s', (Join-Path (Get-Location) $binName)) } } finally { Pop-Location }