diff --git a/Restore.cmd b/Restore.cmd
index a241c1b81e9f0fbe55c69a98bfb72e6454e06caa..d3f2fcbfe446a9e4d79310aaabfe1117a478d92f 100755
--- a/Restore.cmd
+++ b/Restore.cmd
@@ -1,85 +1,3 @@
@if not defined EchoOn @echo off
-@setlocal enabledelayedexpansion
+powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0\build\scripts\restore-legacy.ps1" %*
-set RoslynRoot=%~dp0
-set DevDivPackages=%RoslynRoot%src\Setup\DevDivPackages
-
-:ParseArguments
-if /I "%1" == "/?" goto :Usage
-if /I "%1" == "/clean" set RestoreClean=true&&shift&& goto :ParseArguments
-if /I "%1" == "/fast" set RestoreFast=true&&shift&& goto :ParseArguments
-goto :DoneParsing
-
-:DoneParsing
-
-REM Allow for alternate solutions to be passed as restore targets.
-set RoslynSolution=%1
-if "%RoslynSolution%" == "" set RoslynSolution=%RoslynRoot%\Roslyn.sln
-
-REM Load in the inforation for NuGet
-call "%RoslynRoot%build\scripts\LoadNuGetInfo.cmd" || goto :LoadNuGetInfoFailed
-
-if "%RestoreClean%" == "true" (
- echo Clearing the NuGet caches
- call "%NugetExe%" locals all -clear || goto :CleanFailed
-)
-
-if "%RestoreFast%" == "" (
- echo Deleting project.lock.json files
- pushd "%RoslynRoot%src"
- echo "Dummy lock file to avoid error when there is no project.lock.json file" > project.lock.json
- del /s /q project.lock.json > nul
- popd
-)
-
-echo Restoring packages: Toolsets
-call "%NugetExe%" restore "%RoslynRoot%build\ToolsetPackages\project.json" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Restoring packages: Toolsets (Dev14 VS SDK build tools)
-call "%NugetExe%" restore "%RoslynRoot%build\ToolsetPackages\dev14.project.json" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Restoring packages: Toolsets (Dev15 VS SDK RC build tools)
-call "%NugetExe%" restore "%RoslynRoot%build\ToolsetPackages\dev15rc.project.json" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Locating MSBuild for Solution restore
-call "%RoslynRoot%SetDevCommandPrompt.cmd" || goto :RestoreFailed
-
-REM If we have an applocal copy of MSBuild, pass it to NuGet. Otherwise, assume NuGet knows how to find it.
-if exist "%DevenvDir%\..\..\MSBuild\15.0\Bin\MSBuild.exe" (
- set NuGetAdditionalCommandLineArgs=%NuGetAdditionalCommandLineArgs% -msbuildpath "%DevenvDir%\..\..\MSBuild\15.0\Bin"
-)
-
-echo Restoring packages: Samples
-call "%NugetExe%" restore "%RoslynRoot%src\Samples\Samples.sln" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Restoring packages: Templates
-call "%NugetExe%" restore "%RoslynRoot%src\Setup\Templates\Templates.sln" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Restoring packages: Toolset
-call "%NugetExe%" restore "%RoslynRoot%build\Toolset\Toolset.csproj" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Restoring packages: Roslyn (this may take some time)
-call "%NugetExe%" restore "%RoslynSolution%" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-echo Restoring packages: DevDiv tools
-call "%NugetExe%" restore "%RoslynRoot%src\Setup\DevDivInsertionFiles\DevDivInsertionFiles.sln" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-call "%NugetExe%" restore "%DevDivPackages%\Roslyn\project.json" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-call "%NugetExe%" restore "%DevDivPackages%\Debugger\project.json" %NuGetAdditionalCommandLineArgs% || goto :RestoreFailed
-
-exit /b 0
-
-:CleanFailed
-echo Clean failed with ERRORLEVEL %ERRORLEVEL%
-exit /b 1
-
-:RestoreFailed
-echo Restore failed with ERRORLEVEL %ERRORLEVEL%
-exit /b 1
-
-:LoadNuGetInfoFailed
-echo Error loading NuGet.exe information %ERRORLEVEL%
-exit /b 1
-
-:Usage
-@echo Usage: Restore.cmd /clean [Solution File]
-exit /b 1
diff --git a/build/Targets/Settings.props b/build/Targets/Settings.props
index c174941789e431be1a26a0f6b973fca4479fac1a..3795a03a30df22581c3bb0868d1220e1f71d9dac 100644
--- a/build/Targets/Settings.props
+++ b/build/Targets/Settings.props
@@ -36,7 +36,7 @@
$(NuGetPackageRoot)\Microsoft.Net.Compilers\$(ToolsetCompilerPackageVersion)\build\Microsoft.Net.Compilers.props -->
$(MSBuildThisFileDirectory)Microsoft.Net.Compilers.props
- 14.0
+ 15.0
$(VisualStudioVersion.Substring(0, $(VisualStudioVersion.IndexOf('.'))))
$(VisualStudioReferenceMajorVersion).0.0.0
Dev$(VisualStudioReferenceMajorVersion)
diff --git a/build/scripts/LoadNuGetInfo.cmd b/build/scripts/LoadNuGetInfo.cmd
index d2df6821a0071b304054b531844caa2596759543..54cce62382bd999edce3bc391b036454010975fb 100644
--- a/build/scripts/LoadNuGetInfo.cmd
+++ b/build/scripts/LoadNuGetInfo.cmd
@@ -2,11 +2,10 @@
REM This is a script that will set environment information about where to find
REM NuGet.exe, it's version and ensure that it's present on the enlistment.
-set NuGetExeVersion=3.6.0-beta1
set NuGetExeFolder=%~dp0..\..
set NuGetExe=%NuGetExeFolder%\NuGet.exe
set NuGetAdditionalCommandLineArgs=-verbosity quiet -configfile "%NuGetExeFolder%\nuget.config" -Project2ProjectTimeOut 1200
REM Download NuGet.exe if we haven't already
-powershell -noprofile -executionPolicy Bypass -file "%~dp0download-nuget.ps1" "%NuGetExeVersion%" "%NuGetExeFolder%" "%NuGetExeFolder%\Binaries"
+powershell -noprofile -executionPolicy Bypass -file "%~dp0download-nuget.ps1"
diff --git a/build/scripts/build-utils.ps1 b/build/scripts/build-utils.ps1
index 33bc0978242739964f2cb62bbbe688b86e74359d..689bcc2a96981a6e5a36ff79406d083044760334 100644
--- a/build/scripts/build-utils.ps1
+++ b/build/scripts/build-utils.ps1
@@ -6,10 +6,37 @@ $ErrorActionPreference="Stop"
# Declare a number of useful variables for other scripts to use
[string]$repoDir = Resolve-Path (Join-Path $PSScriptRoot "..\..")
[string]$binariesDir = Join-Path $repoDir "Binaries"
-[string]$scriptDir = $PSScriptRoot
+
+# Handy function for executing a command in powershell and throwing if it
+# fails.
+#
+# Original sample came from: http://jameskovacs.com/2010/02/25/the-exec-problem/
+function Exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) {
+ $output = & $cmd
+ if (-not $?) {
+ Write-Host $output
+ throw $errorMessage
+ }
+}
+
+# Ensure that NuGet is installed and return the path to the
+# executable to use.
+function Ensure-NuGet() {
+ Exec { & (Join-Path $PSScriptRoot "download-nuget.ps1") }
+ $nuget = Join-Path $repoDir "NuGet.exe"
+ return $nuget
+}
+
+# Ensure that MSBuild is installed and return the path to the
+# executable to use.
+function Ensure-MSBuild() {
+ $p = Get-MSBuildDir
+ $p = Join-Path $p "msbuild.exe"
+ return $p
+}
function Create-Directory([string]$dir) {
- New-Item $dir -ItemType Directory -ErrorAction SilentlyContinue | out-null
+ New-Item $dir -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
}
# Return the version of the NuGet package as used in this repo
@@ -39,3 +66,68 @@ function Get-PackagesDir {
Create-Directory $d
return $d
}
+
+# The intent of this script is to locate and return the path to the MSBuild directory that
+# we should use for bulid operations. The preference order for MSBuild to use is as
+# follows
+#
+# 1. MSBuild from an active VS command prompt
+# 2. MSBuild from a machine wide VS install
+#
+# This function will return two values: the kind of MSBuild chosen and the MSBuild directory.
+function Get-MSBuildKindAndDir() {
+
+ # MSBuild from an active VS command prompt.
+ if (${env:VSINSTALLDIR} -ne $null) {
+
+ # This line deliberately avoids using -ErrorAction. Inside a VS command prompt
+ # an MSBuild command should always be available.
+ $p = (Get-Command msbuild).Path
+ $p = Split-Path -parent $p
+ Write-Output "vscmd"
+ Write-Output $p
+ return
+ }
+
+ # Look for a valid VS installation
+ try {
+ $p = Get-VisualStudioDir
+ $p = Join-Path $p "MSBuild\15.0\Bin"
+ Write-Output "vsinstall"
+ Write-Output $p
+ return
+ }
+ catch {
+ # Failures are expected here when no VS installation is present on the
+ # machine.
+ }
+
+ throw "Unable to find MSBuild"
+}
+
+function Get-MSBuildDir() {
+ $both = Get-MSBuildKindAndDir
+ return $both[1]
+}
+
+# Get the directory of the first Visual Studio which meets our minimal
+# requirements for the Roslyn repo
+function Get-VisualStudioDir() {
+ $vswhereVersion = "1.0.50"
+ $vswhere = Join-Path (Get-PackagesDir) "vswhere\$($vswhereVersion)\tools\vswhere.exe"
+ if (-not (Test-path $vswhere)) {
+ $nuget = Ensure-NuGet
+ Exec { & $nuget install "vswhere" -OutputDirectory (Get-PackagesDir) -Version $vswhereVersion }
+ }
+
+ $output = & $vswhere -requires Microsoft.Component.MSBuild -format json | Out-String
+ if (-not $?) {
+ throw "Could not locate a valid Visual Studio"
+ }
+
+ $j = ConvertFrom-Json $output
+ $p = $j[0].installationPath
+ return $p
+}
+
+
diff --git a/build/scripts/cibuild-legacy.ps1 b/build/scripts/cibuild-legacy.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..66c7d22488d4efc2a3f9a05f671eeb471d147d56
--- /dev/null
+++ b/build/scripts/cibuild-legacy.ps1
@@ -0,0 +1,26 @@
+# This is a script to convert from our legacy CMD file / format for arguments
+# to the Powershell - version.
+
+Set-StrictMode -version 2.0
+$ErrorActionPreference = "Stop"
+
+$newArgs = @()
+foreach ($arg in $args) {
+ if (($arg.Length -gt 0) -and ($arg[0] -eq '/')) {
+ $arg = '-' + $arg.Substring(1)
+ }
+
+ if ($arg -eq "-debug") {
+ $arg = "-release:`$false"
+ }
+
+ if ($arg -eq "-test32") {
+ $arg = "-test64:`$false"
+ }
+
+ $newArgs += $arg
+}
+
+Write-Host "New Args are $newArgs"
+$script = Join-Path $PSScriptRoot "cibuild.ps1"
+Invoke-Expression "$script $newArgs"
diff --git a/build/scripts/cibuild.ps1 b/build/scripts/cibuild.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..c5991a7823ebdd246ba0adc0abda3b019aeff458
--- /dev/null
+++ b/build/scripts/cibuild.ps1
@@ -0,0 +1,144 @@
+[CmdletBinding(PositionalBinding=$false)]
+param (
+ [switch]$test64 = $false,
+ [switch]$testDeterminism = $false,
+ [switch]$testBuildCorrectness = $false,
+ [switch]$testPerfCorrectness = $false,
+ [switch]$testPerfRun = $false,
+ [switch]$testVsi = $false,
+ [switch]$skipTest = $false,
+ [switch]$skipRestore = $false,
+ [switch]$skipCommitPrinting = $false,
+ [switch]$release = $false
+)
+
+Set-StrictMode -version 2.0
+$ErrorActionPreference = "Stop"
+
+function Print-Usage() {
+ Write-Host "Usage: cibuild.cmd [-debug^|-release] [-test32^|-test64] [-restore]"
+ Write-Host " -debug Perform debug build. This is the default."
+ Write-Host " -release Perform release build."
+ Write-Host " -test32 Run unit tests in the 32-bit runner. This is the default."
+ Write-Host " -test64 Run units tests in the 64-bit runner."
+}
+
+function Run-MSBuild() {
+ # Because we override the C#/VB toolset to build against our LKG package, it is important
+ # that we do not reuse MSBuild nodes from other jobs/builds on the machine. Otherwise,
+ # we'll run into issues such as https://github.com/dotnet/roslyn/issues/6211.
+ # MSBuildAdditionalCommandLineArgs=
+ & $msbuild /nologo /m /nodeReuse:false /consoleloggerparameters:Verbosity=minimal /filelogger /fileloggerparameters:Verbosity=normal @args
+ if (-not $?) {
+ throw "Build failed"
+ }
+}
+
+# Kill any instances VBCSCompiler.exe to release locked files, ignoring stderr if process is not open
+# This prevents future CI runs from failing while trying to delete those files.
+# Kill any instances of msbuild.exe to ensure that we never reuse nodes (e.g. if a non-roslyn CI run
+# left some floating around).
+function Terminate-BuildProcesses() {
+ Get-Process msbuild -ErrorAction SilentlyContinue | kill
+ Get-Process vbcscompiler -ErrorAction SilentlyContinue | kill
+}
+
+try {
+ . (Join-Path $PSScriptRoot "build-utils.ps1")
+ Push-Location $repoDir
+
+ Write-Host "Parameters:"
+ foreach ($k in $PSBoundParameters.Keys) {
+ $v = $PSBoundParameters[$k]
+ Write-Host "`t$k=$v"
+ }
+
+ $buildConfiguration = if ($release) { "Release" } else { "Debug" }
+ $msbuildDir = Get-MSBuildDir
+ $msbuild = Join-Path $msbuildDir "msbuild.exe"
+ $configDir = Join-Path $binariesDIr $buildConfiguration
+
+ if (-not $skipRestore) {
+ Write-Host "Running restore"
+ & ".\build\scripts\restore.ps1" -msbuildDir $msbuildDir
+ }
+
+ # Ensure the binaries directory exists because msbuild can fail when part of the path to LogFile isn't present.
+ Create-Directory $binariesDir
+
+ if ($testBuildCorrectness) {
+ Exec { & ".\build\scripts\test-build-correctness.ps1" $repoDir $configDir }
+ exit 0
+ }
+
+ # Output the commit that we're building, for reference in Jenkins logs
+ if (-not $skipCommitPrinting) {
+ Write-Host "Building this commit:"
+ Exec { & git show --no-patch --pretty=raw HEAD }
+ }
+
+ # Build with the real assembly version, since that's what's contained in the bootstrap compiler redirects
+ $bootstrapLog = Join-Path $binariesDir "Bootstrap.log"
+ Run-MSBuild /p:UseShippingAssemblyVersion=true /p:InitialDefineConstants=BOOTSTRAP "build\Toolset\Toolset.csproj" /p:Configuration=$buildConfiguration /fileloggerparameters:LogFile=$($bootstrapLog)
+ Exec { & ".\build\scripts\check-msbuild.ps1" $bootstrapLog }
+ $bootstrapDir = Join-Path $binariesDir "Bootstrap"
+ Remove-Item -re $bootstrapDir -ErrorAction SilentlyContinue
+ Create-Directory $bootstrapDir
+ Move-Item "$configDir\Exes\Toolset\*" $bootstrapDir
+ Run-MSBuild /t:Clean "build\Toolset\Toolset.csproj" /p:Configuration=$buildConfiguration
+ Terminate-BuildProcesses
+
+ if ($testDeterminism) {
+ Exec { & ".\build\scripts\test-determinism.ps1" $bootstrapDir }
+ Terminate-BuildProcesses
+ exit 0
+ }
+
+ if ($testPerfCorrectness) {
+ Run-MSBuild Roslyn.sln /p:Configuration=$buildConfiguration /p:DeployExtension=false
+ Exec { & ".\Binaries\$buildConfiguration\Exes\Perf.Runner\Roslyn.Test.Performance.Runner.exe" --ci-test }
+ exit 0
+ }
+
+ if ($testPerfRun) {
+ Run-MSBuild Roslyn.sln /p:Configuration=$buildConfiguration /p:DeployExtension=false
+
+ # Check if we have credentials to upload to benchview
+ if ((Test-Path env:\GIT_BRANCH) -and (Test-Path BV_UPLOAD_SAS_TOKEN)) {
+ $extraArgs="--report-benchview --branch $(env:GIT_BRANCH)"
+
+ # Check if we are in a PR or this is a rolling submission
+ if (Test-Path env:\ghprbPullTitle) {
+ $extraArgs='$($extraArgs) --benchview-submission-name "[$($env:ghprbPullAuthorLogin)] PR $($env:ghprbPullId): $($env:ghprbPullTitle)" --benchview-submission-type private'
+ }
+ else {
+ $extraArgs='$(4extraArgs) --benchview-submission-type rolling'
+ }
+
+ Create-Directory ".\Binaries\$buildConfiguration\tools\"
+ # Get the benchview tools - Place alongside Roslyn.Test.Performance.Runner.exe
+ Exec { & ".\build\scripts\install_benchview_tools.cmd" ".\Binaries\$buildConfiguration\tools\" }
+ }
+
+ Terminate-BuildProcesses
+ Exec { & ".\Binaries\$buildConfiguration\Exes\Perf.Runner\Roslyn.Test.Performance.Runner.exe" --search-directory=".\\Binaries\\$buildConfiguration\\Dlls\\" --no-trace-upload $extraArgs }
+ exit 0
+ }
+
+ $target = if ($skipTest) { "Build" } else { "BuildAndTest" }
+ $test64Arg = if ($test64) { "true" } else { "false" }
+ $testVsiArg = if ($testVsi) { "true" } else { "false" }
+ $buildLog = Join-Path $binariesdir "Build.log"
+
+ Run-MSBuild /p:BootstrapBuildPath="$bootstrapDir" BuildAndTest.proj /t:$target /p:Configuration=$buildConfiguration /p:Test64=$test64Arg /p:TestVsi=$testVsiArg /p:PathMap="$($repoDir)=q:\roslyn" /p:Feature=pdb-path-determinism /fileloggerparameters:LogFile="$buildLog"`;verbosity=diagnostic /p:DeployExtension=false
+ Exec { & ".\build\scripts\check-msbuild.ps1" $buildLog }
+ exit 0
+}
+catch {
+ Write-Host $_
+ Write-Host $_.Exception
+ exit 1
+}
+finally {
+ Pop-Location
+}
diff --git a/build/scripts/download-nuget.ps1 b/build/scripts/download-nuget.ps1
index b3af82a77dd4cf901414407bfaf795ea6660c778..5bbc0775ecbbbe655dbda34d6e48c2226b292abb 100644
--- a/build/scripts/download-nuget.ps1
+++ b/build/scripts/download-nuget.ps1
@@ -1,46 +1,38 @@
-param (
- [string]$nugetVersion = $(throw "Need a nuget version"),
- [string]$destDir = $(throw "Need a path to download too"),
- [string]$binariesDir = $(throw "Need path to Binaries directory"))
-set-strictmode -version 2.0
+param ([string]$nugetVersion = "3.6.0-beta1")
+
+Set-StrictMode -version 2.0
$ErrorActionPreference="Stop"
-try
-{
- $scratchDir = join-path $binariesDir "NuGet"
- if (-not (test-path $scratchDir)) {
- mkdir $scratchDir | out-null
- }
+try {
+ . (Join-Path $PSScriptRoot "build-utils.ps1")
- if (-not (test-path $destDir)) {
- mkdir $destDir | out-null
- }
+ $scratchDir = Join-Path $binariesDir "NuGet"
+ Create-Directory $scratchDir
- $destFile = join-path $destDir "NuGet.exe"
- $scratchFile = join-path $scratchDir "NuGet.exe"
- $versionFile = join-path $scratchDir "version.txt"
+ $destFile = Join-Path $repoDir "NuGet.exe"
+ $scratchFile = Join-Path $scratchDir "NuGet.exe"
+ $versionFile = Join-Path $scratchDir "version.txt"
# Check and see if we already have a NuGet.exe which exists and is the correct
# version.
- if ((test-path $destFile) -and (test-path $scratchFile) -and (test-path $versionFile)) {
- $destHash = (get-filehash $destFile -algorithm MD5).Hash
- $scratchHash = (get-filehash $scratchFile -algorithm MD5).Hash
- $scratchVersion = gc $versionFile
+ if ((Test-Path $destFile) -and (Test-Path $scratchFile) -and (Test-Path $versionFile)) {
+ $destHash = (Get-FileHash $destFile -algorithm MD5).Hash
+ $scratchHash = (Get-FileHash $scratchFile -algorithm MD5).Hash
+ $scratchVersion = Get-Content $versionFile
if (($destHash -eq $scratchHash) -and ($scratchVersion -eq $nugetVersion)) {
- write-host "Using existing NuGet.exe at version $nuGetVersion"
+ Write-Host "Using existing NuGet.exe at version $nuGetVersion"
exit 0
}
}
- write-host "Downloading NuGet.exe"
+ Write-Host "Downloading NuGet.exe"
$webClient = New-Object -TypeName "System.Net.WebClient"
$webClient.DownloadFile("https://dist.nuget.org/win-x86-commandline/v$nugetVersion/NuGet.exe", $scratchFile)
- $nugetVersion | out-file $versionFile
- cp $scratchFile $destFile
+ $nugetVersion | Out-File $versionFile
+ Copy-Item $scratchFile $destFile
exit 0
}
-catch [exception]
-{
- write-host $_.Exception
- exit -1
+catch [exception] {
+ Write-Host $_.Exception
+ exit 1
}
diff --git a/build/scripts/locate-vs.ps1 b/build/scripts/locate-vs.ps1
index 5832b75ee9be34af8c13596964fa63d5e3974524..34a14304b44c77e6a3c4be68a27244ce2e2ccaf6 100644
--- a/build/scripts/locate-vs.ps1
+++ b/build/scripts/locate-vs.ps1
@@ -1,56 +1,13 @@
-Param(
- [string] $locateVsApiVersion = "0.2.4-beta"
-)
-set-strictmode -version 2.0
+Set-StrictMode -version 2.0
$ErrorActionPreference="Stop"
-function Create-Directory([string[]] $path) {
- if (!(Test-Path -path $path)) {
- New-Item -path $path -force -itemType "Directory" | Out-Null
- }
+try {
+ . (Join-Path $PSScriptRoot "build-utils.ps1")
+ $p = Get-VisualStudioDir
+ Write-Host (Join-Path $p "Common7\Tools\")
}
-
-function Locate-LocateVsApi {
- $packagesPath = Locate-PackagesPath
- $locateVsApi = Join-Path -path $packagesPath -ChildPath "RoslynTools.Microsoft.LocateVS\$locateVsApiVersion\tools\LocateVS.dll"
-
- if (!(Test-Path -path $locateVsApi)) {
- throw "The specified LocateVS API version ($locateVsApiVersion) could not be located."
- }
-
- return Resolve-Path -path $locateVsApi
-}
-
-function Locate-PackagesPath {
- if ($env:NUGET_PACKAGES -eq $null) {
- $env:NUGET_PACKAGES = Join-Path -path $env:UserProfile -childPath ".nuget\packages\"
- }
-
- $packagesPath = $env:NUGET_PACKAGES
-
- Create-Directory -path $packagesPath
- return Resolve-Path -path $packagesPath
-}
-
-try
-{
- $locateVsApi = Locate-LocateVsApi
- $requiredPackageIds = @()
-
- $requiredPackageIds += "Microsoft.Component.MSBuild"
- $requiredPackageIds += "Microsoft.Net.Component.4.6.TargetingPack"
- $requiredPackageIds += "Microsoft.VisualStudio.Component.PortableLibrary"
- $requiredPackageIds += "Microsoft.VisualStudio.Component.Roslyn.Compiler"
- $requiredPackageIds += "Microsoft.VisualStudio.Component.VSSDK"
-
- Add-Type -path $locateVsApi
- $visualStudioInstallationPath = [LocateVS.Instance]::GetInstallPath("15.0", $requiredPackageIds)
-
- return Join-Path -Path $visualStudioInstallationPath -ChildPath "Common7\Tools\"
-}
-catch
-{
+catch {
Write-Error $_.Exception.Message
# Return an empty string and let the caller fallback or handle this as appropriate
return ""
diff --git a/build/scripts/restore-legacy.ps1 b/build/scripts/restore-legacy.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..487a4dc3fcd9f7a4893b03a8890f89082d1c1c63
--- /dev/null
+++ b/build/scripts/restore-legacy.ps1
@@ -0,0 +1,18 @@
+# This is a script to convert from our legacy CMD file / format for arguments
+# to the Powershell - version.
+
+Set-StrictMode -version 2.0
+$ErrorActionPreference = "Stop"
+
+$newArgs = @()
+foreach ($arg in $args) {
+ if (($arg.Length -gt 0) -and ($arg[0] -eq '/')) {
+ $arg = '-' + $arg.Substring(1)
+ }
+
+ $newArgs += $arg
+}
+
+Write-Host "New Args are $newArgs"
+$script = Join-Path $PSScriptRoot "restore.ps1"
+Invoke-Expression "$script $newArgs"
diff --git a/build/scripts/restore.ps1 b/build/scripts/restore.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..5992663dc469a227f493afa0ca9af7f12ec4506d
--- /dev/null
+++ b/build/scripts/restore.ps1
@@ -0,0 +1,51 @@
+[CmdletBinding(PositionalBinding=$false)]
+param (
+ [switch]$clean = $false,
+ [switch]$fast = $false,
+ [string]$msbuildDir = "")
+
+Set-StrictMode -version 2.0
+$ErrorActionPreference="Stop"
+
+function Run-Restore([string]$name, [string]$fileName) {
+ Write-Host "Restoring $name"
+ $nugetConfig = Join-Path $repoDir "nuget.config"
+ $filePath = Join-Path $repoDir $fileName
+ Exec { & $nuget restore -verbosity quiet -configfile $nugetConfig -MSBuildPath $msbuildDir -Project2ProjectTimeOut 1200 $filePath }
+}
+
+try {
+ . (Join-Path $PSScriptRoot "build-utils.ps1")
+
+ $nuget = Ensure-NuGet
+ if ($msbuildDir -eq "") {
+ $msbuildDir = Get-MSBuildDir
+ }
+
+ Write-Host "Restore using MSBuild at $msbuildDir"
+
+ if ($clean) {
+ Write-Host "Clearing the NuGet caches"
+ Exec { & $nuget locals all -clear }
+ }
+
+ if (-not $fast) {
+ Write-Host "Deleting project.lock.json files"
+ Get-ChildItem $repoDir -re -in project.lock.json | Remove-Item
+ }
+
+ Run-Restore "Toolsets" "build\ToolsetPackages\project.json"
+ Run-Restore "Toolsets (Dev14 VS SDK build tools)" "build\ToolsetPackages\dev14.project.json"
+ Run-Restore "Toolsets (Dev15 VS SDK RC build tools)" "build\ToolsetPackages\dev15rc.project.json"
+ Run-Restore "Samples" "src\Samples\Samples.sln"
+ Run-Restore "Templates" "src\Setup\Templates\Templates.sln"
+ Run-Restore "Toolsets Compiler" "build\Toolset\Toolset.csproj"
+ Run-Restore "Roslyn" "Roslyn.sln"
+ Run-Restore "DevDivInsertionFiles" "src\Setup\DevDivInsertionFiles\DevDivInsertionFiles.sln"
+ Run-Restore "DevDiv Roslyn Packages" "src\Setup\DevDivPackages\Roslyn\project.json"
+ Run-Restore "DevDiv Debugger Packages" "src\Setup\DevDivPackages\Debugger\project.json"
+}
+catch {
+ Write-Host $_
+ exit 1
+}
diff --git a/build/scripts/test-machine-setup.ps1 b/build/scripts/test-machine-setup.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..ef80625d72b722615094fff3cc29bb5dccc53dd1
--- /dev/null
+++ b/build/scripts/test-machine-setup.ps1
@@ -0,0 +1,36 @@
+# Script for testing out the various functions on a given machine. Useful for
+# debugging Jeknins issues.
+
+param ([switch]$simple = $false)
+
+Set-StrictMode -version 2.0
+$ErrorActionPreference="Stop"
+
+try {
+ if (-not $simple) {
+ Set-PSDebug -Trace 2
+ }
+
+ . (Join-Path $PSScriptRoot "build-utils.ps1")
+ Write-Host "Calling Get-MSBuildKindAndDir"
+ Get-MSBuildKindAndDir
+ Write-Host "Calling Get-MSBuildDir"
+ Get-MSBuildDir
+
+ try {
+ Write-Host "Calling Get-VisualStudioDir"
+ Get-VisualStudioDir
+ }
+ catch {
+ Write-Host "Unable to find Visual Studio (expected on a machine without VS)"
+ Write-Host $_
+ }
+
+}
+catch {
+ Write-Host $_.Exception.Message
+ exit 1
+}
+finally {
+ Set-PSDebug -Trace 0
+}
diff --git a/cibuild.cmd b/cibuild.cmd
index 15fb6ac0086d3b1ff7d603aa773c472ad6f2acac..4b5de4fbec6cc0ab25eb28375a49279f2a3736a7 100644
--- a/cibuild.cmd
+++ b/cibuild.cmd
@@ -1,165 +1,2 @@
-@setlocal enabledelayedexpansion
-
-REM Parse Arguments.
-
-set RoslynRoot=%~dp0
-set BuildConfiguration=Debug
-
-REM Because override the C#/VB toolset to build against our LKG package, it is important
-REM that we do not reuse MSBuild nodes from other jobs/builds on the machine. Otherwise,
-REM we'll run into issues such as https://github.com/dotnet/roslyn/issues/6211.
-set MSBuildAdditionalCommandLineArgs=/nologo /m /nodeReuse:false /consoleloggerparameters:Verbosity=minimal /filelogger /fileloggerparameters:Verbosity=normal
-set BuildAndTestBuildTarget=BuildAndTest
-
-:ParseArguments
-if "%1" == "" goto :DoneParsing
-if /I "%1" == "/?" call :Usage && exit /b 1
-if /I "%1" == "/debug" set BuildConfiguration=Debug&&shift&& goto :ParseArguments
-if /I "%1" == "/release" set BuildConfiguration=Release&&shift&& goto :ParseArguments
-if /I "%1" == "/test32" set Test64=false&&shift&& goto :ParseArguments
-if /I "%1" == "/test64" set Test64=true&&shift&& goto :ParseArguments
-if /I "%1" == "/testDeterminism" set TestDeterminism=true&&shift&& goto :ParseArguments
-if /I "%1" == "/testBuildCorrectness" set TestBuildCorrectness=true&&shift&& goto :ParseArguments
-if /I "%1" == "/testPerfCorrectness" set TestPerfCorrectness=true&&shift&& goto :ParseArguments
-if /I "%1" == "/testPerfRun" set TestPerfRun=true&&shift&& goto :ParseArguments
-if /I "%1" == "/testVsi" set TestVsi=true&&shift&& goto :ParseArguments
-if /I "%1" == "/skipTest" set BuildAndTestBuildTarget=Build&&shift&&goto :ParseArguments
-if /I "%1" == "/skipCommitPrinting" set SkipCommitPrinting=1&&shift&&goto :ParseArguments
-
-REM /buildTimeLimit is the time limit, measured in minutes, for the Jenkins job that runs
-REM the build. The Jenkins script netci.groovy passes the time limit to this script.
-if /I "%1" == "/buildTimeLimit" set BuildTimeLimit=%2&&shift&&shift&& goto :ParseArguments
-
-call :Usage && exit /b 1
-:DoneParsing
-
-REM This script takes the presence of the /buildTimeLimit option as an indication that it
-REM should run the tests under the control of the ProcessWatchdog, which, if the tests
-REM exceed the time limit, will take a screenshot, obtain memory dumps from the test
-REM process and all its descendants, and shut those processes down.
-REM
-REM Developers building from the command line will presumably not pass /buildTimeLimit,
-REM and so the tests will not run under the ProcessWatchdog.
-if not "%BuildTimeLimit%" == "" (
- set CurrentDate=%date%
- set CurrentTime=%time: =0%
- set BuildStartTime=!CurrentDate:~-4!-!CurrentDate:~-10,2!-!CurrentDate:~-7,2!T!CurrentTime!
- set RunProcessWatchdog=true
-) else (
- set RunProcessWatchdog=false
-)
-
-REM Restore the NuGet packages
-call "%RoslynRoot%\Restore.cmd" || goto :BuildFailed
-call "%RoslynRoot%SetDevCommandPrompt.cmd" || goto :BuildFailed
-
-REM Ensure the binaries directory exists because msbuild can fail when part of the path to LogFile isn't present.
-set bindir=%RoslynRoot%Binaries
-if not exist "%bindir%" mkdir "%bindir%" || goto :BuildFailed
-
-if defined testBuildCorrectness (
- powershell -noprofile -executionPolicy RemoteSigned -file "%RoslynRoot%\build\scripts\test-build-correctness.ps1" %RoslynRoot% "%bindir%\%BuildConfiguration%" || goto :BuildFailed
- call :TerminateBuildProcesses
- exit /b 0
-)
-
-REM Output the commit that we're building, for reference in Jenkins logs
-if not "%SkipCommitPrinting" == "1" (
- echo Building this commit:
- git show --no-patch --pretty=raw HEAD
-)
-
-REM Build with the real assembly version, since that's what's contained in the bootstrap compiler redirects
-msbuild %MSBuildAdditionalCommandLineArgs% /p:UseShippingAssemblyVersion=true /p:InitialDefineConstants=BOOTSTRAP "%RoslynRoot%build\Toolset\Toolset.csproj" /p:NuGetRestorePackages=false /p:Configuration=%BuildConfiguration% /fileloggerparameters:LogFile="%bindir%\Bootstrap.log" || goto :BuildFailed
-powershell -noprofile -executionPolicy RemoteSigned -file "%RoslynRoot%\build\scripts\check-msbuild.ps1" "%bindir%\Bootstrap.log" || goto :BuildFailed
-
-if not exist "%bindir%\Bootstrap" mkdir "%bindir%\Bootstrap" || goto :BuildFailed
-move "Binaries\%BuildConfiguration%\Exes\Toolset\*" "%bindir%\Bootstrap" || goto :BuildFailed
-
-REM Clean the previous build
-msbuild %MSBuildAdditionalCommandLineArgs% /t:Clean build/Toolset/Toolset.csproj /p:Configuration=%BuildConfiguration% /fileloggerparameters:LogFile="%bindir%\BootstrapClean.log" || goto :BuildFailed
-
-call :TerminateBuildProcesses || goto :BuildFailed
-
-if defined TestDeterminism (
- powershell -noprofile -executionPolicy RemoteSigned -file "%RoslynRoot%\build\scripts\test-determinism.ps1" "%bindir%\Bootstrap" || goto :BuildFailed
- call :TerminateBuildProcesses || goto :BuildFailed
- exit /b 0
-)
-
-if defined TestPerfCorrectness (
- msbuild %MSBuildAdditionalCommandLineArgs% Roslyn.sln /p:Configuration=%BuildConfiguration% /p:DeployExtension=false || goto :BuildFailed
- .\Binaries\%BuildConfiguration%\Exes\Perf.Runner\Roslyn.Test.Performance.Runner.exe --ci-test || goto :BuildFailed
- exit /b 0
-)
-
-if defined TestPerfRun (
- msbuild %MSBuildAdditionalCommandLineArgs% Roslyn.sln /p:Configuration=%BuildConfiguration% /p:DeployExtension=false || goto :BuildFailed
-
- if defined GIT_BRANCH (
- REM Check if we have credentials to upload to benchview
- if defined BV_UPLOAD_SAS_TOKEN (
- set "EXTRA_PERF_RUNNER_ARGS=--report-benchview --branch "%GIT_BRANCH%""
-
- REM Check if we are in a PR or this is a rolling submission
- if defined ghprbPullTitle (
- set "EXTRA_PERF_RUNNER_ARGS=!EXTRA_PERF_RUNNER_ARGS! --benchview-submission-name ""[%ghprbPullAuthorLogin%] PR %ghprbPullId%: %ghprbPullTitle%"" --benchview-submission-type private"
- ) else (
- set "EXTRA_PERF_RUNNER_ARGS=!EXTRA_PERF_RUNNER_ARGS! --benchview-submission-type rolling"
- )
- mkdir ".\Binaries\%BuildConfiguration%\tools\"
- REM Get the benchview tools - Place alongside Roslyn.Test.Performance.Runner.exe
- call "%RoslynRoot%\build\scripts\install_benchview_tools.cmd" ".\Binaries\%BuildConfiguration%\tools\" || goto :BuildFailed
- dir ".\Binaries\%BuildConfiguration%\"
- )
- )
-
- call :TerminateBuildProcesses || goto :BuildFailed
-
- .\Binaries\%BuildConfiguration%\Exes\Perf.Runner\Roslyn.Test.Performance.Runner.exe --search-directory=".\\Binaries\\%BuildConfiguration%\\Dlls\\" --no-trace-upload !EXTRA_PERF_RUNNER_ARGS! || goto :BuildFailed
- exit /b 0
-)
-
-msbuild %MSBuildAdditionalCommandLineArgs% /p:BootstrapBuildPath="%bindir%\Bootstrap" BuildAndTest.proj /t:%BuildAndTestBuildTarget% /p:Configuration=%BuildConfiguration% /p:Test64=%Test64% /p:TestVsi=%TestVsi% /p:RunProcessWatchdog=%RunProcessWatchdog% /p:BuildStartTime=%BuildStartTime% /p:"ProcDumpExe=%ProcDumpExe%" /p:BuildTimeLimit=%BuildTimeLimit% /p:PathMap="%RoslynRoot%=q:\roslyn" /p:Feature=pdb-path-determinism /fileloggerparameters:LogFile="%bindir%\Build.log";verbosity=diagnostic /p:DeployExtension=false || goto :BuildFailed
-powershell -noprofile -executionPolicy RemoteSigned -file "%RoslynRoot%\build\scripts\check-msbuild.ps1" "%bindir%\Build.log" || goto :BuildFailed
-
-call :TerminateBuildProcesses || goto :BuildFailed
-
-REM Ensure caller sees successful exit.
-exit /b 0
-
-:Usage
-@echo Usage: cibuild.cmd [/debug^|/release] [/test32^|/test64] [/restore]
-@echo /debug Perform debug build. This is the default.
-@echo /release Perform release build.
-@echo /test32 Run unit tests in the 32-bit runner. This is the default.
-@echo /test64 Run units tests in the 64-bit runner.
-@echo.
-@goto :eof
-
-:BuildFailed
-echo Build failed with ERRORLEVEL %ERRORLEVEL%
-call :TerminateBuildProcesses
-exit /b 1
-
-:TerminateBuildProcesses
-@REM Kill any instances VBCSCompiler.exe to release locked files, ignoring stderr if process is not open
-@REM This prevents future CI runs from failing while trying to delete those files.
-@REM Kill any instances of msbuild.exe to ensure that we never reuse nodes (e.g. if a non-roslyn CI run
-@REM left some floating around).
-
-@REM An error-level of 1 means that the process was found, but could not be killed.
-echo Killing all build-related processes
-taskkill /F /IM msbuild.exe > nul 2>&1
-if %ERRORLEVEL% == 1 (
- echo ERROR: taskkill for msbuild.exe failed
- exit /b 1
-)
-
-taskkill /F /IM vbcscompiler.exe > nul 2>&1
-if %ERRORLEVEL% == 1 (
- echo ERROR: taskkill for vbcscompiler.exe failed
- exit /b 1
-)
-
-exit /b 0
+@if not defined EchoOn @echo off
+powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0\build\scripts\cibuild-legacy.ps1" %*
diff --git a/src/Tools/MicroBuild/Build.proj b/src/Tools/MicroBuild/Build.proj
index bd3401c522cd3862b3fa2d040ad03024ed5db832..6a6cdbfa94b51bf48ab0c86eca1ac768230524b5 100644
--- a/src/Tools/MicroBuild/Build.proj
+++ b/src/Tools/MicroBuild/Build.proj
@@ -22,7 +22,7 @@
-
+