blob: d7d8b5e09fdad15e7498ebdf646aface1d646167 [file]
#-------------------------------------------------------------------------------------------------------
# Copyright (C) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
#-------------------------------------------------------------------------------------------------------
# Use this script to run a build for the given BuildType (arch, flavor, subtype)
param (
[ValidateSet("x86", "x64", "arm")]
[Parameter(Mandatory=$True)]
[string]$arch,
# We do not use ValidateSet here because this $flavor param is used to name the BuildConfuration
# from the solution file. MsBuild will determine whether it is valid.
[Parameter(Mandatory=$True)]
[string]$flavor,
[ValidateSet("default", "codecoverage", "pogo")]
[string]$subtype = "default",
[Parameter(Mandatory=$True)]
[string]$solutionFile,
[switch]$clean,
[string]$buildRoot = "", # will be inferred if not provided
[string]$buildlogsSubdir = "buildlogs",
# assume NuGet is on the path, otherwise the caller must specify an explicit path
[string]$nugetExe = "NuGet.exe",
[string]$logFile = "",
#
# Skip flags
#
[switch]$skipPogo, # or set $Env:SKIP_POGO before invoking build
#
# POGO training parameters
#
[string[]]$scenarios = @(),
[string]$binpath, # will be inferred if not provided
[string]$binaryName = "ch.exe"
)
. $PSScriptRoot\pre_post_util.ps1
. $PSScriptRoot\locate_msbuild.ps1
# TODO (doilij) update all scripts that use pre_post_util.ps1 and rely on ComputeProjectPaths
$_, $buildRoot, $_, $binpath = `
ComputePaths `
-arch $arch -flavor $flavor -subtype $subtype -OuterScriptRoot $PSScriptRoot `
-buildRoot $buildRoot -binpath $binpath
$buildName = ConstructBuildName -arch $arch -flavor $flavor -subtype $subtype
$buildlogsPath = Join-Path $buildRoot $buildlogsSubdir
$logFile = UseValueOrDefault $logFile (Join-Path $buildRoot "logs\run_build.${buildName}.log")
# Clear the log file
if (($logFile -ne "") -and (Test-Path $logFile)) {
Remove-Item $logFile -Force
}
#
# NuGet restore
#
# To support both local builds where NuGet's location is known,
# and VSO builds where the location is not known and which use a NuGet restore task instead:
# Run `nuget restore` IFF $nugetExe exists.
if (Get-Command $nugetExe -ErrorAction SilentlyContinue) {
ExecuteCommand "& $nugetExe restore $solutionFile -NonInteractive"
}
#
# Setup
#
$msbuildExe = Locate-MSBuild
if (-not $msbuildExe) {
WriteErrorMessage "Could not find msbuild.exe -- exiting..."
exit 1
}
$skipPogo = $skipPogo -or (Test-Path Env:\SKIP_POGO)
# If $binpath is not set, then infer it. A missing path is okay because it will be created.
if (-not $binpath) {
$binpath = Join-Path $buildRoot "bin\${buildName}"
}
$defaultParams = "$solutionFile /nologo /m /nr:false /p:platform=`"${arch}`" /p:configuration=`"${flavor}`""
$loggingParams = @(
"/fl1 `"/flp1:logfile=${buildlogsPath}\build.${buildName}.log;verbosity=normal`"",
"/fl2 `"/flp2:logfile=${buildlogsPath}\build.${buildName}.err;errorsonly`"",
"/fl3 `"/flp3:logfile=${buildlogsPath}\build.${buildName}.wrn;warningsonly`"",
"/verbosity:normal"
) -join " "
$targets = ""
if ($clean) {
$targets += "`"/t:Clean,Rebuild`""
}
#
# Build
#
function Build($targets="", $extraParams) {
$buildCommand = "& `"$msbuildExe`" $targets $defaultParams $loggingParams $extraParams"
ExecuteCommand "$buildCommand"
if ($global:LastExitCode -ne 0) {
WriteErrorMessage "Failed msbuild command:`n$buildCommand`n"
WriteErrorMessage "Build failed. Exiting..."
exit 1
}
}
if ($subtype -eq "pogo") {
if ($scenarios.Length -eq 0) {
WriteMessage "No training scenarios selected for pogo build. Please specify training scenarios using the -scenarios parameter."
exit 1
}
Build -extraParams "`"/p:POGO_TYPE=PGI`"" -targets "$targets"
if (-not $skipPogo) {
$scenariosParamValue = $scenarios -join ','
$binary = Join-Path $binpath $binaryName
if (($binary -ne "") -and (Test-Path $binary)) {
$pogoTrainingCommand = "& `"${PSScriptRoot}\pgo\pogo_training.ps1`" -arch $arch -flavor $flavor -subtype $subtype -binary $binary -scenarios $scenariosParamValue"
ExecuteCommand "$pogoTrainingCommand"
} else {
WriteMessage "Binary not found at `"$binary`". Exiting..."
exit 1
}
Build -extraParams "`"/p:POGO_TYPE=PGO`""
}
} else {
$subtypeParams = ""
if ($subtype -eq "codecoverage") {
$subtypeParams = "/p:ENABLE_CODECOVERAGE=true"
}
Build -extraParams $subTypeParams -targets $targets
}
#
# Clean up
#
if (("$binpath" -ne "") -and (Test-Path $binpath)) {
# remove *.pgc, *.pgd, and pgort*
Get-ChildItem -Recurse -Path $binpath "*" `
| Where-Object { $_.Name -match "(.*\.pg[cd]|pgort.*)" } `
| ForEach-Object { Remove-Item -Force $_.FullName }
}
exit $global:lastexitcode