2016-09-18 20:50:08 -07:00
[ CmdletBinding ( ) ]
param (
2017-11-09 20:09:04 -08:00
[ ValidateNotNullOrEmpty ( ) ] [ string ] $disableMetrics = " 0 " ,
2017-11-09 21:41:16 -08:00
[ Parameter ( Mandatory = $False ) ] [ string ] $withVSPath = " "
2016-09-18 20:50:08 -07:00
)
2018-02-28 18:44:57 -08:00
Set-StrictMode -Version Latest
2018-01-22 18:18:53 -08:00
$scriptsDir = split-path -parent $script:MyInvocation . MyCommand . Definition
2018-05-16 14:51:17 -07:00
. " $scriptsDir \VcpkgPowershellUtils.ps1 "
2017-08-25 23:20:57 -07:00
2018-05-05 04:23:19 -07:00
$vcpkgRootDir = $scriptsDir
$withVSPath = $withVSPath -replace " \\ $ " # Remove potential trailing backslash
2018-02-22 19:56:08 -08:00
2018-05-05 04:23:19 -07:00
while ( ! ( $vcpkgRootDir -eq " " ) -and ! ( Test-Path " $vcpkgRootDir \.vcpkg-root " ) )
2017-08-25 23:25:41 -07:00
{
2018-05-05 04:23:19 -07:00
Write-Verbose " Examining $vcpkgRootDir for .vcpkg-root "
$vcpkgRootDir = Split-path $vcpkgRootDir -Parent
2017-08-25 23:25:41 -07:00
}
2018-05-05 04:23:19 -07:00
Write-Verbose " Examining $vcpkgRootDir for .vcpkg-root - Found "
2018-02-22 19:56:08 -08:00
2018-05-05 04:23:19 -07:00
$gitHash = " nohash "
2016-09-19 18:46:02 -07:00
$vcpkgSourcesPath = " $vcpkgRootDir \toolsrc "
2016-09-18 20:50:08 -07:00
if ( ! ( Test-Path $vcpkgSourcesPath ) )
{
2017-10-31 23:41:24 -07:00
Write-Error " Unable to determine vcpkg sources directory. ' $vcpkgSourcesPath ' does not exist. "
return
2016-09-18 20:50:08 -07:00
}
2018-05-19 17:54:12 -07:00
function getVisualStudioInstances ( )
{
$programFiles = getProgramFiles32bit
$results = New-Object System . Collections . ArrayList
$vswhereExe = " $programFiles \Microsoft Visual Studio\Installer\vswhere.exe "
if ( Test-Path $vswhereExe )
{
$output = & $vswhereExe -prerelease -legacy -products * -format xml
[ xml ] $asXml = $output
foreach ( $instance in $asXml . instances . instance )
{
$installationPath = $instance . InstallationPath -replace " \\ $ " # Remove potential trailing backslash
$installationVersion = $instance . InstallationVersion
$isPrerelease = -7
if ( vcpkgHasProperty -object $instance -propertyName " isPrerelease " )
{
$isPrerelease = $instance . isPrerelease
}
if ( $isPrerelease -eq 0 )
{
$releaseType = " PreferenceWeight3::StableRelease "
}
elseif ( $isPrerelease -eq 1 )
{
$releaseType = " PreferenceWeight2::PreRelease "
}
else
{
$releaseType = " PreferenceWeight1::Legacy "
}
# Placed like that for easy sorting according to preference
$results . Add ( " <sol>:: ${releaseType} :: ${installationVersion} :: ${installationPath} ::<eol> " ) > $null
}
}
else
{
Write-Verbose " Could not locate vswhere at $vswhereExe "
}
if ( " $env:vs140comntools " -ne " " )
{
$installationPath = Split-Path -Parent $ ( Split-Path -Parent " $env:vs140comntools " )
$clExe = " $installationPath \VC\bin\cl.exe "
$vcvarsallbat = " $installationPath \VC\vcvarsall.bat "
if ( ( Test-Path $clExe ) -And ( Test-Path $vcvarsallbat ) )
{
$results . Add ( " <sol>::PreferenceWeight1::Legacy::14.0:: $installationPath ::<eol> " ) > $null
}
}
$installationPath = " $programFiles \Microsoft Visual Studio 14.0 "
$clExe = " $installationPath \VC\bin\cl.exe "
$vcvarsallbat = " $installationPath \VC\vcvarsall.bat "
if ( ( Test-Path $clExe ) -And ( Test-Path $vcvarsallbat ) )
{
$results . Add ( " <sol>::PreferenceWeight1::Legacy::14.0:: $installationPath ::<eol> " ) > $null
}
$results . Sort ( )
$results . Reverse ( )
return $results
}
2018-05-05 04:23:19 -07:00
function findAnyMSBuildWithCppPlatformToolset([string]$withVSPath )
{
2018-05-19 17:54:12 -07:00
$VisualStudioInstances = getVisualStudioInstances
2018-05-05 04:23:19 -07:00
if ( $VisualStudioInstances -eq $null )
{
throw " Could not find Visual Studio. VS2015 or VS2017 (with C++) needs to be installed. "
}
Write-Verbose " VS Candidates: `n `r $( [ system.String ] :: Join ( [ Environment ] :: NewLine , $VisualStudioInstances ) ) "
foreach ( $instanceCandidateWithEOL in $VisualStudioInstances )
{
$instanceCandidate = $instanceCandidateWithEOL -replace " <sol>:: " -replace " ::<eol> "
Write-Verbose " Inspecting: $instanceCandidate "
$split = $instanceCandidate -split " :: "
# $preferenceWeight = $split[0]
# $releaseType = $split[1]
$version = $split [ 2 ]
$path = $split [ 3 ]
if ( $withVSPath -ne " " -and $withVSPath -ne $path )
{
Write-Verbose " Skipping: $instanceCandidate "
continue
}
$majorVersion = $version . Substring ( 0 , 2 ) ;
if ( $majorVersion -eq " 15 " )
{
$VCFolder = " $path \VC\Tools\MSVC\ "
if ( Test-Path $VCFolder )
{
Write-Verbose " Picking: $instanceCandidate "
return " $path \MSBuild\15.0\Bin\MSBuild.exe " , " v141 "
}
}
if ( $majorVersion -eq " 14 " )
{
$clExe = " $path \VC\bin\cl.exe "
if ( Test-Path $clExe )
{
Write-Verbose " Picking: $instanceCandidate "
$programFilesPath = getProgramFiles32bit
return " $programFilesPath \MSBuild\14.0\Bin\MSBuild.exe " , " v140 "
}
}
}
throw " Could not find MSBuild version with C++ support. VS2015 or VS2017 (with C++) needs to be installed. "
}
2018-05-19 17:50:51 -07:00
function getWindowsSDK ( [ Parameter ( Mandatory = $False ) ] [ switch ] $DisableWin10SDK = $False ,
[ Parameter ( Mandatory = $False ) ] [ switch ] $DisableWin81SDK = $False )
{
if ( $DisableWin10SDK -and $DisableWin81SDK )
{
throw " Both Win10SDK and Win81SDK were disabled. "
}
Write-Verbose " Finding WinSDK "
$validInstances = New-Object System . Collections . ArrayList
# Windows 10 SDK
function CheckWindows10SDK($path )
{
if ( $path -eq $null )
{
return
}
$folder = ( Join-Path $path " Include " )
if ( ! ( Test-Path $folder ) )
{
Write-Verbose " $folder - Not Found "
return
}
Write-Verbose " $folder - Found "
$win10sdkVersions = @ ( Get-ChildItem $folder | Where-Object { $_ . Name -match " ^10 " } | Sort-Object )
[ array ] :: Reverse ( $win10sdkVersions ) # Newest SDK first
foreach ( $win10sdkV in $win10sdkVersions )
{
$windowsheader = " $folder \ $win10sdkV \um\windows.h "
if ( ! ( Test-Path $windowsheader ) )
{
Write-Verbose " $windowsheader - Not Found "
continue
}
Write-Verbose " $windowsheader - Found "
$ddkheader = " $folder \ $win10sdkV \shared\sdkddkver.h "
if ( ! ( Test-Path $ddkheader ) )
{
Write-Verbose " $ddkheader - Not Found "
continue
}
Write-Verbose " $ddkheader - Found "
$win10sdkVersionString = $win10sdkV . ToString ( )
Write-Verbose " Found $win10sdkVersionString "
$validInstances . Add ( $win10sdkVersionString ) > $null
}
}
Write-Verbose " `n "
Write-Verbose " Looking for Windows 10 SDK "
$regkey10 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot10' -ErrorAction SilentlyContinue
$regkey10Wow6432 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot10' -ErrorAction SilentlyContinue
if ( vcpkgHasProperty -object $regkey10 " KitsRoot10 " ) { CheckWindows10SDK ( $regkey10 . KitsRoot10 ) }
if ( vcpkgHasProperty -object $regkey10Wow6432 " KitsRoot10 " ) { CheckWindows10SDK ( $regkey10Wow6432 . KitsRoot10 ) }
CheckWindows10SDK ( " $env:ProgramFiles \Windows Kits\10 " )
CheckWindows10SDK ( " $ {env:ProgramFiles(x86)}\Windows Kits\10 " )
# Windows 8.1 SDK
function CheckWindows81SDK($path )
{
if ( $path -eq $null )
{
return
}
$folder = " $path \Include "
if ( ! ( Test-Path $folder ) )
{
Write-Verbose " $folder - Not Found "
return
}
Write-Verbose " $folder - Found "
$win81sdkVersionString = " 8.1 "
Write-Verbose " Found $win81sdkVersionString "
$validInstances . Add ( $win81sdkVersionString ) > $null
}
Write-Verbose " `n "
Write-Verbose " Looking for Windows 8.1 SDK "
$regkey81 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot81' -ErrorAction SilentlyContinue
$regkey81Wow6432 = Get-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots\' -Name 'KitsRoot81' -ErrorAction SilentlyContinue
if ( vcpkgHasProperty -object $regkey81 " KitsRoot81 " ) { CheckWindows81SDK ( $regkey81 . KitsRoot81 ) }
if ( vcpkgHasProperty -object $regkey81Wow6432 " KitsRoot81 " ) { CheckWindows81SDK ( $regkey81Wow6432 . KitsRoot81 ) }
CheckWindows81SDK ( " $env:ProgramFiles \Windows Kits\8.1 " )
CheckWindows81SDK ( " $ {env:ProgramFiles(x86)}\Windows Kits\8.1 " )
Write-Verbose " `n `n `n "
Write-Verbose " The following Windows SDKs were found: "
foreach ( $instance in $validInstances )
{
Write-Verbose $instance
}
# Selecting
foreach ( $instance in $validInstances )
{
if ( ! $DisableWin10SDK -and $instance -match " 10. " )
{
return $instance
}
if ( ! $DisableWin81SDK -and $instance -match " 8.1 " )
{
return $instance
}
}
throw " Could not detect a Windows SDK / TargetPlatformVersion "
}
2018-05-05 04:23:19 -07:00
$msbuildExeWithPlatformToolset = findAnyMSBuildWithCppPlatformToolset $withVSPath
2018-01-25 16:48:32 -08:00
$msbuildExe = $msbuildExeWithPlatformToolset [ 0 ]
$platformToolset = $msbuildExeWithPlatformToolset [ 1 ]
2018-05-19 17:50:51 -07:00
$windowsSDK = getWindowsSDK
2018-01-22 18:19:30 -08:00
2018-01-25 16:48:32 -08:00
$arguments = (
" `" /p:VCPKG_VERSION=- $gitHash `" " ,
" `" /p:DISABLE_METRICS= $disableMetrics `" " ,
" /p:Configuration=Release " ,
" /p:Platform=x86 " ,
" /p:PlatformToolset= $platformToolset " ,
" /p:TargetPlatformVersion= $windowsSDK " ,
2018-05-05 04:23:19 -07:00
" /verbosity:minimal " ,
2018-01-25 16:48:32 -08:00
" /m " ,
2018-05-05 04:23:19 -07:00
" /nologo " ,
2018-01-25 17:03:37 -08:00
" `" $vcpkgSourcesPath \dirs.proj `" " ) -join " "
2016-09-18 20:50:08 -07:00
2018-05-05 04:23:19 -07:00
function vcpkgInvokeCommandClean ( )
{
param ( [ Parameter ( Mandatory = $true ) ] [ string ] $executable ,
[ string ] $arguments = " " )
Write-Verbose " Clean-Executing: ${executable} ${arguments} "
$scriptsDir = split-path -parent $script:MyInvocation . MyCommand . Definition
$cleanEnvScript = " $scriptsDir \VcpkgPowershellUtils-ClearEnvironment.ps1 "
$tripleQuotes = " `" `" `" "
$argumentsWithEscapedQuotes = $arguments -replace " `" " , $tripleQuotes
$command = " . $tripleQuotes $cleanEnvScript $tripleQuotes ; & $tripleQuotes $executable $tripleQuotes $argumentsWithEscapedQuotes "
$arg = " -NoProfile " , " -ExecutionPolicy Bypass " , " -command $command "
$process = Start-Process -FilePath powershell . exe -ArgumentList $arg -PassThru -NoNewWindow
Wait-Process -InputObject $process
$ec = $process . ExitCode
Write-Verbose " Execution terminated with exit code $ec . "
return $ec
}
2018-01-25 16:48:32 -08:00
# vcpkgInvokeCommandClean cmd "/c echo %PATH%"
2018-05-05 04:23:19 -07:00
Write-Host " `n Building vcpkg.exe ... `n "
2018-01-25 16:48:32 -08:00
$ec = vcpkgInvokeCommandClean $msbuildExe $arguments
2016-09-18 20:50:08 -07:00
2018-01-25 16:48:32 -08:00
if ( $ec -ne 0 )
2017-08-25 23:25:41 -07:00
{
2018-01-25 16:48:32 -08:00
Write-Error " Building vcpkg.exe failed. Please ensure you have installed Visual Studio with the Desktop C++ workload and the Windows SDK for Desktop C++. "
return
2016-09-18 20:50:08 -07:00
}
2018-05-05 04:23:19 -07:00
Write-Host " `n Building vcpkg.exe... done. `n "
2018-01-25 16:48:32 -08:00
Write-Verbose ( " Placing vcpkg.exe in the correct location " )
Copy-Item $vcpkgSourcesPath \ Release \ vcpkg . exe $vcpkgRootDir \ vcpkg . exe | Out-Null
Copy-Item $vcpkgSourcesPath \ Release \ vcpkgmetricsuploader . exe $vcpkgRootDir \ scripts \ vcpkgmetricsuploader . exe | Out-Null