| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- #-------------------------------------------------------------------------------------------------------
- # 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
|