From 7821217b60dd1f0f8f9899c27392bc70336187d9 Mon Sep 17 00:00:00 2001 From: Dusko Dobranic <101048884+ddobranic@users.noreply.github.com> Date: Tue, 31 Jan 2023 22:03:06 +0100 Subject: [PATCH] [Windows] Install ghc and cabal using ghcup (#6754) --- .../SoftwareReport.CachedTools.psm1 | 2 +- .../scripts/Installers/Install-Haskell.ps1 | 53 +++++++++---------- images/win/scripts/Tests/Haskell.Tests.ps1 | 15 +++--- 3 files changed, 32 insertions(+), 38 deletions(-) diff --git a/images/linux/scripts/SoftwareReport/SoftwareReport.CachedTools.psm1 b/images/linux/scripts/SoftwareReport/SoftwareReport.CachedTools.psm1 index 1d5505f1..a6c7433d 100755 --- a/images/linux/scripts/SoftwareReport/SoftwareReport.CachedTools.psm1 +++ b/images/linux/scripts/SoftwareReport/SoftwareReport.CachedTools.psm1 @@ -26,4 +26,4 @@ function Get-ToolcacheNodeVersions { function Get-ToolcacheGoVersions { $toolcachePath = Join-Path $env:AGENT_TOOLSDIRECTORY "go" return Get-ChildItem $toolcachePath -Name | Sort-Object { [Version]$_ } -} \ No newline at end of file +} diff --git a/images/win/scripts/Installers/Install-Haskell.ps1 b/images/win/scripts/Installers/Install-Haskell.ps1 index 63c7a7c9..e3223706 100644 --- a/images/win/scripts/Installers/Install-Haskell.ps1 +++ b/images/win/scripts/Installers/Install-Haskell.ps1 @@ -2,35 +2,7 @@ ## File: Install-Haskell.ps1 ## Desc: Install Haskell for Windows ################################################################################ - -# Get 3 latest versions of GHC, use OData query for that since choco search has issues https://github.com/chocolatey/choco/issues/2271 -$ODataQuery = '$filter=(Title eq ''ghc'') and (IsPrerelease eq false)&$orderby=Version desc' -$Url = "https://community.chocolatey.org/api/v2/Packages()?$ODataQuery" -$ChocoVersionsOutput = [Version[]](Invoke-RestMethod -Uri $Url).properties.Version -$LatestMajorMinor = $ChocoVersionsOutput | Group-Object { $_.ToString(2) } | Sort-Object { [Version]$_.Name } | Select-Object -last 3 -$VersionsList = $LatestMajorMinor | ForEach-Object { $_.Group | Select-Object -First 1 } | Sort-Object - -# The latest version will be installed as a default -ForEach ($version in $VersionsList) -{ - Write-Host "Installing ghc $version..." - Choco-Install -PackageName ghc -ArgumentList '--version', $version, '-m' -} - -# Add default version of GHC to path, because choco formula updates path on user level -$DefaultGhcVersion = $VersionsList | Select-Object -Last 1 -$DefaultGhcShortVersion = ([version]$DefaultGhcVersion).ToString(3) -$DefaultGhcPath = Join-Path $env:ChocolateyInstall "lib\ghc.$DefaultGhcVersion\tools\ghc-$DefaultGhcShortVersion\bin" -# Starting from version 9 haskell installation directory is $env:ChocolateyToolsLocation instead of $env:ChocolateyInstall\lib -if ($DefaultGhcShortVersion -notmatch '^[0-8]\.\d+.*') -{ - $DefaultGhcPath = Join-Path $env:ChocolateyToolsLocation "ghc-$DefaultGhcShortVersion\bin" -} - -Add-MachinePathItem -PathItem $DefaultGhcPath - -Write-Host 'Installing cabal...' -Choco-Install -PackageName cabal +Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" # install minimal ghcup, utilizing pre-installed msys2 at C:\msys64 Write-Host 'Installing ghcup...' @@ -45,4 +17,27 @@ Set-SystemVariable "CABAL_DIR" $cabalDir Add-MachinePathItem "$ghcupPrefix\ghcup\bin" Add-MachinePathItem "$cabalDir\bin" +Update-SessionEnvironment + +# Get 3 latest versions of GHC +$Versions = ghcup list -t ghc -r | Where-Object {$_ -notlike "prerelease"} +$VersionsOutput = [Version[]]($Versions | ForEach-Object{ $_.Split(' ')[1]; }) +$LatestMajorMinor = $VersionsOutput | Group-Object { $_.ToString(2) } | Sort-Object { [Version]$_.Name } | Select-Object -last 3 +$VersionsList = $LatestMajorMinor | ForEach-Object { $_.Group | Select-Object -Last 1 } | Sort-Object + +# The latest version will be installed as a default +ForEach ($version in $VersionsList) +{ + Write-Host "Installing ghc $version..." + ghcup install ghc $version + ghcup set ghc $version +} + +# Add default version of GHC to path +$DefaultGhcVersion = $VersionsList | Select-Object -Last 1 +ghcup set ghc $DefaultGhcVersion + +Write-Host 'Installing cabal...' +ghcup install cabal latest + Invoke-PesterTests -TestFile 'Haskell' diff --git a/images/win/scripts/Tests/Haskell.Tests.ps1 b/images/win/scripts/Tests/Haskell.Tests.ps1 index 5893af28..fd6b6b2c 100644 --- a/images/win/scripts/Tests/Haskell.Tests.ps1 +++ b/images/win/scripts/Tests/Haskell.Tests.ps1 @@ -1,6 +1,6 @@ Describe "Haskell" { - $chocoPackagesPath = Join-Path $env:ChocolateyInstall "lib" - [array]$ghcVersionList = Get-ChildItem -Path $chocoPackagesPath -Filter "ghc.*" | ForEach-Object { $_.Name.TrimStart("ghc.") } + $ghcPackagesPath = "c:\ghcup\ghc" + [array]$ghcVersionList = Get-ChildItem -Path $ghcPackagesPath -Filter "*" | ForEach-Object { $_.Name.Trim() } $ghcCount = $ghcVersionList.Count $defaultGhcVersion = $ghcVersionList | Sort-Object {[Version]$_} | Select-Object -Last 1 $ghcDefaultCases = @{ @@ -11,12 +11,7 @@ Describe "Haskell" { $ghcTestCases = $ghcVersionList | ForEach-Object { $ghcVersion = $_ $ghcShortVersion = ([version]$ghcVersion).ToString(3) - $binGhcPath = Join-Path $chocoPackagesPath "ghc.$ghcVersion\tools\ghc-$ghcShortVersion\bin\ghc.exe" - # The most recent GHC versions installation directory is $env:ChocolateyToolsLocation instead of $env:ChocolateyInstall\lib - if (-not (Test-Path $binGhcPath)) - { - $binGhcPath = Join-Path $env:ChocolateyToolsLocation "ghc-$ghcShortVersion\bin\ghc.exe" - } + $binGhcPath = Join-Path $ghcPackagesPath "$ghcShortVersion\bin\ghc.exe" @{ ghcVersion = $ghcVersion ghcShortVersion = $ghcShortVersion @@ -60,4 +55,8 @@ Describe "Haskell" { It "ghcup is installed" { "ghcup --version" | Should -ReturnZeroExitCode } + + It "ghcup can access msys2" { + "ghcup run --mingw-path -- pacman --version" | Should -ReturnZeroExitCode + } }