| steps: |
| - powershell: | |
| python ./skip_ci.py --base-branch-env=SYSTEM_PULLREQUEST_TARGETBRANCH --is-pull-env=SYSTEM_PULLREQUEST_PULLREQUESTID --base-branch-origin |
| if ($LastExitCode -ne 0) { |
| exit 0 |
| } |
| |
| # remove Chocolately, MinGW, Strawberry Perl from path, so we don't find gcc/gfortran and try to use it |
| $env:Path = ($env:Path.Split(';') | Where-Object { $_ -notmatch 'mingw|Strawberry|Chocolatey' }) -join ';' |
| |
| # download and install prerequisites |
| function DownloadFile([String] $Source, [String] $Destination) { |
| $retries = 10 |
| for ($i = 1; $i -le $retries; $i++) { |
| try { |
| (New-Object net.webclient).DownloadFile($Source, $Destination) |
| break # succeeded |
| } catch [net.WebException] { |
| if ($i -eq $retries) { |
| throw # fail on last retry |
| } |
| $backoff = (10 * $i) # backoff 10s, 20s, 30s... |
| echo ('{0}: {1}' -f $Source, $_.Exception.Message) |
| echo ('Retrying in {0}s...' -f $backoff) |
| Start-Sleep -m ($backoff * 1000) |
| } |
| } |
| } |
| |
| DownloadFile -Source 'https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-win.zip' -Destination $(System.WorkFolder)\ninja-win.zip |
| # ExpandArchive is only available in Powershell 5+ |
| Add-Type -AssemblyName System.IO.Compression.FileSystem |
| function unzip { |
| param( [string]$ziparchive, [string]$extractpath ) |
| [System.IO.Compression.ZipFile]::ExtractToDirectory( $ziparchive, $extractpath ) |
| } |
| unzip $(System.WorkFolder)\ninja-win.zip $(System.WorkFolder) |
| DownloadFile -Source 'https://github.com/mesonbuild/cidata/raw/master/win32/pkg-config.exe' -Destination $(System.WorkFolder)\pkg-config.exe |
| DownloadFile -Source 'https://download.microsoft.com/download/D/B/B/DBB64BA1-7B51-43DB-8BF1-D1FB45EACF7A/msmpisdk.msi' -Destination msmpisdk.msi |
| DownloadFile -Source 'https://download.microsoft.com/download/D/B/B/DBB64BA1-7B51-43DB-8BF1-D1FB45EACF7A/MSMpiSetup.exe' -Destination MSMpiSetup.exe |
| if ($env:compiler -ne 'msvc2015') { |
| Start-Process msiexec.exe -ArgumentList '/i msmpisdk.msi /quiet' -Wait |
| # installer fails "requires an interactive window station" with vs2015 image |
| Start-Process .\MSMpiSetup.exe -ArgumentList '-unattend -full' -Wait |
| } |
| |
| # import ms-mpi env vars (set by installer) |
| foreach ($p in "MSMPI_INC", "MSMPI_LIB32", "MSMPI_LIB64") { |
| $v = [Environment]::GetEnvironmentVariable($p, "Machine") |
| Set-Content "env:$p" "$v" |
| } |
| |
| if ($env:compiler -eq 'msvc2015') { |
| if ($env:arch -eq 'x86') { |
| $forcex86 = "--forcex86" |
| } |
| |
| # download and install python3 and add to path (since it's not installed in vs2015 image!) |
| Set-ExecutionPolicy Bypass -Scope Process -Force |
| iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) |
| choco install python3 -y --no-progress $forcex86 --params "/InstallDir:C:\Python3" |
| $env:Path = "C:\Python3;$env:Path" |
| |
| # add JDK installed in vs2015 image to PATH |
| $env:Path = "C:\java\jdk\jdk1.8.0_102\bin\;$env:Path" |
| } |
| |
| # install boost (except for clang-cl) |
| if ($env:arch -eq 'x86') { $boost_bitness = '32' } else { $boost_bitness = '64' } |
| if ($env:compiler -eq 'msvc2015') { |
| $boost_version = '1.60.0' ; $boost_abi_tag = '14.0' |
| } elseif ($env:compiler -eq 'msvc2017') { |
| $boost_version = '1.64.0' ; $boost_abi_tag = '14.1' |
| } |
| if ($boost_version) { |
| $boost_filename = $boost_version.Replace('.', '_') |
| Downloadfile -Source "https://sourceforge.net/projects/boost/files/boost-binaries/$boost_version/boost_$boost_filename-msvc-$boost_abi_tag-$boost_bitness.exe" -Destination boost_$boost_filename-msvc-$boost_abi_tag-$boost_bitness.exe |
| Start-Process "boost_$boost_filename-msvc-$boost_abi_tag-$boost_bitness.exe" -ArgumentList "/dir=$(System.WorkFolder)\boost_$boost_filename /silent" -Wait |
| $env:BOOST_ROOT = "$(System.WorkFolder)\boost_$boost_filename" |
| $env:Path = "$env:Path;$env:BOOST_ROOT\lib$boost_bitness-msvc-$boost_abi_tag" |
| } else { |
| $env:BOOST_ROOT = "" |
| } |
| |
| # install D compiler and dub packages |
| if ($env:backend -eq 'ninja') { |
| & .\ci\install-dmd.ps1 |
| $arch = 'x86_mscoff' |
| if ($Env:arch -eq 'x64') { |
| $arch = 'x86_64' |
| } |
| & dub fetch urld |
| & dub build urld --compiler=dmd --arch=$arch |
| & dub fetch dubtestproject |
| & dub build dubtestproject:test1 --compiler=dmd --arch=$arch |
| & dub build dubtestproject:test2 --compiler=dmd --arch=$arch |
| } |
| |
| # test_find_program exercises some behaviour which relies on .py being in PATHEXT |
| $env:PATHEXT += ';.py' |
| |
| # add downloads to PATH |
| $env:Path = "$env:SYSTEM_WORKFOLDER;$env:Path" |
| |
| $origPath = $env:Path |
| # import visual studio variables |
| if ($env:compiler -eq 'msvc2015') { |
| $vcvars = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" |
| } elseif($env:compiler -eq 'msvc2019') { |
| $vcvars = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" |
| } else { |
| $vcvars = "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" |
| } |
| |
| ## ask cmd.exe to output the environment table after the batch file completes |
| $tempFile = [IO.Path]::GetTempFileName() |
| cmd /c " `"$vcvars`" $env:arch && set > `"$tempFile`" " |
| |
| ## go through the environment variables in the temp file. |
| ## for each of them, set the variable in our local environment. |
| Get-Content $tempFile | Foreach-Object { |
| if($_ -match "^(.*?)=(.*)$") { |
| Set-Content "env:\$($matches[1])" $matches[2] |
| } |
| } |
| Remove-Item $tempFile |
| |
| if ($env:compiler -eq 'clang-cl') { |
| # drop visual studio from PATH |
| # (but leave INCLUDE, LIB and WindowsSdkDir environment variables set) |
| $env:Path = $origPath |
| |
| # install llvm for clang-cl builds |
| DownloadFile -Source 'http://releases.llvm.org/7.0.0/LLVM-7.0.0-win64.exe' -Destination LLVM-7.0.0-win64.exe |
| Start-Process .\LLVM-7.0.0-win64.exe -ArgumentList '/S' -Wait |
| $env:Path = "C:\Program Files\LLVM\bin;$env:Path" |
| $env:CC = "clang-cl" |
| $env:CXX = "clang-cl" |
| |
| # and use Windows SDK tools |
| $env:Path = "$env:WindowsSdkDir\bin\$env:Arch;$env:Path" |
| } |
| |
| # add .NET framework tools to path for resgen for C# tests |
| # (always use 32-bit tool, as there doesn't seem to be a 64-bit tool) |
| if ((Get-Command "resgen.exe" -ErrorAction SilentlyContinue) -eq $null) { |
| $env:Path = "$env:WindowsSDK_ExecutablePath_x86;$env:Path" |
| } |
| |
| if ($env:backend -eq 'ninja') { |
| ninja --version |
| } else { |
| MSBuild /version |
| } |
| |
| echo "=== PATH BEGIN ===" |
| echo ($env:Path).Replace(';',"`n") |
| echo "=== PATH END ===" |
| echo "" |
| echo "Locating Python:" |
| where.exe python |
| python --version |
| |
| # Needed for running unit tests in parallel. |
| python -m pip --disable-pip-version-check install --upgrade pytest-xdist |
| |
| |
| echo "" |
| echo "Locating cl, rc:" |
| where.exe cl |
| where.exe rc |
| |
| echo "" |
| echo "=== Start running tests ===" |
| # Starting from VS2019 Powershell(?) will fail the test run |
| # if it prints anything to stderr. Python's test runner |
| # does that by default so we need to forward it. |
| cmd /c 'python 2>&1' run_tests.py --backend $(backend) |
| |
| - task: PublishTestResults@2 |
| inputs: |
| testResultsFiles: meson-test-run.xml |
| testRunTitle: $(System.JobName) |
| publishRunAttachments: true |
| condition: not(canceled()) |
| |
| - task: CopyFiles@2 |
| inputs: |
| contents: 'meson-test-run.*' |
| targetFolder: $(Build.ArtifactStagingDirectory) |
| condition: not(canceled()) |
| |
| - task: PublishBuildArtifacts@1 |
| inputs: |
| artifactName: $(System.JobName) |
| condition: not(canceled()) |