|
| 1 | +# This script verifies that subsequent calls to `Build.cmd` don't cause assemblies to be unnecessarily rebuilt. |
| 2 | + |
| 3 | +[CmdletBinding(PositionalBinding=$false)] |
| 4 | +param ( |
| 5 | + [string][Alias('c')]$configuration = "Debug", |
| 6 | + [parameter(ValueFromRemainingArguments=$true)][string[]]$properties |
| 7 | +) |
| 8 | + |
| 9 | +Set-StrictMode -version 2.0 |
| 10 | +$ErrorActionPreference = "Stop" |
| 11 | + |
| 12 | +try { |
| 13 | + $RepoRoot = Join-Path $PSScriptRoot ".." | Join-Path -ChildPath ".." -Resolve |
| 14 | + $BuildScript = Join-Path $RepoRoot "Build.cmd" |
| 15 | + |
| 16 | + # do first build |
| 17 | + & $BuildScript -configuration $configuration @properties |
| 18 | + if ($LASTEXITCODE -ne 0) { |
| 19 | + Write-Host "Error running first build." |
| 20 | + exit 1 |
| 21 | + } |
| 22 | + |
| 23 | + # gather assembly timestamps |
| 24 | + $ArtifactsBinDir = Join-Path $RepoRoot "artifacts" | Join-Path -ChildPath "bin" -Resolve |
| 25 | + $FSharpAssemblyDirs = Get-ChildItem -Path $ArtifactsBinDir -Filter "FSharp.*" |
| 26 | + $FSharpAssemblyPaths = $FSharpAssemblyDirs | ForEach-Object { Get-ChildItem -Path (Join-Path $ArtifactsBinDir $_) -Recurse -Filter "$_.dll" } | ForEach-Object { $_.FullName } |
| 27 | + |
| 28 | + $InitialAssembliesAndTimes = @{} |
| 29 | + foreach ($asm in $FSharpAssemblyPaths) { |
| 30 | + $LastWriteTime = (Get-Item $asm).LastWriteTimeUtc |
| 31 | + $InitialAssembliesAndTimes.Add($asm, $LastWriteTime) |
| 32 | + } |
| 33 | + |
| 34 | + $InitialCompiledCount = $FSharpAssemblyPaths.Length |
| 35 | + |
| 36 | + # build again |
| 37 | + & $BuildScript -configuration $configuration @properties |
| 38 | + if ($LASTEXITCODE -ne 0) { |
| 39 | + Write-Host "Error running second build." |
| 40 | + exit 1 |
| 41 | + } |
| 42 | + |
| 43 | + # gather assembly timestamps again |
| 44 | + $FinalAssembliesAndTimes = @{} |
| 45 | + foreach ($asm in $FSharpAssemblyPaths) { |
| 46 | + $LastWriteTime = (Get-Item $asm).LastWriteTimeUtc |
| 47 | + $FinalAssembliesAndTimes.Add($asm, $LastWriteTime) |
| 48 | + } |
| 49 | + |
| 50 | + # validate that assembly timestamps haven't changed |
| 51 | + $RecompiledFiles = @() |
| 52 | + foreach ($asm in $InitialAssembliesAndTimes.keys) { |
| 53 | + $InitialTime = $InitialAssembliesAndTimes[$asm] |
| 54 | + $FinalTime = $FinalAssembliesAndTimes[$asm] |
| 55 | + if ($InitialTime -ne $FinalTime) { |
| 56 | + $RecompiledFiles += $asm |
| 57 | + } |
| 58 | + } |
| 59 | + |
| 60 | + $RecompiledCount = $RecompiledFiles.Length |
| 61 | + Write-Host "$RecompiledCount of $InitialCompiledCount assemblies were re-compiled" |
| 62 | + $RecompiledFiles | ForEach-Object { Write-Host " $_" } |
| 63 | + exit $RecompiledCount |
| 64 | +} |
| 65 | +catch { |
| 66 | + Write-Host $_ |
| 67 | + Write-Host $_.Exception |
| 68 | + Write-Host $_.ScriptStackTrace |
| 69 | + exit 1 |
| 70 | +} |
0 commit comments