aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorAlexander Saprykin <xelfium@gmail.com>2018-05-26 13:27:14 +0200
committerGitHub <noreply@github.com>2018-05-26 13:27:14 +0200
commit4ce5f064282c3a8d8d710aa82af7aa346b0c6dd5 (patch)
treed95c9490352eb73f078d34a33bc4bb44ac9fa48b /scripts
parentfb689bd13dd6ba563a885d71fff1dd2b32a615db (diff)
parent2ac7527b40b1dbeb7856b9f763362c1e139e2ca9 (diff)
downloadvcpkg-4ce5f064282c3a8d8d710aa82af7aa346b0c6dd5.tar.gz
vcpkg-4ce5f064282c3a8d8d710aa82af7aa346b0c6dd5.zip
Merge pull request #1 from Microsoft/master
Update vcpkg from upstream
Diffstat (limited to 'scripts')
-rw-r--r--scripts/addPoshVcpkgToPowershellProfile.ps156
-rw-r--r--scripts/bootstrap.ps1345
-rw-r--r--scripts/bootstrap.sh197
-rw-r--r--scripts/buildsystems/msbuild/applocal.ps141
-rw-r--r--scripts/buildsystems/msbuild/vcpkg.targets34
-rw-r--r--scripts/buildsystems/vcpkg.cmake326
-rw-r--r--scripts/cleanEnvironmentHelper.ps152
-rw-r--r--scripts/cmake/vcpkg_acquire_msys.cmake84
-rw-r--r--scripts/cmake/vcpkg_apply_patches.cmake54
-rw-r--r--scripts/cmake/vcpkg_build_cmake.cmake206
-rw-r--r--scripts/cmake/vcpkg_build_msbuild.cmake166
-rw-r--r--scripts/cmake/vcpkg_build_qmake.cmake83
-rw-r--r--scripts/cmake/vcpkg_common_functions.cmake4
-rw-r--r--scripts/cmake/vcpkg_configure_cmake.cmake279
-rw-r--r--scripts/cmake/vcpkg_configure_meson.cmake72
-rw-r--r--scripts/cmake/vcpkg_configure_qmake.cmake49
-rw-r--r--scripts/cmake/vcpkg_copy_pdbs.cmake16
-rw-r--r--scripts/cmake/vcpkg_copy_tool_dependencies.cmake20
-rw-r--r--scripts/cmake/vcpkg_download_distfile.cmake153
-rw-r--r--scripts/cmake/vcpkg_execute_required_process.cmake58
-rw-r--r--scripts/cmake/vcpkg_extract_source_archive.cmake29
-rw-r--r--scripts/cmake/vcpkg_find_acquire_program.cmake229
-rw-r--r--scripts/cmake/vcpkg_fixup_cmake_targets.cmake153
-rw-r--r--scripts/cmake/vcpkg_from_bitbucket.cmake183
-rw-r--r--scripts/cmake/vcpkg_from_github.cmake187
-rw-r--r--scripts/cmake/vcpkg_get_windows_sdk.cmake13
-rw-r--r--scripts/cmake/vcpkg_install_cmake.cmake62
-rw-r--r--scripts/cmake/vcpkg_replace_string.cmake14
-rw-r--r--scripts/fetchDependency.ps1242
-rw-r--r--scripts/findAnyMSBuildWithCppPlatformToolset.ps1164
-rw-r--r--scripts/findFileRecursivelyUp.ps118
-rw-r--r--scripts/findVisualStudioInstallationInstances.ps135
-rw-r--r--scripts/getProgramFiles32bit.ps117
-rw-r--r--scripts/getProgramFilesPlatformBitness.ps117
-rw-r--r--scripts/getWindowsSDK.ps1102
-rw-r--r--scripts/get_triplet_environment.cmake5
-rw-r--r--scripts/ifw/maintenance.qs46
-rw-r--r--scripts/internalCI.ps125
-rw-r--r--scripts/ports.cmake16
-rw-r--r--scripts/posh-vcpkg/0.0.1/posh-vcpkg.psd131
-rw-r--r--scripts/posh-vcpkg/0.0.1/posh-vcpkg.psm139
-rw-r--r--scripts/templates/portfile.in.cmake5
-rw-r--r--scripts/toolchains/android.cmake13
-rw-r--r--scripts/toolchains/freebsd.cmake4
-rw-r--r--scripts/toolchains/linux.cmake18
-rw-r--r--scripts/toolchains/osx.cmake4
-rw-r--r--scripts/toolchains/windows.cmake32
-rw-r--r--scripts/vcpkgTools.xml90
48 files changed, 2836 insertions, 1252 deletions
diff --git a/scripts/addPoshVcpkgToPowershellProfile.ps1 b/scripts/addPoshVcpkgToPowershellProfile.ps1
new file mode 100644
index 000000000..1dd27aacf
--- /dev/null
+++ b/scripts/addPoshVcpkgToPowershellProfile.ps1
@@ -0,0 +1,56 @@
+[CmdletBinding()]
+param()
+
+function findExistingImportModuleDirectives([Parameter(Mandatory=$true)][string]$path)
+{
+ if (!(Test-Path $path))
+ {
+ return
+ }
+
+ $fileContents = Get-Content $path
+ $fileContents -match 'Import-Module.+?(?=posh-vcpkg)'
+ return
+}
+
+$scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
+
+$profileEntry = "Import-Module '$scriptsDir\posh-vcpkg'"
+$profilePath = $PROFILE # Implicit powershell variable
+$profileDir = Split-Path $profilePath -Parent
+if (!(Test-Path $profileDir))
+{
+ New-Item -ItemType Directory -Path $profileDir | Out-Null
+}
+
+Write-Host "`nAdding the following line to ${profilePath}:"
+Write-Host " $profileEntry"
+
+# @() Needed to force Array in PowerShell 2.0
+[Array]$existingImports = @(findExistingImportModuleDirectives $profilePath)
+if ($existingImports.Count -gt 0)
+{
+ $existingImportsOut = $existingImports -join "`n "
+ Write-Host "`nposh-vcpkg is already imported to your PowerShell profile. The following entries were found:"
+ Write-Host " $existingImportsOut"
+ Write-Host "`nPlease make sure you have started a new Powershell window for the changes to take effect."
+ return
+}
+
+# Modifying the profile will invalidate any signatures.
+# Posh-git does the following check, so we should too.
+# https://github.com/dahlbyk/posh-git/blob/master/src/Utils.ps1
+# If the profile script exists and is signed, then we should not modify it
+if (Test-Path $profilePath)
+{
+ $sig = Get-AuthenticodeSignature $profilePath
+ if ($null -ne $sig.SignerCertificate)
+ {
+ Write-Warning "Skipping add of posh-vcpkg import to profile; '$profilePath' appears to be signed."
+ Write-Warning "Please manually add the line '$profileEntry' to your profile and resign it."
+ return
+ }
+}
+
+Add-Content $profilePath -Value "`n$profileEntry" -Encoding UTF8
+Write-Host "`nSuccessfully added posh-vcpkg to your PowerShell profile. Please start a new Powershell window for the changes to take effect."
diff --git a/scripts/bootstrap.ps1 b/scripts/bootstrap.ps1
index b7bc5afab..149134dff 100644
--- a/scripts/bootstrap.ps1
+++ b/scripts/bootstrap.ps1
@@ -1,39 +1,340 @@
[CmdletBinding()]
param(
- [ValidateNotNullOrEmpty()]
- [string]$disableMetrics = "0"
+ [ValidateNotNullOrEmpty()][string]$disableMetrics = "0",
+ [Parameter(Mandatory=$False)][string]$withVSPath = ""
)
+Set-StrictMode -Version Latest
+$scriptsDir = split-path -parent $script:MyInvocation.MyCommand.Definition
+$withVSPath = $withVSPath -replace "\\$" # Remove potential trailing backslash
-$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition
-$vcpkgRootDir = & $scriptsDir\findFileRecursivelyUp.ps1 $scriptsDir .vcpkg-root
+function vcpkgHasProperty([Parameter(Mandatory=$true)][AllowNull()]$object, [Parameter(Mandatory=$true)]$propertyName)
+{
+ if ($object -eq $null)
+ {
+ return $false
+ }
+
+ return [bool]($object.psobject.Properties | Where-Object { $_.Name -eq "$propertyName"})
+}
+
+function getProgramFiles32bit()
+{
+ $out = ${env:PROGRAMFILES(X86)}
+ if ($out -eq $null)
+ {
+ $out = ${env:PROGRAMFILES}
+ }
+
+ if ($out -eq $null)
+ {
+ throw "Could not find [Program Files 32-bit]"
+ }
+
+ return $out
+}
-$gitHash = "unknownhash"
-if (Get-Command "git" -ErrorAction SilentlyContinue)
+$vcpkgRootDir = $scriptsDir
+while (!($vcpkgRootDir -eq "") -and !(Test-Path "$vcpkgRootDir\.vcpkg-root"))
{
- $gitHash = git rev-parse HEAD
+ Write-Verbose "Examining $vcpkgRootDir for .vcpkg-root"
+ $vcpkgRootDir = Split-path $vcpkgRootDir -Parent
}
-Write-Verbose("Git hash is " + $gitHash)
+Write-Verbose "Examining $vcpkgRootDir for .vcpkg-root - Found"
+
$vcpkgSourcesPath = "$vcpkgRootDir\toolsrc"
-Write-Verbose("vcpkg Path " + $vcpkgSourcesPath)
if (!(Test-Path $vcpkgSourcesPath))
{
- New-Item -ItemType directory -Path $vcpkgSourcesPath -force | Out-Null
+ Write-Error "Unable to determine vcpkg sources directory. '$vcpkgSourcesPath' does not exist."
+ return
}
-try{
- pushd $vcpkgSourcesPath
- $msbuildExeWithPlatformToolset = & $scriptsDir\findAnyMSBuildWithCppPlatformToolset.ps1
- $msbuildExe = $msbuildExeWithPlatformToolset[0]
- $platformToolset = $msbuildExeWithPlatformToolset[1]
- $windowsSDK = & $scriptsDir\getWindowsSDK.ps1
- & $msbuildExe "/p:VCPKG_VERSION=-$gitHash" "/p:DISABLE_METRICS=$disableMetrics" /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=$platformToolset /p:TargetPlatformVersion=$windowsSDK /m dirs.proj
+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("${releaseType}::${installationVersion}::${installationPath}") > $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"
- Write-Verbose("Placing vcpkg.exe in the correct location")
+ if ((Test-Path $clExe) -And (Test-Path $vcvarsallbat))
+ {
+ $results.Add("PreferenceWeight1::Legacy::14.0::$installationPath") > $null
+ }
+ }
- Copy-Item $vcpkgSourcesPath\Release\vcpkg.exe $vcpkgRootDir\vcpkg.exe | Out-Null
- Copy-Item $vcpkgSourcesPath\Release\vcpkgmetricsuploader.exe $vcpkgRootDir\scripts\vcpkgmetricsuploader.exe | Out-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("PreferenceWeight1::Legacy::14.0::$installationPath") > $null
+ }
+
+ $results.Sort()
+ $results.Reverse()
+
+ return $results
}
-finally{
- popd
+
+function findAnyMSBuildWithCppPlatformToolset([string]$withVSPath)
+{
+ $VisualStudioInstances = getVisualStudioInstances
+ 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 ($instanceCandidate in $VisualStudioInstances)
+ {
+ 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."
}
+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"
+}
+
+$msbuildExeWithPlatformToolset = findAnyMSBuildWithCppPlatformToolset $withVSPath
+$msbuildExe = $msbuildExeWithPlatformToolset[0]
+$platformToolset = $msbuildExeWithPlatformToolset[1]
+$windowsSDK = getWindowsSDK
+
+$arguments = (
+"`"/p:VCPKG_VERSION=-nohash`"",
+"`"/p:DISABLE_METRICS=$disableMetrics`"",
+"/p:Configuration=Release",
+"/p:Platform=x86",
+"/p:PlatformToolset=$platformToolset",
+"/p:TargetPlatformVersion=$windowsSDK",
+"/verbosity:minimal",
+"/m",
+"/nologo",
+"`"$vcpkgSourcesPath\dirs.proj`"") -join " "
+
+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\cleanEnvironmentHelper.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
+}
+
+# vcpkgInvokeCommandClean cmd "/c echo %PATH%"
+Write-Host "`nBuilding vcpkg.exe ...`n"
+$ec = vcpkgInvokeCommandClean $msbuildExe $arguments
+
+if ($ec -ne 0)
+{
+ 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
+}
+Write-Host "`nBuilding vcpkg.exe... done.`n"
+
+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
diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh
new file mode 100644
index 000000000..e999fa55e
--- /dev/null
+++ b/scripts/bootstrap.sh
@@ -0,0 +1,197 @@
+#!/bin/sh
+
+# Find vcpkg-root
+vcpkgRootDir=$(X= cd -- "$(dirname -- "$0")" && pwd -P)
+while [ "$vcpkgRootDir" != "/" ] && ! [ -e "$vcpkgRootDir/.vcpkg-root" ]; do
+ vcpkgRootDir="$(dirname "$vcpkgRootDir")"
+done
+
+downloadsDir="$vcpkgRootDir/downloads"
+
+extractStringBetweenDelimiters()
+{
+ input=$1;leftDelim=$2;rightDelim=$3
+ output="${input##*$leftDelim}"
+ output="${output%%$rightDelim*}"
+ echo "$output"
+}
+
+vcpkgCheckRepoTool()
+{
+ __tool=$1
+ if ! command -v "$__tool" >/dev/null 2>&1 ; then
+ echo "Could not find $__tool. Please install it (and other dependencies) with:"
+ echo "sudo apt-get install curl unzip tar"
+ exit 1
+ fi
+}
+
+vcpkgCheckEqualFileHash()
+{
+ url=$1; filePath=$2; expectedHash=$3
+
+ if command -v "sha512sum" >/dev/null 2>&1 ; then
+ actualHash=$(sha512sum "$filePath")
+ else
+ # sha512sum is not available by default on osx
+ # shasum is not available by default on Fedora
+ actualHash=$(shasum -a 512 "$filePath")
+ fi
+
+ actualHash="${actualHash%% *}" # shasum returns [hash filename], so get the first word
+
+ if ! [ "$expectedHash" = "$actualHash" ]; then
+ echo ""
+ echo "File does not have expected hash:"
+ echo " url: [ $url ]"
+ echo " File path: [ $downloadPath ]"
+ echo " Expected hash: [ $sha512 ]"
+ echo " Actual hash: [ $actualHash ]"
+ exit
+ fi
+}
+
+vcpkgDownloadFile()
+{
+ url=$1; downloadPath=$2 sha512=$3
+ vcpkgCheckRepoTool "curl"
+ rm -rf "$downloadPath.part"
+ curl -L $url --create-dirs --output "$downloadPath.part" || exit 1
+
+ vcpkgCheckEqualFileHash $url "$downloadPath.part" $sha512
+ mv "$downloadPath.part" "$downloadPath"
+}
+
+vcpkgExtractArchive()
+{
+ archive=$1; toPath=$2
+ rm -rf "$toPath" "$toPath.partial"
+ mkdir -p "$toPath.partial"
+
+ archiveType="${archive##*.}"
+ if [ "$archiveType" = "zip" ]; then
+ vcpkgCheckRepoTool "unzip"
+ $(cd "$toPath.partial" && unzip -qqo "$archive")
+ else
+ vcpkgCheckRepoTool "tar"
+ $(cd "$toPath.partial" && tar xzf "$archive")
+ fi
+ mv "$toPath.partial" "$toPath"
+}
+
+fetchTool()
+{
+ tool=$1; UNAME=$2; __output=$3
+
+ if [ "$tool" = "" ]; then
+ echo "No tool name provided"
+ return 1
+ fi
+
+ if [ "$UNAME" = "Linux" ]; then
+ os="linux"
+ elif [ "$UNAME" = "Darwin" ]; then
+ os="osx"
+ else
+ echo "Unknown uname: $UNAME"
+ return 1
+ fi
+
+ xmlFileAsString=`cat "$vcpkgRootDir/scripts/vcpkgTools.xml"`
+ toolRegexStart="<tool name=\"$tool\" os=\"$os\">"
+ toolData="$(extractStringBetweenDelimiters "$xmlFileAsString" "$toolRegexStart" "</tool>")"
+ if [ "$toolData" = "" ]; then
+ echo "Unknown tool: $tool"
+ return 1
+ fi
+
+ version="$(extractStringBetweenDelimiters "$toolData" "<version>" "</version>")"
+
+ toolPath="$downloadsDir/tools/$tool-$version-$os"
+
+ exeRelativePath="$(extractStringBetweenDelimiters "$toolData" "<exeRelativePath>" "</exeRelativePath>")"
+ exePath="$toolPath/$exeRelativePath"
+
+ if [ -e "$exePath" ]; then
+ eval $__output="'$exePath'"
+ return 0
+ fi
+
+ isArchive=true
+ if [ $isArchive = true ]; then
+ archiveName="$(extractStringBetweenDelimiters "$toolData" "<archiveName>" "</archiveName>")"
+ downloadPath="$downloadsDir/$archiveName"
+ else
+ echo "Non-archives not supported yet"
+ return 1
+ fi
+
+ url="$(extractStringBetweenDelimiters "$toolData" "<url>" "</url>")"
+ sha512="$(extractStringBetweenDelimiters "$toolData" "<sha512>" "</sha512>")"
+ if ! [ -e "$downloadPath" ]; then
+ echo "Downloading $tool..."
+ vcpkgDownloadFile $url "$downloadPath" $sha512
+ echo "Downloading $tool... done."
+ else
+ vcpkgCheckEqualFileHash $url "$downloadPath" $sha512
+ fi
+
+ if [ $isArchive = true ]; then
+ echo "Extracting $tool..."
+ vcpkgExtractArchive "$downloadPath" "$toolPath"
+ echo "Extracting $tool... done."
+ fi
+
+ if ! [ -e "$exePath" ]; then
+ echo "Could not detect or download $tool"
+ return 1
+ fi
+
+ eval $__output="'$exePath'"
+ return 0
+}
+
+selectCXX()
+{
+ __output=$1
+
+ if [ "x$CXX" = "x" ]; then
+ CXX=g++
+ if which g++-8 >/dev/null 2>&1; then
+ CXX=g++-8
+ elif which g++-7 >/dev/null 2>&1; then
+ CXX=g++-7
+ elif which g++-6 >/dev/null 2>&1; then
+ CXX=g++-6
+ fi
+ fi
+
+ gccversion="$("$CXX" -v 2>&1)"
+ gccversion="$(extractStringBetweenDelimiters "$gccversion" "gcc version " ".")"
+ if [ "$gccversion" -lt "6" ]; then
+ echo "CXX ($CXX) is too old; please install a newer compiler such as g++-7."
+ echo "sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y"
+ echo "sudo apt-get update -y"
+ echo "sudo apt-get install g++-7 -y"
+ return 1
+ fi
+
+ eval $__output="'$CXX'"
+}
+
+# Preparation
+UNAME="$(uname)"
+fetchTool "cmake" "$UNAME" cmakeExe || exit 1
+fetchTool "ninja" "$UNAME" ninjaExe || exit 1
+selectCXX CXX || exit 1
+
+# Do the build
+buildDir="$vcpkgRootDir/toolsrc/build.rel"
+rm -rf "$buildDir"
+mkdir -p "$buildDir"
+
+(cd "$buildDir" && CXX=$CXX "$cmakeExe" .. -DCMAKE_BUILD_TYPE=Release -G "Ninja" "-DCMAKE_MAKE_PROGRAM=$ninjaExe")
+(cd "$buildDir" && "$cmakeExe" --build .)
+
+rm -rf "$vcpkgRootDir/vcpkg"
+cp "$buildDir/vcpkg" "$vcpkgRootDir/"
diff --git a/scripts/buildsystems/msbuild/applocal.ps1 b/scripts/buildsystems/msbuild/applocal.ps1
index 932ba11cd..e5f3c3dd0 100644
--- a/scripts/buildsystems/msbuild/applocal.ps1
+++ b/scripts/buildsystems/msbuild/applocal.ps1
@@ -4,6 +4,7 @@ param([string]$targetBinary, [string]$installedDir, [string]$tlogFile, [string]$
$g_searched = @{}
# Note: installedDir is actually the bin\ directory.
$g_install_root = Split-Path $installedDir -parent
+$g_is_debug = $g_install_root -match '(.*\\)?debug(\\)?$'
# Ensure we create the copied files log, even if we don't end up copying any files
if ($copiedFilesLog)
@@ -24,6 +25,19 @@ function deployBinary([string]$targetBinaryDir, [string]$SourceDir, [string]$tar
if ($tlogFile) { Add-Content $tlogFile "$targetBinaryDir\$targetBinaryName" }
}
+
+Write-Verbose "Resolving base path $targetBinary..."
+try
+{
+ $baseBinaryPath = Resolve-Path $targetBinary -erroraction stop
+ $baseTargetBinaryDir = Split-Path $baseBinaryPath -parent
+}
+catch [System.Management.Automation.ItemNotFoundException]
+{
+ return
+}
+
+# Note: this function signature is depended upon by the qtdeploy.ps1 script
function resolve([string]$targetBinary) {
Write-Verbose "Resolving $targetBinary..."
try
@@ -47,8 +61,19 @@ function resolve([string]$targetBinary) {
}
$g_searched.Set_Item($_, $true)
if (Test-Path "$installedDir\$_") {
- deployBinary $targetBinaryDir $installedDir "$_"
+ deployBinary $baseTargetBinaryDir $installedDir "$_"
if (Test-Path function:\deployPluginsIfQt) { deployPluginsIfQt $targetBinaryDir "$g_install_root\plugins" "$_" }
+ if (Test-Path function:\deployOpenNI2) { deployOpenNI2 $targetBinaryDir "$g_install_root" "$_" }
+ if (Test-Path function:\deployPluginsIfMagnum) {
+ if ($g_is_debug) {
+ deployPluginsIfMagnum $targetBinaryDir "$g_install_root\bin\magnum-d" "$_"
+ } else {
+ deployPluginsIfMagnum $targetBinaryDir "$g_install_root\bin\magnum" "$_"
+ }
+ }
+ resolve "$baseTargetBinaryDir\$_"
+ } elseif (Test-Path "$targetBinaryDir\$_") {
+ Write-Verbose " ${_}: $_ not found in vcpkg; locally deployed"
resolve "$targetBinaryDir\$_"
} else {
Write-Verbose " ${_}: $installedDir\$_ not found"
@@ -63,5 +88,17 @@ if (Test-Path "$g_install_root\plugins\qtdeploy.ps1") {
. "$g_install_root\plugins\qtdeploy.ps1"
}
+# Note: This is a hack to make OpenNI2 work.
+if (Test-Path "$g_install_root\bin\OpenNI2\openni2deploy.ps1") {
+ . "$g_install_root\bin\OpenNI2\openni2deploy.ps1"
+}
+
+# Note: This is a hack to make Magnum work.
+if (Test-Path "$g_install_root\bin\magnum\magnumdeploy.ps1") {
+ . "$g_install_root\bin\magnum\magnumdeploy.ps1"
+} elseif (Test-Path "$g_install_root\bin\magnum-d\magnumdeploy.ps1") {
+ . "$g_install_root\bin\magnum-d\magnumdeploy.ps1"
+}
+
resolve($targetBinary)
-Write-Verbose $($g_searched | out-string) \ No newline at end of file
+Write-Verbose $($g_searched | out-string)
diff --git a/scripts/buildsystems/msbuild/vcpkg.targets b/scripts/buildsystems/msbuild/vcpkg.targets
index 5c24d755a..499052e4d 100644
--- a/scripts/buildsystems/msbuild/vcpkg.targets
+++ b/scripts/buildsystems/msbuild/vcpkg.targets
@@ -24,6 +24,16 @@
<VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">x64-windows</VcpkgTriplet>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)|$(ApplicationType)|$(ApplicationTypeRevision)' == 'arm||'">
+ <VcpkgEnabled Condition="'$(VcpkgEnabled)' == ''">true</VcpkgEnabled>
+ <VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">arm-windows</VcpkgTriplet>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(Platform)|$(ApplicationType)|$(ApplicationTypeRevision)' == 'arm64||'">
+ <VcpkgEnabled Condition="'$(VcpkgEnabled)' == ''">true</VcpkgEnabled>
+ <VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">arm64-windows</VcpkgTriplet>
+ </PropertyGroup>
+
<PropertyGroup Condition="'$(Platform)|$(ApplicationType)|$(ApplicationTypeRevision)' == 'x64|Windows Store|10.0'">
<VcpkgEnabled Condition="'$(VcpkgEnabled)' == ''">true</VcpkgEnabled>
<VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">x64-uwp</VcpkgTriplet>
@@ -34,17 +44,24 @@
<VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">arm-uwp</VcpkgTriplet>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)|$(ApplicationType)|$(ApplicationTypeRevision)' == 'arm64|Windows Store|10.0'">
+ <VcpkgEnabled Condition="'$(VcpkgEnabled)' == ''">true</VcpkgEnabled>
+ <VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">arm64-uwp</VcpkgTriplet>
+ </PropertyGroup>
+
<PropertyGroup Condition="'$(VcpkgEnabled)' == 'true'">
<VcpkgConfiguration Condition="'$(VcpkgConfiguration)' == ''">$(Configuration)</VcpkgConfiguration>
+ <VcpkgNormalizedConfiguration Condition="$(VcpkgConfiguration.StartsWith('Debug'))">Debug</VcpkgNormalizedConfiguration>
+ <VcpkgNormalizedConfiguration Condition="$(VcpkgConfiguration.StartsWith('Release')) or '$(VcpkgConfiguration)' == 'RelWithDebInfo' or '$(VcpkgConfiguration)' == 'MinSizeRel'">Release</VcpkgNormalizedConfiguration>
<VcpkgRoot Condition="'$(VcpkgRoot)' == ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), .vcpkg-root))\installed\$(VcpkgTriplet)\</VcpkgRoot>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(VcpkgEnabled)' == 'true'">
<Link>
- <AdditionalDependencies Condition="'$(VcpkgConfiguration)' == 'Debug' and '$(VcpkgAutoLink)' != 'false'">%(AdditionalDependencies);$(VcpkgRoot)debug\lib\*.lib</AdditionalDependencies>
- <AdditionalDependencies Condition="'$(VcpkgConfiguration)' == 'Release' and '$(VcpkgAutoLink)' != 'false'">%(AdditionalDependencies);$(VcpkgRoot)lib\*.lib</AdditionalDependencies>
- <AdditionalLibraryDirectories Condition="'$(VcpkgConfiguration)' == 'Release'">%(AdditionalLibraryDirectories);$(VcpkgRoot)lib;$(VcpkgRoot)lib\manual-link</AdditionalLibraryDirectories>
- <AdditionalLibraryDirectories Condition="'$(VcpkgConfiguration)' == 'Debug'">%(AdditionalLibraryDirectories);$(VcpkgRoot)debug\lib;$(VcpkgRoot)debug\lib\manual-link</AdditionalLibraryDirectories>
+ <AdditionalDependencies Condition="'$(VcpkgNormalizedConfiguration)' == 'Debug' and '$(VcpkgAutoLink)' != 'false'">%(AdditionalDependencies);$(VcpkgRoot)debug\lib\*.lib</AdditionalDependencies>
+ <AdditionalDependencies Condition="'$(VcpkgNormalizedConfiguration)' == 'Release' and '$(VcpkgAutoLink)' != 'false'">%(AdditionalDependencies);$(VcpkgRoot)lib\*.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories Condition="'$(VcpkgNormalizedConfiguration)' == 'Release'">%(AdditionalLibraryDirectories);$(VcpkgRoot)lib;$(VcpkgRoot)lib\manual-link</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories Condition="'$(VcpkgNormalizedConfiguration)' == 'Debug'">%(AdditionalLibraryDirectories);$(VcpkgRoot)debug\lib;$(VcpkgRoot)debug\lib\manual-link</AdditionalLibraryDirectories>
</Link>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(VcpkgRoot)include</AdditionalIncludeDirectories>
@@ -57,18 +74,19 @@
<Target Name="VcpkgTripletSelection" BeforeTargets="ClCompile">
<Message Text="Using triplet &quot;$(VcpkgTriplet)&quot; from &quot;$(VcpkgRoot)&quot;" Importance="Normal" Condition="'$(VcpkgEnabled)' == 'true'"/>
<Message Text="Not using Vcpkg because VcpkgEnabled is &quot;$(VcpkgEnabled)&quot;" Importance="Normal" Condition="'$(VcpkgEnabled)' != 'true'"/>
+ <Message Text="Vcpkg is unable to link because we cannot decide between Release and Debug libraries. Please define the property VcpkgConfiguration to be 'Release' or 'Debug' (currently '$(VcpkgConfiguration)')." Importance="High" Condition="'$(VcpkgEnabled)' == 'true' and '$(VcpkgNormalizedConfiguration)' == ''"/>
</Target>
<Target Name="AppLocalFromInstalled" AfterTargets="CopyFilesToOutputDirectory" BeforeTargets="CopyLocalFilesOutputGroup;RegisterOutput" Condition="'$(VcpkgEnabled)' == 'true'">
<WriteLinesToFile
File="$(TLogLocation)$(ProjectName).write.1u.tlog"
Lines="^$(TargetPath);$([System.IO.Path]::Combine($(ProjectDir),$(IntDir)))vcpkg.applocal.log" Encoding="Unicode"/>
- <Exec Condition="'$(VcpkgConfiguration)' == 'Debug'"
- Command="powershell.exe -ExecutionPolicy Bypass -noprofile -File %22$(MSBuildThisFileDirectory)applocal.ps1%22 %22$(TargetPath)%22 %22$(VcpkgRoot)debug\bin%22 %22$(TLogLocation)$(ProjectName).write.1u.tlog%22 %22$(IntDir)vcpkg.applocal.log%22"
+ <Exec Condition="$(VcpkgConfiguration.StartsWith('Debug'))"
+ Command="$(SystemRoot)\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File %22$(MSBuildThisFileDirectory)applocal.ps1%22 %22$(TargetPath)%22 %22$(VcpkgRoot)debug\bin%22 %22$(TLogLocation)$(ProjectName).write.1u.tlog%22 %22$(IntDir)vcpkg.applocal.log%22"
StandardOutputImportance="Normal">
</Exec>
- <Exec Condition="'$(VcpkgConfiguration)' == 'Release'"
- Command="powershell.exe -ExecutionPolicy Bypass -noprofile -File %22$(MSBuildThisFileDirectory)applocal.ps1%22 %22$(TargetPath)%22 %22$(VcpkgRoot)bin%22 %22$(TLogLocation)$(ProjectName).write.1u.tlog%22 %22$(IntDir)vcpkg.applocal.log%22"
+ <Exec Condition="$(VcpkgConfiguration.StartsWith('Release'))"
+ Command="$(SystemRoot)\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File %22$(MSBuildThisFileDirectory)applocal.ps1%22 %22$(TargetPath)%22 %22$(VcpkgRoot)bin%22 %22$(TLogLocation)$(ProjectName).write.1u.tlog%22 %22$(IntDir)vcpkg.applocal.log%22"
StandardOutputImportance="Normal">
</Exec>
<ReadLinesFromFile File="$(IntDir)vcpkg.applocal.log">
diff --git a/scripts/buildsystems/vcpkg.cmake b/scripts/buildsystems/vcpkg.cmake
index 26fa020db..91c196fb9 100644
--- a/scripts/buildsystems/vcpkg.cmake
+++ b/scripts/buildsystems/vcpkg.cmake
@@ -1,48 +1,78 @@
-if(NOT VCPKG_TOOLCHAIN)
- if(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$")
+# Mark variables as used so cmake doesn't complain about them
+mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
+
+# This is a backport of CMAKE_TRY_COMPILE_PLATFORM_VARIABLES to cmake 3.0
+get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
+if( _CMAKE_IN_TRY_COMPILE )
+ include( "${CMAKE_CURRENT_SOURCE_DIR}/../vcpkg.config.cmake" OPTIONAL )
+endif()
+
+if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
+ include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
+endif()
+
+if(VCPKG_TOOLCHAIN)
+ return()
+endif()
+
+if(VCPKG_TARGET_TRIPLET)
+elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH x86)
+elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH x64)
+elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH arm)
+elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH arm64)
+else()
+ if(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 Win64$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH x64)
+ elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 ARM$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH arm)
+ elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015$")
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
- elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$")
+ elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 Win64$")
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
- elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$")
+ elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 ARM$")
set(_VCPKG_TARGET_TRIPLET_ARCH arm)
+ elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH x86)
else()
- if(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 Win64$")
+ find_program(_VCPKG_CL cl)
+ if(_VCPKG_CL MATCHES "amd64/cl.exe$" OR _VCPKG_CL MATCHES "x64/cl.exe$")
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
- elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015 ARM$")
+ elseif(_VCPKG_CL MATCHES "arm/cl.exe$")
set(_VCPKG_TARGET_TRIPLET_ARCH arm)
- elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015$")
+ elseif(_VCPKG_CL MATCHES "arm64/cl.exe$")
+ set(_VCPKG_TARGET_TRIPLET_ARCH arm64)
+ elseif(_VCPKG_CL MATCHES "bin/cl.exe$" OR _VCPKG_CL MATCHES "x86/cl.exe$")
set(_VCPKG_TARGET_TRIPLET_ARCH x86)
- elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 Win64$")
+ elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
set(_VCPKG_TARGET_TRIPLET_ARCH x64)
- elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017 ARM")
- set(_VCPKG_TARGET_TRIPLET_ARCH arm)
- elseif(CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017")
- set(_VCPKG_TARGET_TRIPLET_ARCH x86)
else()
- find_program(_VCPKG_CL cl)
- if(_VCPKG_CL MATCHES "amd64/cl.exe$" OR _VCPKG_CL MATCHES "x64/cl.exe$")
- set(_VCPKG_TARGET_TRIPLET_ARCH x64)
- elseif(_VCPKG_CL MATCHES "arm/cl.exe$")
- set(_VCPKG_TARGET_TRIPLET_ARCH arm)
- elseif(_VCPKG_CL MATCHES "bin/cl.exe$" OR _VCPKG_CL MATCHES "x86/cl.exe$")
- set(_VCPKG_TARGET_TRIPLET_ARCH x86)
- else()
- message(FATAL_ERROR "Unable to determine target architecture.")
- endif()
+ message(FATAL_ERROR "Unable to determine target architecture.")
endif()
endif()
+endif()
- if(WINDOWS_STORE OR WINDOWS_PHONE)
- set(_VCPKG_TARGET_TRIPLET_PLAT uwp)
- else()
- set(_VCPKG_TARGET_TRIPLET_PLAT windows)
- endif()
+if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsPhone")
+ set(_VCPKG_TARGET_TRIPLET_PLAT uwp)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux"))
+ set(_VCPKG_TARGET_TRIPLET_PLAT linux)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin"))
+ set(_VCPKG_TARGET_TRIPLET_PLAT osx)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows"))
+ set(_VCPKG_TARGET_TRIPLET_PLAT windows)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR (NOT CMAKE_SYSTEM_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD"))
+ set(_VCPKG_TARGET_TRIPLET_PLAT freebsd)
+endif()
- set(VCPKG_TARGET_TRIPLET ${_VCPKG_TARGET_TRIPLET_ARCH}-${_VCPKG_TARGET_TRIPLET_PLAT} CACHE STRING "Vcpkg target triplet (ex. x86-windows)")
- set(_VCPKG_TOOLCHAIN_DIR ${CMAKE_CURRENT_LIST_DIR})
+set(VCPKG_TARGET_TRIPLET ${_VCPKG_TARGET_TRIPLET_ARCH}-${_VCPKG_TARGET_TRIPLET_PLAT} CACHE STRING "Vcpkg target triplet (ex. x86-windows)")
+set(_VCPKG_TOOLCHAIN_DIR ${CMAKE_CURRENT_LIST_DIR})
- #Detect .vcpkg-root to figure VCPKG_ROOT_DIR
- SET(_VCPKG_ROOT_DIR_CANDIDATE ${CMAKE_CURRENT_LIST_DIR})
+if(NOT DEFINED _VCPKG_ROOT_DIR)
+ # Detect .vcpkg-root to figure VCPKG_ROOT_DIR
+ set(_VCPKG_ROOT_DIR_CANDIDATE ${CMAKE_CURRENT_LIST_DIR})
while(IS_DIRECTORY ${_VCPKG_ROOT_DIR_CANDIDATE} AND NOT EXISTS "${_VCPKG_ROOT_DIR_CANDIDATE}/.vcpkg-root")
get_filename_component(_VCPKG_ROOT_DIR_TEMP ${_VCPKG_ROOT_DIR_CANDIDATE} DIRECTORY)
if (_VCPKG_ROOT_DIR_TEMP STREQUAL _VCPKG_ROOT_DIR_CANDIDATE) # If unchanged, we have reached the root of the drive
@@ -51,85 +81,187 @@ if(NOT VCPKG_TOOLCHAIN)
SET(_VCPKG_ROOT_DIR_CANDIDATE ${_VCPKG_ROOT_DIR_TEMP})
endif()
endwhile()
- set(_VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR_CANDIDATE})
+ set(_VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR_CANDIDATE} CACHE INTERNAL "Vcpkg root directory")
+endif()
+set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed)
- set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed)
+if(NOT EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" AND NOT _CMAKE_IN_TRY_COMPILE)
+ message(WARNING "There are no libraries installed for the Vcpkg triplet ${VCPKG_TARGET_TRIPLET}.")
+endif()
- if(CMAKE_BUILD_TYPE MATCHES "^Debug$" OR NOT DEFINED CMAKE_BUILD_TYPE)
- list(APPEND CMAKE_PREFIX_PATH
- ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug
- )
- list(APPEND CMAKE_LIBRARY_PATH
- ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link
- )
- endif()
+if(CMAKE_BUILD_TYPE MATCHES "^Debug$" OR NOT DEFINED CMAKE_BUILD_TYPE)
list(APPEND CMAKE_PREFIX_PATH
- ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}
+ ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug
)
list(APPEND CMAKE_LIBRARY_PATH
- ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link
+ ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link
+ )
+ list(APPEND CMAKE_FIND_ROOT_PATH
+ ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug
)
+endif()
+list(APPEND CMAKE_PREFIX_PATH
+ ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}
+)
+list(APPEND CMAKE_FIND_ROOT_PATH
+ ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}
+)
+list(APPEND CMAKE_LIBRARY_PATH
+ ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link
+)
- set(Boost_COMPILER "-vc140")
+file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
+set(CMAKE_SYSTEM_IGNORE_PATH
+ "${_programfiles}/OpenSSL"
+ "${_programfiles}/OpenSSL-Win32"
+ "${_programfiles}/OpenSSL-Win64"
+ "${_programfiles}/OpenSSL-Win32/lib/VC"
+ "${_programfiles}/OpenSSL-Win64/lib/VC"
+ "${_programfiles}/OpenSSL-Win32/lib/VC/static"
+ "${_programfiles}/OpenSSL-Win64/lib/VC/static"
+ "C:/OpenSSL/"
+ "C:/OpenSSL-Win32/"
+ "C:/OpenSSL-Win64/"
+ "C:/OpenSSL-Win32/lib/VC"
+ "C:/OpenSSL-Win64/lib/VC"
+ "C:/OpenSSL-Win32/lib/VC/static"
+ "C:/OpenSSL-Win64/lib/VC/static"
+)
- if (NOT DEFINED CMAKE_SYSTEM_VERSION)
- include(${_VCPKG_ROOT_DIR}/scripts/cmake/vcpkg_get_windows_sdk.cmake)
- # This is used as an implicit parameter for vcpkg_get_windows_sdk
- set(VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR})
- vcpkg_get_windows_sdk(WINDOWS_SDK_VERSION)
- unset(VCPKG_ROOT_DIR)
- set(CMAKE_SYSTEM_VERSION ${WINDOWS_SDK_VERSION})
+list(APPEND CMAKE_PROGRAM_PATH ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools)
+file(GLOB _VCPKG_TOOLS_DIRS ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/*)
+foreach(_VCPKG_TOOLS_DIR ${_VCPKG_TOOLS_DIRS})
+ if(IS_DIRECTORY ${_VCPKG_TOOLS_DIR})
+ list(APPEND CMAKE_PROGRAM_PATH ${_VCPKG_TOOLS_DIR})
endif()
+endforeach()
- file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
- set(CMAKE_SYSTEM_IGNORE_PATH
- "${_programfiles}/OpenSSL"
- "${_programfiles}/OpenSSL-Win32"
- "${_programfiles}/OpenSSL-Win64"
- "${_programfiles}/OpenSSL-Win32/lib/VC"
- "${_programfiles}/OpenSSL-Win64/lib/VC"
- "${_programfiles}/OpenSSL-Win32/lib/VC/static"
- "${_programfiles}/OpenSSL-Win64/lib/VC/static"
- "C:/OpenSSL/"
- "C:/OpenSSL-Win32/"
- "C:/OpenSSL-Win64/"
- "C:/OpenSSL-Win32/lib/VC"
- "C:/OpenSSL-Win64/lib/VC"
- "C:/OpenSSL-Win32/lib/VC/static"
- "C:/OpenSSL-Win64/lib/VC/static"
- )
+option(VCPKG_APPLOCAL_DEPS "Automatically copy dependencies into the output directory for executables." ON)
+function(add_executable name)
+ _add_executable(${ARGV})
+ list(FIND ARGV "IMPORTED" IMPORTED_IDX)
+ list(FIND ARGV "ALIAS" ALIAS_IDX)
+ if(IMPORTED_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
+ if(VCPKG_APPLOCAL_DEPS AND _VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp")
+ add_custom_command(TARGET ${name} POST_BUILD
+ COMMAND powershell -noprofile -executionpolicy Bypass -file ${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1
+ -targetBinary $<TARGET_FILE:${name}>
+ -installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$<CONFIG:Debug>:/debug>/bin"
+ -OutVariable out
+ )
+ endif()
+ set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props)
+ set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false)
+ endif()
+endfunction()
+
+function(add_library name)
+ _add_library(${ARGV})
+ list(FIND ARGV "IMPORTED" IMPORTED_IDX)
+ list(FIND ARGV "INTERFACE" INTERFACE_IDX)
+ list(FIND ARGV "ALIAS" ALIAS_IDX)
+ if(IMPORTED_IDX EQUAL -1 AND INTERFACE_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
+ get_target_property(IS_LIBRARY_SHARED ${name} TYPE)
+ if(VCPKG_APPLOCAL_DEPS AND _VCPKG_TARGET_TRIPLET_PLAT MATCHES "windows|uwp" AND (IS_LIBRARY_SHARED STREQUAL "SHARED_LIBRARY" OR IS_LIBRARY_SHARED STREQUAL "MODULE_LIBRARY"))
+ add_custom_command(TARGET ${name} POST_BUILD
+ COMMAND powershell -noprofile -executionpolicy Bypass -file ${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1
+ -targetBinary $<TARGET_FILE:${name}>
+ -installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$<CONFIG:Debug>:/debug>/bin"
+ -OutVariable out
+ )
+ endif()
+ set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props)
+ set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false)
+ endif()
+endfunction()
- set(CMAKE_PROGRAM_PATH ${CMAKE_PROGRAM_PATH} ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools)
-
- option(VCPKG_APPLOCAL_DEPS "Automatically copy dependencies into the output directory for executables." ON)
- function(add_executable name)
- _add_executable(${ARGV})
- list(FIND ARGV "IMPORTED" IMPORTED_IDX)
- list(FIND ARGV "ALIAS" ALIAS_IDX)
- if(IMPORTED_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
- if(VCPKG_APPLOCAL_DEPS)
- add_custom_command(TARGET ${name} POST_BUILD
- COMMAND powershell -noprofile -executionpolicy Bypass -file ${_VCPKG_TOOLCHAIN_DIR}/msbuild/applocal.ps1
- -targetBinary $<TARGET_FILE:${name}>
- -installedDir "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$<CONFIG:Debug>:/debug>/bin"
- -OutVariable out
- )
+macro(find_package name)
+ string(TOLOWER "${name}" _vcpkg_lowercase_name)
+ if(EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/${_vcpkg_lowercase_name}/vcpkg-cmake-wrapper.cmake")
+ set(ARGS "${ARGV}")
+ include(${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/${_vcpkg_lowercase_name}/vcpkg-cmake-wrapper.cmake)
+ elseif("${name}" STREQUAL "Boost" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/boost")
+ # Checking for the boost headers disables this wrapper unless the user has installed at least one boost library
+ unset(Boost_USE_STATIC_LIBS)
+ unset(Boost_USE_MULTITHREADED)
+ unset(Boost_USE_STATIC_RUNTIME)
+ set(Boost_COMPILER "-vc140")
+ _find_package(${ARGV})
+ elseif("${name}" STREQUAL "ICU" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/unicode/utf.h")
+ function(_vcpkg_find_in_list)
+ list(FIND ARGV "COMPONENTS" COMPONENTS_IDX)
+ set(COMPONENTS_IDX ${COMPONENTS_IDX} PARENT_SCOPE)
+ endfunction()
+ _vcpkg_find_in_list(${ARGV})
+ if(NOT COMPONENTS_IDX EQUAL -1)
+ _find_package(${ARGV} COMPONENTS data)
+ else()
+ _find_package(${ARGV})
+ endif()
+ elseif("${name}" STREQUAL "TIFF" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/tiff.h")
+ _find_package(${ARGV})
+ find_package(LibLZMA)
+ if(TARGET TIFF::TIFF)
+ set_property(TARGET TIFF::TIFF APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${LIBLZMA_LIBRARIES})
+ endif()
+ if(TIFF_LIBRARIES)
+ list(APPEND TIFF_LIBRARIES ${LIBLZMA_LIBRARIES})
+ endif()
+ elseif(("${name}" STREQUAL "HDF5" OR "${name}" STREQUAL "hdf5") AND NOT PROJECT_NAME STREQUAL "VTK" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/hdf5.h")
+ # This is a hack to make VTK work. TODO: find another way to suppress the built-in find module.
+ _find_package(${ARGV} CONFIG)
+ # Fill in missing static/shared targets
+ foreach(HDF5TARGET hdf5 hdf5_hl hdf5_cpp hdf5_hl_cpp)
+ if(TARGET hdf5::${HDF5TARGET}-static AND NOT TARGET hdf5::${HDF5TARGET}-shared)
+ _add_library(hdf5::${HDF5TARGET}-shared INTERFACE IMPORTED)
+ set_target_properties(hdf5::${HDF5TARGET}-shared PROPERTIES INTERFACE_LINK_LIBRARIES "hdf5::${HDF5TARGET}-static")
+ elseif(TARGET hdf5::${HDF5TARGET}-shared AND NOT TARGET hdf5::${HDF5TARGET}-static)
+ _add_library(hdf5::${HDF5TARGET}-static INTERFACE IMPORTED)
+ set_target_properties(hdf5::${HDF5TARGET}-static PROPERTIES INTERFACE_LINK_LIBRARIES "hdf5::${HDF5TARGET}-shared")
+ endif()
+ endforeach()
+ elseif("${name}" STREQUAL "GSL" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/gsl")
+ _find_package(${ARGV})
+ if(GSL_FOUND AND TARGET GSL::gsl)
+ set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Release )
+ set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Release )
+ if( EXISTS "${GSL_LIBRARY_DEBUG}" AND EXISTS "${GSL_CBLAS_LIBRARY_DEBUG}")
+ set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
+ set_target_properties( GSL::gsl PROPERTIES IMPORTED_LOCATION_DEBUG "${GSL_LIBRARY_DEBUG}" )
+ set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
+ set_target_properties( GSL::gslcblas PROPERTIES IMPORTED_LOCATION_DEBUG "${GSL_CBLAS_LIBRARY_DEBUG}" )
endif()
- set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props)
- set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false)
endif()
- endfunction()
-
- function(add_library name)
- _add_library(${ARGV})
- list(FIND ARGV "IMPORTED" IMPORTED_IDX)
- list(FIND ARGV "INTERFACE" INTERFACE_IDX)
- list(FIND ARGV "ALIAS" ALIAS_IDX)
- if(IMPORTED_IDX EQUAL -1 AND INTERFACE_IDX EQUAL -1 AND ALIAS_IDX EQUAL -1)
- set_target_properties(${name} PROPERTIES VS_USER_PROPS do_not_import_user.props)
- set_target_properties(${name} PROPERTIES VS_GLOBAL_VcpkgEnabled false)
+ elseif("${name}" STREQUAL "CURL" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/curl")
+ _find_package(${ARGV})
+ if(CURL_FOUND)
+ if(EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/nghttp2.lib")
+ list(APPEND CURL_LIBRARIES
+ "debug" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/nghttp2.lib"
+ "optimized" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/nghttp2.lib")
+ endif()
endif()
- endfunction()
+ elseif("${_vcpkg_lowercase_name}" STREQUAL "grpc" AND EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/grpc")
+ _find_package(gRPC ${ARGN})
+ else()
+ _find_package(${ARGV})
+ endif()
+endmacro()
- set(VCPKG_TOOLCHAIN ON)
+set(VCPKG_TOOLCHAIN ON)
+set(_UNUSED ${CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION})
+set(_UNUSED ${CMAKE_EXPORT_NO_PACKAGE_REGISTRY})
+set(_UNUSED ${CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY})
+set(_UNUSED ${CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY})
+set(_UNUSED ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP})
+
+if(NOT _CMAKE_IN_TRY_COMPILE)
+ file(TO_CMAKE_PATH "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" _chainload_file)
+ file(TO_CMAKE_PATH "${_VCPKG_ROOT_DIR}" _root_dir)
+ file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/vcpkg.config.cmake"
+ "set(VCPKG_TARGET_TRIPLET \"${VCPKG_TARGET_TRIPLET}\" CACHE STRING \"\")\n"
+ "set(VCPKG_APPLOCAL_DEPS \"${VCPKG_APPLOCAL_DEPS}\" CACHE STRING \"\")\n"
+ "set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE \"${_chainload_file}\" CACHE STRING \"\")\n"
+ "set(_VCPKG_ROOT_DIR \"${_root_dir}\" CACHE STRING \"\")\n"
+ )
endif()
diff --git a/scripts/cleanEnvironmentHelper.ps1 b/scripts/cleanEnvironmentHelper.ps1
new file mode 100644
index 000000000..0a133f5f8
--- /dev/null
+++ b/scripts/cleanEnvironmentHelper.ps1
@@ -0,0 +1,52 @@
+# Capture environment variables for the System and User. Also add some special/built-in variables.
+# These will be used to synthesize a clean environment
+$specialEnvironmentMap = @{ "SystemDrive"=$env:SystemDrive; "SystemRoot"=$env:SystemRoot; "UserProfile"=$env:UserProfile } # These are built-in and not set in the registry
+$machineEnvironmentMap = [Environment]::GetEnvironmentVariables('Machine') # HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
+$userEnvironmentMap = [Environment]::GetEnvironmentVariables('User') # HKEY_CURRENT_USER\Environment
+
+# Identify the keySet of environment variable names
+$nameSet = ($specialEnvironmentMap.Keys + $machineEnvironmentMap.Keys + $userEnvironmentMap.Keys) | Sort-Object | Select-Object -Unique
+
+# Any environment variable in the $nameSet should be restored to its original value
+foreach ($name in $nameSet)
+{
+ if ($specialEnvironmentMap.ContainsKey($name))
+ {
+ [Environment]::SetEnvironmentVariable($name, $specialEnvironmentMap[$name], 'Process')
+ continue;
+ }
+
+ # PATH needs to be concatenated as it has values in both machine and user environment. Any other values should be set.
+ if ($name -match 'path')
+ {
+ $pathValuePartial = @()
+ # Machine values before user values
+ $pathValuePartial += $machineEnvironmentMap[$name] -split ';'
+ $pathValuePartial += $userEnvironmentMap[$name] -split ';'
+ $pathValue = $pathValuePartial -join ';'
+ [Environment]::SetEnvironmentVariable($name, $pathValue, 'Process')
+ continue;
+ }
+
+ if ($userEnvironmentMap.ContainsKey($name))
+ {
+ [Environment]::SetEnvironmentVariable($name, $userEnvironmentMap[$name], 'Process')
+ continue;
+ }
+
+ if ($machineEnvironmentMap.ContainsKey($name))
+ {
+ [Environment]::SetEnvironmentVariable($name, $machineEnvironmentMap[$name], 'Process')
+ continue;
+ }
+
+ throw "Unreachable: Unknown variable $name"
+}
+
+# Any environment variable NOT in the $nameSet should be removed
+$processEnvironmentMap = [Environment]::GetEnvironmentVariables('Process')
+$variablesForRemoval = $processEnvironmentMap.Keys | Where-Object {$nameSet -notcontains $_}
+foreach ($name in $variablesForRemoval)
+{
+ [Environment]::SetEnvironmentVariable($name, $null, 'Process')
+}
diff --git a/scripts/cmake/vcpkg_acquire_msys.cmake b/scripts/cmake/vcpkg_acquire_msys.cmake
index ee526529b..eec08e3f1 100644
--- a/scripts/cmake/vcpkg_acquire_msys.cmake
+++ b/scripts/cmake/vcpkg_acquire_msys.cmake
@@ -1,5 +1,43 @@
+## # vcpkg_acquire_msys
+##
+## Download and prepare an MSYS2 instance.
+##
+## ## Usage
+## ```cmake
+## vcpkg_acquire_msys(<MSYS_ROOT_VAR> [PACKAGES <package>...])
+## ```
+##
+## ## Parameters
+## ### MSYS_ROOT_VAR
+## An out-variable that will be set to the path to MSYS2.
+##
+## ### PACKAGES
+## A list of packages to acquire in msys.
+##
+## To ensure a package is available: `vcpkg_acquire_msys(MSYS_ROOT PACKAGES make automake1.15)`
+##
+## ## Notes
+## A call to `vcpkg_acquire_msys` will usually be followed by a call to `bash.exe`:
+## ```cmake
+## vcpkg_acquire_msys(MSYS_ROOT)
+## set(BASH ${MSYS_ROOT}/usr/bin/bash.exe)
+##
+## vcpkg_execute_required_process(
+## COMMAND ${BASH} --noprofile --norc "${CMAKE_CURRENT_LIST_DIR}\\build.sh"
+## WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
+## LOGNAME build-${TARGET_TRIPLET}-rel
+## )
+## ```
+##
+## ## Examples
+##
+## * [ffmpeg](https://github.com/Microsoft/vcpkg/blob/master/ports/ffmpeg/portfile.cmake)
+## * [icu](https://github.com/Microsoft/vcpkg/blob/master/ports/icu/portfile.cmake)
+## * [libvpx](https://github.com/Microsoft/vcpkg/blob/master/ports/libvpx/portfile.cmake)
+
function(vcpkg_acquire_msys PATH_TO_ROOT_OUT)
set(TOOLPATH ${DOWNLOADS}/tools/msys2)
+ cmake_parse_arguments(_am "" "" "PACKAGES" ${ARGN})
# detect host architecture
if(DEFINED ENV{PROCESSOR_ARCHITEW6432})
@@ -10,38 +48,68 @@ function(vcpkg_acquire_msys PATH_TO_ROOT_OUT)
if(_vam_HOST_ARCHITECTURE STREQUAL "AMD64")
set(TOOLSUBPATH msys64)
- set(URL "https://sourceforge.net/projects/msys2/files/Base/x86_64/msys2-base-x86_64-20161025.tar.xz/download")
+ set(URLS
+ "http://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20161025.tar.xz"
+ "https://sourceforge.net/projects/msys2/files/Base/x86_64/msys2-base-x86_64-20161025.tar.xz/download"
+ )
set(ARCHIVE "msys2-base-x86_64-20161025.tar.xz")
set(HASH 6c4c18ec59db80b8269698d074866438a624f1ce735ee5005a01b148b02e8f2e966ae381aa1cb4c50f6226c3b7feb271e36907cf26580df084d695b3c9f5c0eb)
- set(STAMP "initialized-msys2.stamp")
+ set(STAMP "initialized-msys2_64.stamp")
else()
set(TOOLSUBPATH msys32)
- set(URL "https://sourceforge.net/projects/msys2/files/Base/i686/msys2-base-i686-20161025.tar.xz/download")
+ set(URLS
+ "http://repo.msys2.org/distrib/i686/msys2-base-i686-20161025.tar.xz"
+ "https://sourceforge.net/projects/msys2/files/Base/i686/msys2-base-i686-20161025.tar.xz/download"
+ )
set(ARCHIVE "msys2-base-i686-20161025.tar.xz")
set(HASH c9260a38e0c6bf963adeaea098c4e376449c1dd0afe07480741d6583a1ac4c138951ccb0c5388bd148e04255a5c1a23bf5ee2d58dcd6607c14f1eaa5639a7c85)
- set(STAMP "initialized-msys2_x64.stamp")
+ set(STAMP "initialized-msys2_32.stamp")
endif()
set(PATH_TO_ROOT ${TOOLPATH}/${TOOLSUBPATH})
if(NOT EXISTS "${TOOLPATH}/${STAMP}")
+
message(STATUS "Acquiring MSYS2...")
- file(DOWNLOAD ${URL} ${DOWNLOADS}/${ARCHIVE}
- EXPECTED_HASH SHA512=${HASH}
+ vcpkg_download_distfile(ARCHIVE_PATH
+ URLS ${URLS}
+ FILENAME ${ARCHIVE}
+ SHA512 ${HASH}
)
+
file(REMOVE_RECURSE ${TOOLPATH}/${TOOLSUBPATH})
file(MAKE_DIRECTORY ${TOOLPATH})
execute_process(
- COMMAND ${CMAKE_COMMAND} -E tar xzf ${DOWNLOADS}/${ARCHIVE}
+ COMMAND ${CMAKE_COMMAND} -E tar xzf ${ARCHIVE_PATH}
+ WORKING_DIRECTORY ${TOOLPATH}
+ )
+ execute_process(
+ COMMAND ${PATH_TO_ROOT}/usr/bin/bash.exe --noprofile --norc -c "PATH=/usr/bin;pacman-key --init;pacman-key --populate"
WORKING_DIRECTORY ${TOOLPATH}
)
execute_process(
- COMMAND ${PATH_TO_ROOT}/usr/bin/bash.exe --noprofile --norc -c "PATH=/usr/bin:\$PATH;pacman-key --init;pacman-key --populate"
+ COMMAND ${PATH_TO_ROOT}/usr/bin/bash.exe --noprofile --norc -c "PATH=/usr/bin;pacman -Syu --noconfirm"
WORKING_DIRECTORY ${TOOLPATH}
)
file(WRITE "${TOOLPATH}/${STAMP}" "0")
message(STATUS "Acquiring MSYS2... OK")
endif()
+ if(_am_PACKAGES)
+ message(STATUS "Acquiring MSYS Packages...")
+ string(REPLACE ";" " " _am_PACKAGES "${_am_PACKAGES}")
+
+ set(_ENV_ORIGINAL $ENV{PATH})
+ set(ENV{PATH} ${PATH_TO_ROOT}/usr/bin)
+ vcpkg_execute_required_process(
+ COMMAND ${PATH_TO_ROOT}/usr/bin/bash.exe --noprofile --norc -c "pacman -Sy --noconfirm --needed ${_am_PACKAGES}"
+ WORKING_DIRECTORY ${TOOLPATH}
+ LOGNAME msys-pacman-${TARGET_TRIPLET}
+ )
+ set(ENV{PATH} "${_ENV_ORIGINAL}")
+
+ message(STATUS "Acquiring MSYS Packages... OK")
+ endif()
+
set(${PATH_TO_ROOT_OUT} ${PATH_TO_ROOT} PARENT_SCOPE)
endfunction()
diff --git a/scripts/cmake/vcpkg_apply_patches.cmake b/scripts/cmake/vcpkg_apply_patches.cmake
index 1ef138a1e..1894d6e9a 100644
--- a/scripts/cmake/vcpkg_apply_patches.cmake
+++ b/scripts/cmake/vcpkg_apply_patches.cmake
@@ -1,23 +1,35 @@
-#.rst:
-# .. command:: vcpkg_apply_patches
-#
-# Apply a set of patches to a source tree.
-#
-# ::
-# vcpkg_apply_patches(SOURCE_PATH <source_path>
-# PATCHES patch1 [patch ...]
-# )
-#
-# ``SOURCE_PATH``
-# The source path in which apply the patches.
-# ``PATCHES``
-# A list of patches that are applied to the source tree
-# ``QUIET``
-# If this option is passed, the warning message when applyng
-# a patch fails is not printed. This is convenient for patches
-# that are known to fail even on a clean source tree, and for
-# which the standard warning message would be confusing for the user.
-#
+## # vcpkg_apply_patches
+##
+## Apply a set of patches to a source tree.
+##
+## ## Usage
+## ```cmake
+## vcpkg_apply_patches(
+## SOURCE_PATH <${SOURCE_PATH}>
+## [QUIET]
+## PATCHES <patch1.patch>...
+## )
+## ```
+##
+## ## Parameters
+## ### SOURCE_PATH
+## The source path in which apply the patches. By convention, this is usually set in the portfile as the variable `SOURCE_PATH`.
+##
+## ### PATCHES
+## A list of patches that are applied to the source tree.
+##
+## Generally, these take the form of `${CMAKE_CURRENT_LIST_DIR}/some.patch` to select patches in the `port\<port>\` directory.
+##
+## ### QUIET
+## Disables the warning message upon failure.
+##
+## This should only be used for edge cases, such as patches that are known to fail even on a clean source tree.
+##
+## ## Examples
+##
+## * [boost](https://github.com/Microsoft/vcpkg/blob/master/ports/boost/portfile.cmake)
+## * [freetype](https://github.com/Microsoft/vcpkg/blob/master/ports/freetype/portfile.cmake)
+## * [libpng](https://github.com/Microsoft/vcpkg/blob/master/ports/libpng/portfile.cmake)
function(vcpkg_apply_patches)
cmake_parse_arguments(_ap "QUIET" "SOURCE_PATH" "PATCHES" ${ARGN})
@@ -35,7 +47,7 @@ function(vcpkg_apply_patches)
RESULT_VARIABLE error_code
)
- if(error_code AND NOT ${_ap_QUIET})
+ if(error_code AND NOT _ap_QUIET)
message(STATUS "Applying patch failed. This is expected if this patch was previously applied.")
endif()
diff --git a/scripts/cmake/vcpkg_build_cmake.cmake b/scripts/cmake/vcpkg_build_cmake.cmake
index 18e2a8b00..983ac9221 100644
--- a/scripts/cmake/vcpkg_build_cmake.cmake
+++ b/scripts/cmake/vcpkg_build_cmake.cmake
@@ -1,41 +1,183 @@
+## # vcpkg_build_cmake
+##
+## Build a cmake project.
+##
+## ## Usage:
+## ```cmake
+## vcpkg_build_cmake([DISABLE_PARALLEL] [TARGET <target>])
+## ```
+##
+## ## Parameters:
+## ### DISABLE_PARALLEL
+## The underlying buildsystem will be instructed to not parallelize
+##
+## ### TARGET
+## The target passed to the cmake build command (`cmake --build . --target <target>`). If not specified, no target will
+## be passed.
+##
+## ### ADD_BIN_TO_PATH
+## Adds the appropriate Release and Debug `bin\` directories to the path during the build such that executables can run against the in-tree DLLs.
+##
+## ## Notes:
+## This command should be preceeded by a call to [`vcpkg_configure_cmake()`](vcpkg_configure_cmake.md).
+## You can use the alias [`vcpkg_install_cmake()`](vcpkg_configure_cmake.md) function if your CMake script supports the
+## "install" target
+##
+## ## Examples:
+##
+## * [zlib](https://github.com/Microsoft/vcpkg/blob/master/ports/zlib/portfile.cmake)
+## * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake)
+## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake)
+## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake)
function(vcpkg_build_cmake)
- cmake_parse_arguments(_bc "MSVC_64_TOOLSET;DISABLE_PARALLEL" "" "" ${ARGN})
-
- set(MSVC_EXTRA_ARGS
- "/p:VCPkgLocalAppDataDisabled=true"
- "/p:UseIntelMKL=No"
- )
-
- # Specifies the architecture of the toolset, NOT the architecture of the produced binary
- # This can help libraries that cause the linker to run out of memory.
- # https://support.microsoft.com/en-us/help/2891057/linker-fatal-error-lnk1102-out-of-memory
- if (_bc_MSVC_64_TOOLSET)
- list(APPEND MSVC_EXTRA_ARGS "/p:PreferredToolArchitecture=x64")
+ cmake_parse_arguments(_bc "DISABLE_PARALLEL;ADD_BIN_TO_PATH" "TARGET;LOGFILE_ROOT" "" ${ARGN})
+
+ if(NOT _bc_LOGFILE_ROOT)
+ set(_bc_LOGFILE_ROOT "build")
endif()
- if (NOT _bc_DISABLE_PARALLEL)
- list(APPEND MSVC_EXTRA_ARGS "/m")
+ set(PARALLEL_ARG)
+ set(NO_PARALLEL_ARG)
+
+ if(_VCPKG_CMAKE_GENERATOR MATCHES "Ninja")
+ set(BUILD_ARGS "-v") # verbose output
+ set(NO_PARALLEL_ARG "-j1")
+ elseif(_VCPKG_CMAKE_GENERATOR MATCHES "Visual Studio")
+ set(BUILD_ARGS
+ "/p:VCPkgLocalAppDataDisabled=true"
+ "/p:UseIntelMKL=No"
+ )
+ set(PARALLEL_ARG "/m")
+ elseif(_VCPKG_CMAKE_GENERATOR MATCHES "NMake")
+ # No options are currently added for nmake builds
+ else()
+ message(FATAL_ERROR "Unrecognized GENERATOR setting from vcpkg_configure_cmake(). Valid generators are: Ninja, Visual Studio, and NMake Makefiles")
endif()
- if(EXISTS ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/build.ninja)
- set(BUILD_ARGS -v) # verbose output
+ if(_bc_TARGET)
+ set(TARGET_PARAM "--target" ${_bc_TARGET})
else()
- set(BUILD_ARGS ${MSVC_EXTRA_ARGS})
+ set(TARGET_PARAM)
+ endif()
+
+ if(_bc_DISABLE_PARALLEL)
+ set(PARALLEL_ARG ${NO_PARALLEL_ARG})
endif()
- message(STATUS "Build ${TARGET_TRIPLET}-rel")
- vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${BUILD_ARGS}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
- LOGNAME build-${TARGET_TRIPLET}-rel
- )
- message(STATUS "Build ${TARGET_TRIPLET}-rel done")
-
- message(STATUS "Build ${TARGET_TRIPLET}-dbg")
- vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} --build . --config Debug -- ${BUILD_ARGS}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
- LOGNAME build-${TARGET_TRIPLET}-dbg
- )
- message(STATUS "Build ${TARGET_TRIPLET}-dbg done")
+ foreach(BUILDTYPE "debug" "release")
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL BUILDTYPE)
+ if(BUILDTYPE STREQUAL "debug")
+ set(SHORT_BUILDTYPE "dbg")
+ set(CONFIG "Debug")
+ else()
+ set(SHORT_BUILDTYPE "rel")
+ set(CONFIG "Release")
+ endif()
+
+ message(STATUS "Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE}")
+ set(LOGPREFIX "${CURRENT_BUILDTREES_DIR}/${_bc_LOGFILE_ROOT}-${TARGET_TRIPLET}-${SHORT_BUILDTYPE}")
+ set(LOGS)
+
+ if(_bc_ADD_BIN_TO_PATH)
+ set(_BACKUP_ENV_PATH "$ENV{PATH}")
+ if(BUILDTYPE STREQUAL "debug")
+ set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/bin;$ENV{PATH}")
+ else()
+ set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin;$ENV{PATH}")
+ endif()
+ endif()
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS} ${PARALLEL_ARG}
+ OUTPUT_FILE "${LOGPREFIX}-out.log"
+ ERROR_FILE "${LOGPREFIX}-err.log"
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_BUILDTYPE})
+ if(error_code)
+ file(READ "${LOGPREFIX}-out.log" out_contents)
+ file(READ "${LOGPREFIX}-err.log" err_contents)
+
+ if(out_contents)
+ list(APPEND LOGS "${LOGPREFIX}-out.log")
+ endif()
+ if(err_contents)
+ list(APPEND LOGS "${LOGPREFIX}-err.log")
+ endif()
+
+ if(out_contents MATCHES "LINK : fatal error LNK1102:" OR out_contents MATCHES " fatal error C1060: ")
+ # The linker ran out of memory during execution. We will try continuing once more, with parallelism disabled.
+ message(STATUS "Restarting Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} without parallelism because memory exceeded")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS} ${NO_PARALLEL_ARG}
+ OUTPUT_FILE "${LOGPREFIX}-out-1.log"
+ ERROR_FILE "${LOGPREFIX}-err-1.log"
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_BUILDTYPE})
+
+ if(error_code)
+ file(READ "${LOGPREFIX}-out-1.log" out_contents)
+ file(READ "${LOGPREFIX}-err-1.log" err_contents)
+
+ if(out_contents)
+ list(APPEND LOGS "${LOGPREFIX}-out-1.log")
+ endif()
+ if(err_contents)
+ list(APPEND LOGS "${LOGPREFIX}-err-1.log")
+ endif()
+ endif()
+ elseif(out_contents MATCHES ": No such file or directory")
+ # WSL workaround - WSL occassionally fails with no such file or directory. Detect if we are running in WSL and restart.
+ execute_process(COMMAND "uname" "-r"
+ OUTPUT_VARIABLE UNAME_R ERROR_VARIABLE UNAME_R
+ OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE)
+
+ if (UNAME_R MATCHES "Microsoft")
+ set(ITERATION 0)
+ while (ITERATION LESS 10 AND out_contents MATCHES ": No such file or directory")
+ MATH(EXPR ITERATION "${ITERATION}+1")
+ message(STATUS "Restarting Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} because of wsl subsystem issue. Iteration: ${ITERATION}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS}
+ OUTPUT_FILE "${LOGPREFIX}-out-${ITERATION}.log"
+ ERROR_FILE "${LOGPREFIX}-err-${ITERATION}.log"
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_BUILDTYPE})
+
+ if(error_code)
+ file(READ "${LOGPREFIX}-out-${ITERATION}.log" out_contents)
+ file(READ "${LOGPREFIX}-err-${ITERATION}.log" err_contents)
+
+ if(out_contents)
+ list(APPEND LOGS "${LOGPREFIX}-out-${ITERATION}.log")
+ endif()
+ if(err_contents)
+ list(APPEND LOGS "${LOGPREFIX}-err-${ITERATION}.log")
+ endif()
+ else()
+ break()
+ endif()
+ endwhile()
+ endif()
+ endif()
+
+ if(error_code)
+ set(STRINGIFIED_LOGS)
+ foreach(LOG ${LOGS})
+ file(TO_NATIVE_PATH "${LOG}" NATIVE_LOG)
+ list(APPEND STRINGIFIED_LOGS " ${NATIVE_LOG}\n")
+ endforeach()
+ set(_eb_COMMAND ${CMAKE_COMMAND} --build . --config ${CONFIG} ${TARGET_PARAM} -- ${BUILD_ARGS} ${NO_PARALLEL_ARG})
+ set(_eb_WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_BUILDTYPE})
+ message(FATAL_ERROR
+ " Command failed: ${_eb_COMMAND}\n"
+ " Working Directory: ${_eb_WORKING_DIRECTORY}\n"
+ " See logs for more information:\n"
+ ${STRINGIFIED_LOGS})
+ endif()
+ endif()
+ message(STATUS "Build ${TARGET_TRIPLET}-${SHORT_BUILDTYPE} done")
+ if(_bc_ADD_BIN_TO_PATH)
+ set(ENV{PATH} "${_BACKUP_ENV_PATH}")
+ endif()
+ endif()
+ endforeach()
endfunction()
diff --git a/scripts/cmake/vcpkg_build_msbuild.cmake b/scripts/cmake/vcpkg_build_msbuild.cmake
index 6fe3f5aa0..db04530ef 100644
--- a/scripts/cmake/vcpkg_build_msbuild.cmake
+++ b/scripts/cmake/vcpkg_build_msbuild.cmake
@@ -1,49 +1,73 @@
-#.rst:
-# .. command:: vcpkg_build_msbuild
-#
-# Build a msbuild-based project.
-#
-# ::
-# vcpkg_build_msbuild(PROJECT_PATH <sln_project_path>
-# [RELEASE_CONFIGURATION <release_configuration>] # (default = "Release")
-# [DEBUG_CONFIGURATION <debug_configuration>] @ (default = "Debug")
-# [TARGET_PLATFORM_VERSION <windows_target_platform_version>]
-# [PLATFORM <platform>] # (default = "${TRIPLET_SYSTEM_ARCH}")
-# [PLATFORM_TOOLSET <platform_toolset>] # (default = "${VCPKG_PLATFORM_TOOLSET}")
-# [OPTIONS arg1 [arg2 ...]]
-# [OPTIONS_RELEASE arg1 [arg2 ...]]
-# [OPTIONS_DEBUG arg1 [arg2 ...]]
-# )
-#
-# ``PROJECT_PATH``
-# The path to the *.sln msbuild project file.
-# ``RELEASE_CONFIGURATION``
-# The configuration (``/p:Configuration`` msbuild parameter)
-# used for Release builds.
-# ``DEBUG_CONFIGURATION``
-# The configuration (``/p:Configuration`` msbuild parameter)
-# used for Debug builds.
-# ``TARGET_PLATFORM_VERSION``
-# The WindowsTargetPlatformVersion (``/p:WindowsTargetPlatformVersion`` msbuild parameter)
-# ``TARGET``
-# The MSBuild target to build. (``/t:<TARGET>``)
-# ``PLATFORM``
-# The platform (``/p:Platform`` msbuild parameter)
-# used for the build.
-# ``PLATFORM_TOOLSET``
-# The platform toolset (``/p:PlatformToolset`` msbuild parameter)
-# used for the build.
-# ``OPTIONS``
-# The options passed to msbuild for all builds.
-# ``OPTIONS_RELEASE``
-# The options passed to msbuild for Release builds.
-# ``OPTIONS_DEBUG``
-# The options passed to msbuild for Debug builds.
-#
-
+## # vcpkg_build_msbuild
+##
+## Build an msbuild-based project.
+##
+## ## Usage
+## ```cmake
+## vcpkg_build_msbuild(
+## PROJECT_PATH <${SOURCE_PATH}/port.sln>
+## [RELEASE_CONFIGURATION <Release>]
+## [DEBUG_CONFIGURATION <Debug>]
+## [TARGET <Build>]
+## [TARGET_PLATFORM_VERSION <10.0.15063.0>]
+## [PLATFORM <${TRIPLET_SYSTEM_ARCH}>]
+## [PLATFORM_TOOLSET <${VCPKG_PLATFORM_TOOLSET}>]
+## [OPTIONS </p:ZLIB_INCLUDE_PATH=X>...]
+## [OPTIONS_RELEASE </p:ZLIB_LIB=X>...]
+## [OPTIONS_DEBUG </p:ZLIB_LIB=X>...]
+## )
+## ```
+##
+## ## Parameters
+## ### USE_VCPKG_INTEGRATION
+## Apply the normal `integrate install` integration for building the project.
+##
+## By default, projects built with this command will not automatically link libraries or have header paths set.
+##
+## ### PROJECT_PATH
+## The path to the solution (`.sln`) or project (`.vcxproj`) file.
+##
+## ### RELEASE_CONFIGURATION
+## The configuration (``/p:Configuration`` msbuild parameter) used for Release builds.
+##
+## ### DEBUG_CONFIGURATION
+## The configuration (``/p:Configuration`` msbuild parameter)
+## used for Debug builds.
+##
+## ### TARGET_PLATFORM_VERSION
+## The WindowsTargetPlatformVersion (``/p:WindowsTargetPlatformVersion`` msbuild parameter)
+##
+## ### TARGET
+## The MSBuild target to build. (``/t:<TARGET>``)
+##
+## ### PLATFORM
+## The platform (``/p:Platform`` msbuild parameter) used for the build.
+##
+## ### PLATFORM_TOOLSET
+## The platform toolset (``/p:PlatformToolset`` msbuild parameter) used for the build.
+##
+## ### OPTIONS
+## Additional options passed to msbuild for all builds.
+##
+## ### OPTIONS_RELEASE
+## Additional options passed to msbuild for Release builds. These are in addition to `OPTIONS`.
+##
+## ### OPTIONS_DEBUG
+## Additional options passed to msbuild for Debug builds. These are in addition to `OPTIONS`.
+##
+## ## Examples
+##
+## * [chakracore](https://github.com/Microsoft/vcpkg/blob/master/ports/chakracore/portfile.cmake)
+## * [cppunit](https://github.com/Microsoft/vcpkg/blob/master/ports/cppunit/portfile.cmake)
function(vcpkg_build_msbuild)
- cmake_parse_arguments(_csc "" "PROJECT_PATH;RELEASE_CONFIGURATION;DEBUG_CONFIGURATION;PLATFORM;PLATFORM_TOOLSET;TARGET_PLATFORM_VERSION;TARGET" "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG" ${ARGN})
+ cmake_parse_arguments(
+ _csc
+ "USE_VCPKG_INTEGRATION"
+ "PROJECT_PATH;RELEASE_CONFIGURATION;DEBUG_CONFIGURATION;PLATFORM;PLATFORM_TOOLSET;TARGET_PLATFORM_VERSION;TARGET"
+ "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG"
+ ${ARGN}
+ )
if(NOT DEFINED _csc_RELEASE_CONFIGURATION)
set(_csc_RELEASE_CONFIGURATION Release)
@@ -74,25 +98,39 @@ function(vcpkg_build_msbuild)
/m
)
- message(STATUS "Building ${_csc_PROJECT_PATH} for Release")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
- vcpkg_execute_required_process(
- COMMAND msbuild ${_csc_PROJECT_PATH}
- /p:Configuration=${_csc_RELEASE_CONFIGURATION}
- ${_csc_OPTIONS}
- ${_csc_OPTIONS_RELEASE}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
- LOGNAME build-${TARGET_TRIPLET}-rel
- )
+ if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
+ # Disable LTCG for static libraries because this setting introduces ABI incompatibility between minor compiler versions
+ # TODO: Add a way for the user to override this if they want to opt-in to incompatibility
+ list(APPEND _csc_OPTIONS /p:WholeProgramOptimization=false)
+ endif()
- message(STATUS "Building ${_csc_PROJECT_PATH} for Debug")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
- vcpkg_execute_required_process(
- COMMAND msbuild ${_csc_PROJECT_PATH}
- /p:Configuration=${_csc_DEBUG_CONFIGURATION}
- ${_csc_OPTIONS}
- ${_csc_OPTIONS_DEBUG}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
- LOGNAME build-${TARGET_TRIPLET}-dbg
- )
+ if(_csc_USE_VCPKG_INTEGRATION)
+ list(APPEND _csc_OPTIONS /p:ForceImportBeforeCppTargets=${VCPKG_ROOT_DIR}/scripts/buildsystems/msbuild/vcpkg.targets)
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ message(STATUS "Building ${_csc_PROJECT_PATH} for Release")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
+ vcpkg_execute_required_process(
+ COMMAND msbuild ${_csc_PROJECT_PATH}
+ /p:Configuration=${_csc_RELEASE_CONFIGURATION}
+ ${_csc_OPTIONS}
+ ${_csc_OPTIONS_RELEASE}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
+ LOGNAME build-${TARGET_TRIPLET}-rel
+ )
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ message(STATUS "Building ${_csc_PROJECT_PATH} for Debug")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
+ vcpkg_execute_required_process(
+ COMMAND msbuild ${_csc_PROJECT_PATH}
+ /p:Configuration=${_csc_DEBUG_CONFIGURATION}
+ ${_csc_OPTIONS}
+ ${_csc_OPTIONS_DEBUG}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
+ LOGNAME build-${TARGET_TRIPLET}-dbg
+ )
+ endif()
endfunction()
diff --git a/scripts/cmake/vcpkg_build_qmake.cmake b/scripts/cmake/vcpkg_build_qmake.cmake
index 1c6358654..194ab8206 100644
--- a/scripts/cmake/vcpkg_build_qmake.cmake
+++ b/scripts/cmake/vcpkg_build_qmake.cmake
@@ -1,32 +1,81 @@
#.rst:
# .. command:: vcpkg_build_qmake
#
-# Build a qmake-based project, previously configured using vcpkg_configure_qmake .
-# As the CONFIG qmake option is assumed to be "debug_and_release" (the default value on Windows, see [1]),
-# both the debug and release libraries are build in the same build tree.
+# Build a qmake-based project, previously configured using vcpkg_configure_qmake.
#
# ::
# vcpkg_build_qmake()
#
-#
-# [1] : http://doc.qt.io/qt-5/qmake-variable-reference.html
function(vcpkg_build_qmake)
+ cmake_parse_arguments(_csc "SKIP_MAKEFILES" "BUILD_LOGNAME" "TARGETS;RELEASE_TARGETS;DEBUG_TARGETS" ${ARGN})
vcpkg_find_acquire_program(JOM)
# Make sure that the linker finds the libraries used
- set(ENV_LIB_BACKUP ENV{LIB})
- set(ENV{LIB} "${CURRENT_INSTALLED_DIR}/lib;${CURRENT_INSTALLED_DIR}/debug/lib;$ENV{LIB}")
+ set(ENV_PATH_BACKUP "$ENV{PATH}")
- message(STATUS "Package ${TARGET_TRIPLET}")
- vcpkg_execute_required_process_repeat(
- COUNT 2
- COMMAND ${JOM}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}
- LOGNAME package-${TARGET_TRIPLET}
- )
- message(STATUS "Package ${TARGET_TRIPLET} done")
+ set(DEBUG_DIR ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
+ set(RELEASE_DIR ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
+
+ file(TO_NATIVE_PATH "${CURRENT_INSTALLED_DIR}" NATIVE_INSTALLED_DIR)
+
+ list(APPEND _csc_RELEASE_TARGETS ${_csc_TARGETS})
+ list(APPEND _csc_DEBUG_TARGETS ${_csc_TARGETS})
+
+ if(NOT _csc_BUILD_LOGNAME)
+ set(_csc_BUILD_LOGNAME build)
+ endif()
+
+ function(run_jom TARGETS LOG_PREFIX LOG_SUFFIX)
+ message(STATUS "Package ${LOG_PREFIX}-${TARGET_TRIPLET}-${LOG_SUFFIX}")
+ vcpkg_execute_required_process(
+ COMMAND ${JOM} ${TARGETS}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${LOG_SUFFIX}
+ LOGNAME package-${LOG_PREFIX}-${TARGET_TRIPLET}-${LOG_SUFFIX}
+ )
+ message(STATUS "Package ${LOG_PREFIX}-${TARGET_TRIPLET}-${LOG_SUFFIX} done")
+ endfunction()
+
+ # This fixes issues on machines with default codepages that are not ASCII compatible, such as some CJK encodings
+ set(ENV_CL_BACKUP "$ENV{_CL_}")
+ set(ENV{_CL_} "/utf-8")
+
+ #First generate the makefiles so we can modify them
+ set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/debug/lib;${CURRENT_INSTALLED_DIR}/debug/bin;${CURRENT_INSTALLED_DIR}/tools/qt5;${ENV_PATH_BACKUP}")
+ if(NOT _csc_SKIP_MAKEFILES)
+ run_jom(qmake_all makefiles dbg)
+
+ #Store debug makefiles path
+ file(GLOB_RECURSE DEBUG_MAKEFILES ${DEBUG_DIR}/*Makefile*)
+
+ foreach(DEBUG_MAKEFILE ${DEBUG_MAKEFILES})
+ file(READ "${DEBUG_MAKEFILE}" _contents)
+ string(REPLACE "zlib.lib" "zlibd.lib" _contents "${_contents}")
+ string(REPLACE "installed\\${TARGET_TRIPLET}\\lib" "installed\\${TARGET_TRIPLET}\\debug\\lib" _contents "${_contents}")
+ string(REPLACE "/LIBPATH:${NATIVE_INSTALLED_DIR}\\debug\\lib qtmaind.lib" "shell32.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\debug\\lib\\manual-link qtmaind.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\debug\\lib" _contents "${_contents}")
+ file(WRITE "${DEBUG_MAKEFILE}" "${_contents}")
+ endforeach()
+ endif()
+
+ run_jom("${_csc_DEBUG_TARGETS}" ${_csc_BUILD_LOGNAME} dbg)
+
+ set(ENV{PATH} "${CURRENT_INSTALLED_DIR}/lib;${CURRENT_INSTALLED_DIR}/bin;${CURRENT_INSTALLED_DIR}/tools/qt5;${ENV_PATH_BACKUP}")
+ if(NOT _csc_SKIP_MAKEFILES)
+ run_jom(qmake_all makefiles rel)
+
+ #Store release makefile path
+ file(GLOB_RECURSE RELEASE_MAKEFILES ${RELEASE_DIR}/*Makefile*)
+
+ foreach(RELEASE_MAKEFILE ${RELEASE_MAKEFILES})
+ file(READ "${RELEASE_MAKEFILE}" _contents)
+ string(REPLACE "/LIBPATH:${NATIVE_INSTALLED_DIR}\\lib qtmain.lib" "shell32.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\lib\\manual-link qtmain.lib /LIBPATH:${NATIVE_INSTALLED_DIR}\\lib" _contents "${_contents}")
+ file(WRITE "${RELEASE_MAKEFILE}" "${_contents}")
+ endforeach()
+ endif()
+
+ run_jom("${_csc_RELEASE_TARGETS}" ${_csc_BUILD_LOGNAME} rel)
- # Restore the original value of ENV{LIB}
- set(ENV{LIB} ENV_LIB_BACKUP)
+ # Restore the original value of ENV{PATH}
+ set(ENV{PATH} "${ENV_PATH_BACKUP}")
+ set(ENV{_CL_} "${ENV_CL_BACKUP}")
endfunction()
diff --git a/scripts/cmake/vcpkg_common_functions.cmake b/scripts/cmake/vcpkg_common_functions.cmake
index a0e9633c3..27dd0732d 100644
--- a/scripts/cmake/vcpkg_common_functions.cmake
+++ b/scripts/cmake/vcpkg_common_functions.cmake
@@ -6,6 +6,7 @@ include(vcpkg_execute_required_process_repeat)
include(vcpkg_find_acquire_program)
include(vcpkg_fixup_cmake_targets)
include(vcpkg_from_github)
+include(vcpkg_from_bitbucket)
include(vcpkg_build_cmake)
include(vcpkg_build_msbuild)
include(vcpkg_build_qmake)
@@ -19,4 +20,5 @@ include(vcpkg_copy_pdbs)
include(vcpkg_copy_tool_dependencies)
include(vcpkg_get_program_files_32_bit)
include(vcpkg_get_program_files_platform_bitness)
-include(vcpkg_get_windows_sdk) \ No newline at end of file
+include(vcpkg_get_windows_sdk)
+include(vcpkg_replace_string) \ No newline at end of file
diff --git a/scripts/cmake/vcpkg_configure_cmake.cmake b/scripts/cmake/vcpkg_configure_cmake.cmake
index cd979be1b..3e0922428 100644
--- a/scripts/cmake/vcpkg_configure_cmake.cmake
+++ b/scripts/cmake/vcpkg_configure_cmake.cmake
@@ -1,5 +1,56 @@
+## # vcpkg_configure_cmake
+##
+## Configure CMake for Debug and Release builds of a project.
+##
+## ## Usage
+## ```cmake
+## vcpkg_configure_cmake(
+## SOURCE_PATH <${SOURCE_PATH}>
+## [PREFER_NINJA]
+## [GENERATOR <"NMake Makefiles">]
+## [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...]
+## [OPTIONS_RELEASE <-DOPTIMIZE=1>...]
+## [OPTIONS_DEBUG <-DDEBUGGABLE=1>...]
+## )
+## ```
+##
+## ## Parameters
+## ### SOURCE_PATH
+## Specifies the directory containing the `CMakeLists.txt`. By convention, this is usually set in the portfile as the variable `SOURCE_PATH`.
+##
+## ### PREFER_NINJA
+## Indicates that, when available, Vcpkg should use Ninja to perform the build. This should be specified unless the port is known to not work under Ninja.
+##
+## ### DISABLE_PARALLEL_CONFIGURE
+## Disables running the CMake configure step in parallel.
+##
+## This is needed for libraries which write back into their source directory during configure.
+##
+## ### GENERATOR
+## Specifies the precise generator to use.
+##
+## This is useful if some project-specific buildsystem has been wrapped in a cmake script that won't perform an actual build. If used for this purpose, it should be set to "NMake Makefiles".
+##
+## ### OPTIONS
+## Additional options passed to CMake during the configuration.
+##
+## ### OPTIONS_RELEASE
+## Additional options passed to CMake during the Release configuration. These are in addition to `OPTIONS`.
+##
+## ### OPTIONS_DEBUG
+## Additional options passed to CMake during the Debug configuration. These are in addition to `OPTIONS`.
+##
+## ## Notes
+## This command supplies many common arguments to CMake. To see the full list, examine the source.
+##
+## ## Examples
+##
+## * [zlib](https://github.com/Microsoft/vcpkg/blob/master/ports/zlib/portfile.cmake)
+## * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake)
+## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake)
+## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake)
function(vcpkg_configure_cmake)
- cmake_parse_arguments(_csc "PREFER_NINJA" "SOURCE_PATH;GENERATOR" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" ${ARGN})
+ cmake_parse_arguments(_csc "PREFER_NINJA;DISABLE_PARALLEL_CONFIGURE" "SOURCE_PATH;GENERATOR" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" ${ARGN})
if(NOT VCPKG_PLATFORM_TOOLSET)
message(FATAL_ERROR "Vcpkg has been updated with VS2017 support, however you need to rebuild vcpkg.exe by re-running bootstrap-vcpkg.bat\n")
@@ -11,63 +62,110 @@ function(vcpkg_configure_cmake)
set(_csc_HOST_ARCHITECTURE $ENV{PROCESSOR_ARCHITECTURE})
endif()
+ set(NINJA_CAN_BE_USED ON) # Ninja as generator
+ set(NINJA_HOST ON) # Ninja as parallel configurator
+ if(_csc_HOST_ARCHITECTURE STREQUAL "x86")
+ # Prebuilt ninja binaries are only provided for x64 hosts
+ set(NINJA_CAN_BE_USED OFF)
+ set(NINJA_HOST OFF)
+ elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
+ # Ninja and MSBuild have many differences when targetting UWP, so use MSBuild to maximize existing compatibility
+ set(NINJA_CAN_BE_USED OFF)
+ elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64" OR VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
+ # Arm64 usage should be allowed once github issue #2375 is resolved
+ set(NINJA_CAN_BE_USED OFF)
+ endif()
+
if(_csc_GENERATOR)
set(GENERATOR ${_csc_GENERATOR})
- elseif(_csc_PREFER_NINJA AND NOT VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND NOT _csc_HOST_ARCHITECTURE STREQUAL "x86")
+ elseif(_csc_PREFER_NINJA AND NINJA_CAN_BE_USED)
set(GENERATOR "Ninja")
- elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND TRIPLET_SYSTEM_ARCH MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
- set(GENERATOR "Visual Studio 14 2015")
- elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND TRIPLET_SYSTEM_ARCH MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
- set(GENERATOR "Visual Studio 14 2015 Win64")
- elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND TRIPLET_SYSTEM_ARCH MATCHES "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
- set(GENERATOR "Visual Studio 14 2015 ARM")
- elseif(TRIPLET_SYSTEM_ARCH MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
+ elseif(VCPKG_CHAINLOAD_TOOLCHAIN_FILE OR (VCPKG_CMAKE_SYSTEM_NAME AND NOT VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore"))
+ set(GENERATOR "Ninja")
+
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v120")
+ set(GENERATOR "Visual Studio 12 2013")
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v120")
+ set(GENERATOR "Visual Studio 12 2013 Win64")
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v120")
+ set(GENERATOR "Visual Studio 12 2013 ARM")
+
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
set(GENERATOR "Visual Studio 14 2015")
- elseif(TRIPLET_SYSTEM_ARCH MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
set(GENERATOR "Visual Studio 14 2015 Win64")
- elseif(TRIPLET_SYSTEM_ARCH MATCHES "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
+ elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v140")
set(GENERATOR "Visual Studio 14 2015 ARM")
- elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND TRIPLET_SYSTEM_ARCH MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
set(GENERATOR "Visual Studio 15 2017")
- elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND TRIPLET_SYSTEM_ARCH MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
set(GENERATOR "Visual Studio 15 2017 Win64")
- elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND TRIPLET_SYSTEM_ARCH MATCHES "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
+ elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
set(GENERATOR "Visual Studio 15 2017 ARM")
- elseif(TRIPLET_SYSTEM_ARCH MATCHES "x86" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
+ elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
set(GENERATOR "Visual Studio 15 2017")
- elseif(TRIPLET_SYSTEM_ARCH MATCHES "x64" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
- set(GENERATOR "Visual Studio 15 2017 Win64")
- elseif(TRIPLET_SYSTEM_ARCH MATCHES "arm" AND VCPKG_PLATFORM_TOOLSET MATCHES "v141")
- set(GENERATOR "Visual Studio 15 2017 ARM")
+ set(ARCH "ARM64")
+ else()
+ message(FATAL_ERROR "Unable to determine appropriate generator for: ${VCPKG_CMAKE_SYSTEM_NAME}-${VCPKG_TARGET_ARCHITECTURE}-${VCPKG_PLATFORM_TOOLSET}")
endif()
-
+
# If we use Ninja, make sure it's on PATH
if(GENERATOR STREQUAL "Ninja")
vcpkg_find_acquire_program(NINJA)
get_filename_component(NINJA_PATH ${NINJA} DIRECTORY)
set(ENV{PATH} "$ENV{PATH};${NINJA_PATH}")
+ list(APPEND _csc_OPTIONS "-DCMAKE_MAKE_PROGRAM=${NINJA}")
endif()
file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
if(DEFINED VCPKG_CMAKE_SYSTEM_NAME)
- list(APPEND _csc_OPTIONS -DCMAKE_SYSTEM_NAME=${VCPKG_CMAKE_SYSTEM_NAME})
+ list(APPEND _csc_OPTIONS "-DCMAKE_SYSTEM_NAME=${VCPKG_CMAKE_SYSTEM_NAME}")
endif()
if(DEFINED VCPKG_CMAKE_SYSTEM_VERSION)
- list(APPEND _csc_OPTIONS -DCMAKE_SYSTEM_VERSION=${VCPKG_CMAKE_SYSTEM_VERSION})
+ list(APPEND _csc_OPTIONS "-DCMAKE_SYSTEM_VERSION=${VCPKG_CMAKE_SYSTEM_VERSION}")
endif()
- if(DEFINED VCPKG_LIBRARY_LINKAGE AND VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
+
+ if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
list(APPEND _csc_OPTIONS -DBUILD_SHARED_LIBS=ON)
- elseif(DEFINED VCPKG_LIBRARY_LINKAGE AND VCPKG_LIBRARY_LINKAGE STREQUAL static)
+ elseif(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
list(APPEND _csc_OPTIONS -DBUILD_SHARED_LIBS=OFF)
+ else()
+ message(FATAL_ERROR "Invalid setting for VCPKG_LIBRARY_LINKAGE: \"${VCPKG_LIBRARY_LINKAGE}\". It must be \"static\" or \"dynamic\"")
endif()
+ if((NOT DEFINED VCPKG_CXX_FLAGS_DEBUG AND NOT DEFINED VCPKG_C_FLAGS_DEBUG) OR
+ (DEFINED VCPKG_CXX_FLAGS_DEBUG AND DEFINED VCPKG_C_FLAGS_DEBUG))
+ else()
+ message(FATAL_ERROR "You must set both the VCPKG_CXX_FLAGS_DEBUG and VCPKG_C_FLAGS_DEBUG")
+ endif()
+ if((NOT DEFINED VCPKG_CXX_FLAGS_RELEASE AND NOT DEFINED VCPKG_C_FLAGS_RELEASE) OR
+ (DEFINED VCPKG_CXX_FLAGS_RELEASE AND DEFINED VCPKG_C_FLAGS_RELEASE))
+ else()
+ message(FATAL_ERROR "You must set both the VCPKG_CXX_FLAGS_RELEASE and VCPKG_C_FLAGS_RELEASE")
+ endif()
+ if((NOT DEFINED VCPKG_CXX_FLAGS AND NOT DEFINED VCPKG_C_FLAGS) OR
+ (DEFINED VCPKG_CXX_FLAGS AND DEFINED VCPKG_C_FLAGS))
+ else()
+ message(FATAL_ERROR "You must set both the VCPKG_CXX_FLAGS and VCPKG_C_FLAGS")
+ endif()
+
+ if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
+ list(APPEND _csc_OPTIONS "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
+ elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR NOT DEFINED VCPKG_CMAKE_SYSTEM_NAME)
+ list(APPEND _csc_OPTIONS "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_ROOT_DIR}/scripts/toolchains/windows.cmake")
+ elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ list(APPEND _csc_OPTIONS "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_ROOT_DIR}/scripts/toolchains/linux.cmake")
+ elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Android")
+ list(APPEND _csc_OPTIONS "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_ROOT_DIR}/scripts/toolchains/android.cmake")
+ elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ list(APPEND _csc_OPTIONS "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_ROOT_DIR}/scripts/toolchains/osx.cmake")
+ endif()
list(APPEND _csc_OPTIONS
"-DVCPKG_TARGET_TRIPLET=${TARGET_TRIPLET}"
- "-DCMAKE_CXX_FLAGS= /DWIN32 /D_WINDOWS /W3 /utf-8 /GR /EHsc /MP"
- "-DCMAKE_C_FLAGS= /DWIN32 /D_WINDOWS /W3 /utf-8 /MP"
+ "-DVCPKG_PLATFORM_TOOLSET=${VCPKG_PLATFORM_TOOLSET}"
"-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON"
"-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON"
"-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON"
@@ -76,52 +174,95 @@ function(vcpkg_configure_cmake)
"-DVCPKG_APPLOCAL_DEPS=OFF"
"-DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT_DIR}/scripts/buildsystems/vcpkg.cmake"
"-DCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION=ON"
+ "-DVCPKG_CXX_FLAGS=${VCPKG_CXX_FLAGS}"
+ "-DVCPKG_CXX_FLAGS_RELEASE=${VCPKG_CXX_FLAGS_RELEASE}"
+ "-DVCPKG_CXX_FLAGS_DEBUG=${VCPKG_CXX_FLAGS_DEBUG}"
+ "-DVCPKG_C_FLAGS=${VCPKG_C_FLAGS}"
+ "-DVCPKG_C_FLAGS_RELEASE=${VCPKG_C_FLAGS_RELEASE}"
+ "-DVCPKG_C_FLAGS_DEBUG=${VCPKG_C_FLAGS_DEBUG}"
+ "-DVCPKG_CRT_LINKAGE=${VCPKG_CRT_LINKAGE}"
+ "-DVCPKG_LINKER_FLAGS=${VCPKG_LINKER_FLAGS}"
+ "-DCMAKE_INSTALL_LIBDIR:STRING=lib"
+ "-DCMAKE_INSTALL_BINDIR:STRING=bin"
)
- if(DEFINED VCPKG_CRT_LINKAGE AND VCPKG_CRT_LINKAGE STREQUAL dynamic)
- list(APPEND _csc_OPTIONS_DEBUG
- "-DCMAKE_CXX_FLAGS_DEBUG=/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1"
- "-DCMAKE_C_FLAGS_DEBUG=/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1"
- )
- list(APPEND _csc_OPTIONS_RELEASE
- "-DCMAKE_CXX_FLAGS_RELEASE=/MD /O2 /Oi /Gy /DNDEBUG /Zi"
- "-DCMAKE_C_FLAGS_RELEASE=/MD /O2 /Oi /Gy /DNDEBUG /Zi"
+
+ if(DEFINED ARCH)
+ list(APPEND _csc_OPTIONS
+ "-A${ARCH}"
)
- elseif(DEFINED VCPKG_CRT_LINKAGE AND VCPKG_CRT_LINKAGE STREQUAL static)
- list(APPEND _csc_OPTIONS_DEBUG
- "-DCMAKE_CXX_FLAGS_DEBUG=/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1"
- "-DCMAKE_C_FLAGS_DEBUG=/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1"
+ endif()
+
+ set(rel_command
+ ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} "${_csc_OPTIONS}" "${_csc_OPTIONS_RELEASE}"
+ -G ${GENERATOR}
+ -DCMAKE_BUILD_TYPE=Release
+ -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR})
+ set(dbg_command
+ ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} "${_csc_OPTIONS}" "${_csc_OPTIONS_DEBUG}"
+ -G ${GENERATOR}
+ -DCMAKE_BUILD_TYPE=Debug
+ -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}/debug)
+
+ if(NINJA_HOST AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND NOT _csc_DISABLE_PARALLEL_CONFIGURE)
+
+ vcpkg_find_acquire_program(NINJA)
+ get_filename_component(NINJA_PATH ${NINJA} DIRECTORY)
+ set(ENV{PATH} "$ENV{PATH};${NINJA_PATH}")
+
+ #parallelize the configure step
+ set(_contents
+ "rule CreateProcess\n command = $process\n\n"
)
- list(APPEND _csc_OPTIONS_RELEASE
- "-DCMAKE_CXX_FLAGS_RELEASE=/MT /O2 /Oi /Gy /DNDEBUG /Zi"
- "-DCMAKE_C_FLAGS_RELEASE=/MT /O2 /Oi /Gy /DNDEBUG /Zi"
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ set(rel_line "build ../CMakeCache.txt: CreateProcess\n process = cmd /c \"cd .. &&")
+ foreach(arg ${rel_command})
+ set(rel_line "${rel_line} \"${arg}\"")
+ endforeach()
+ set(_contents "${_contents}${rel_line}\"\n\n")
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ set(dbg_line "build ../../${TARGET_TRIPLET}-dbg/CMakeCache.txt: CreateProcess\n process = cmd /c \"cd ../../${TARGET_TRIPLET}-dbg &&")
+ foreach(arg ${dbg_command})
+ set(dbg_line "${dbg_line} \"${arg}\"")
+ endforeach()
+ set(_contents "${_contents}${dbg_line}\"\n\n")
+ endif()
+
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure)
+ file(WRITE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure/build.ninja "${_contents}")
+
+ message(STATUS "Configuring ${TARGET_TRIPLET}")
+ vcpkg_execute_required_process(
+ COMMAND ninja -v
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure
+ LOGNAME config-${TARGET_TRIPLET}
)
+ message(STATUS "Configuring ${TARGET_TRIPLET} done")
+ else()
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ message(STATUS "Configuring ${TARGET_TRIPLET}-dbg")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
+ vcpkg_execute_required_process(
+ COMMAND ${dbg_command}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
+ LOGNAME config-${TARGET_TRIPLET}-dbg
+ )
+ message(STATUS "Configuring ${TARGET_TRIPLET}-dbg done")
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ message(STATUS "Configuring ${TARGET_TRIPLET}-rel")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
+ vcpkg_execute_required_process(
+ COMMAND ${rel_command}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
+ LOGNAME config-${TARGET_TRIPLET}-rel
+ )
+ message(STATUS "Configuring ${TARGET_TRIPLET}-rel done")
+ endif()
endif()
- list(APPEND _csc_OPTIONS_RELEASE
- "-DCMAKE_SHARED_LINKER_FLAGS_RELEASE=/DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF"
- "-DCMAKE_EXE_LINKER_FLAGS_RELEASE=/DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF"
- )
- message(STATUS "Configuring ${TARGET_TRIPLET}-rel")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
- vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} ${_csc_OPTIONS} ${_csc_OPTIONS_RELEASE}
- -G ${GENERATOR}
- -DCMAKE_BUILD_TYPE=Release
- -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
- LOGNAME config-${TARGET_TRIPLET}-rel
- )
- message(STATUS "Configuring ${TARGET_TRIPLET}-rel done")
-
- message(STATUS "Configuring ${TARGET_TRIPLET}-dbg")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
- vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} ${_csc_OPTIONS} ${_csc_OPTIONS_DEBUG}
- -G ${GENERATOR}
- -DCMAKE_BUILD_TYPE=Debug
- -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}/debug
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
- LOGNAME config-${TARGET_TRIPLET}-dbg
- )
- message(STATUS "Configuring ${TARGET_TRIPLET}-dbg done")
-endfunction() \ No newline at end of file
+ set(_VCPKG_CMAKE_GENERATOR "${GENERATOR}" PARENT_SCOPE)
+endfunction()
diff --git a/scripts/cmake/vcpkg_configure_meson.cmake b/scripts/cmake/vcpkg_configure_meson.cmake
index 277f91e11..9b87261d5 100644
--- a/scripts/cmake/vcpkg_configure_meson.cmake
+++ b/scripts/cmake/vcpkg_configure_meson.cmake
@@ -9,17 +9,17 @@ function(vcpkg_configure_meson)
set(MESON_COMMON_CXXFLAGS "${MESON_COMMON_CXXFLAGS} /DWIN32 /D_WINDOWS /W3 /utf-8 /GR /EHsc")
if(DEFINED VCPKG_CRT_LINKAGE AND VCPKG_CRT_LINKAGE STREQUAL dynamic)
- set(MESON_DEBUG_CFLAGS "${MESON_DEBUG_CFLAGS} /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1")
- set(MESON_DEBUG_CXXFLAGS "${MESON_DEBUG_CXXFLAGS} /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1")
+ set(MESON_DEBUG_CFLAGS "${MESON_DEBUG_CFLAGS} /D_DEBUG /MDd /Z7 /Ob0 /Od /RTC1")
+ set(MESON_DEBUG_CXXFLAGS "${MESON_DEBUG_CXXFLAGS} /D_DEBUG /MDd /Z7 /Ob0 /Od /RTC1")
- set(MESON_RELEASE_CFLAGS "${MESON_RELEASE_CFLAGS} /MD /O2 /Oi /Gy /DNDEBUG /Zi")
- set(MESON_RELEASE_CXXFLAGS "${MESON_RELEASE_CXXFLAGS} /MD /O2 /Oi /Gy /DNDEBUG /Zi")
+ set(MESON_RELEASE_CFLAGS "${MESON_RELEASE_CFLAGS} /MD /O2 /Oi /Gy /DNDEBUG /Z7")
+ set(MESON_RELEASE_CXXFLAGS "${MESON_RELEASE_CXXFLAGS} /MD /O2 /Oi /Gy /DNDEBUG /Z7")
elseif(DEFINED VCPKG_CRT_LINKAGE AND VCPKG_CRT_LINKAGE STREQUAL static)
- set(MESON_DEBUG_CFLAGS "${MESON_DEBUG_CFLAGS} /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
- set(MESON_DEBUG_CXXFLAGS "${MESON_DEBUG_CXXFLAGS} /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
+ set(MESON_DEBUG_CFLAGS "${MESON_DEBUG_CFLAGS} /D_DEBUG /MTd /Z7 /Ob0 /Od /RTC1")
+ set(MESON_DEBUG_CXXFLAGS "${MESON_DEBUG_CXXFLAGS} /D_DEBUG /MTd /Z7 /Ob0 /Od /RTC1")
- set(MESON_RELEASE_CFLAGS "${MESON_RELEASE_CFLAGS} /MT /O2 /Oi /Gy /DNDEBUG /Zi")
- set(MESON_RELEASE_CXXFLAGS "${MESON_RELEASE_CXXFLAGS} /MT /O2 /Oi /Gy /DNDEBUG /Zi")
+ set(MESON_RELEASE_CFLAGS "${MESON_RELEASE_CFLAGS} /MT /O2 /Oi /Gy /DNDEBUG /Z7")
+ set(MESON_RELEASE_CXXFLAGS "${MESON_RELEASE_CXXFLAGS} /MT /O2 /Oi /Gy /DNDEBUG /Z7")
endif()
set(MESON_COMMON_LDFLAGS "${MESON_COMMON_LDFLAGS} /DEBUG")
@@ -42,31 +42,35 @@ function(vcpkg_configure_meson)
set(ENV{PATH} "$ENV{PATH};${NINJA_PATH}")
# configure release
- message(STATUS "Configuring ${TARGET_TRIPLET}-rel")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
- set(ENV{CFLAGS} "${MESON_COMMON_CFLAGS} ${MESON_RELEASE_CFLAGS}")
- set(ENV{CXXFLAGS} "${MESON_COMMON_CXXFLAGS} ${MESON_RELEASE_CXXFLAGS}")
- set(ENV{LDFLAGS} "${MESON_COMMON_LDFLAGS} ${MESON_RELEASE_LDFLAGS}")
- set(ENV{CPPFLAGS} "${MESON_COMMON_CPPFLAGS} ${MESON_RELEASE_CPPFLAGS}")
- vcpkg_execute_required_process(
- COMMAND ${MESON} ${_vcm_OPTIONS} ${_vcm_OPTIONS_RELEASE} ${_vcm_SOURCE_PATH}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
- LOGNAME config-${TARGET_TRIPLET}-rel
- )
- message(STATUS "Configuring ${TARGET_TRIPLET}-rel done")
-
- # configure debug
- message(STATUS "Configuring ${TARGET_TRIPLET}-dbg")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
- set(ENV{CFLAGS} "${MESON_COMMON_CFLAGS} ${MESON_DEBUG_CFLAGS}")
- set(ENV{CXXFLAGS} "${MESON_COMMON_CXXFLAGS} ${MESON_DEBUG_CXXFLAGS}")
- set(ENV{LDFLAGS} "${MESON_COMMON_LDFLAGS} ${MESON_DEBUG_LDFLAGS}")
- set(ENV{CPPFLAGS} "${MESON_COMMON_CPPFLAGS} ${MESON_DEBUG_CPPFLAGS}")
- vcpkg_execute_required_process(
- COMMAND ${MESON} ${_vcm_OPTIONS} ${_vcm_OPTIONS_DEBUG} ${_vcm_SOURCE_PATH}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
- LOGNAME config-${TARGET_TRIPLET}-dbg
- )
- message(STATUS "Configuring ${TARGET_TRIPLET}-dbg done")
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
+ message(STATUS "Configuring ${TARGET_TRIPLET}-rel")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
+ set(ENV{CFLAGS} "${MESON_COMMON_CFLAGS} ${MESON_RELEASE_CFLAGS}")
+ set(ENV{CXXFLAGS} "${MESON_COMMON_CXXFLAGS} ${MESON_RELEASE_CXXFLAGS}")
+ set(ENV{LDFLAGS} "${MESON_COMMON_LDFLAGS} ${MESON_RELEASE_LDFLAGS}")
+ set(ENV{CPPFLAGS} "${MESON_COMMON_CPPFLAGS} ${MESON_RELEASE_CPPFLAGS}")
+ vcpkg_execute_required_process(
+ COMMAND ${MESON} ${_vcm_OPTIONS} ${_vcm_OPTIONS_RELEASE} ${_vcm_SOURCE_PATH}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
+ LOGNAME config-${TARGET_TRIPLET}-rel
+ )
+ message(STATUS "Configuring ${TARGET_TRIPLET}-rel done")
+ endif()
+
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ # configure debug
+ message(STATUS "Configuring ${TARGET_TRIPLET}-dbg")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
+ set(ENV{CFLAGS} "${MESON_COMMON_CFLAGS} ${MESON_DEBUG_CFLAGS}")
+ set(ENV{CXXFLAGS} "${MESON_COMMON_CXXFLAGS} ${MESON_DEBUG_CXXFLAGS}")
+ set(ENV{LDFLAGS} "${MESON_COMMON_LDFLAGS} ${MESON_DEBUG_LDFLAGS}")
+ set(ENV{CPPFLAGS} "${MESON_COMMON_CPPFLAGS} ${MESON_DEBUG_CPPFLAGS}")
+ vcpkg_execute_required_process(
+ COMMAND ${MESON} ${_vcm_OPTIONS} ${_vcm_OPTIONS_DEBUG} ${_vcm_SOURCE_PATH}
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
+ LOGNAME config-${TARGET_TRIPLET}-dbg
+ )
+ message(STATUS "Configuring ${TARGET_TRIPLET}-dbg done")
+ endif()
endfunction()
diff --git a/scripts/cmake/vcpkg_configure_qmake.cmake b/scripts/cmake/vcpkg_configure_qmake.cmake
index 037197e48..3aa30e70d 100644
--- a/scripts/cmake/vcpkg_configure_qmake.cmake
+++ b/scripts/cmake/vcpkg_configure_qmake.cmake
@@ -1,12 +1,7 @@
#.rst:
# .. command:: vcpkg_configure_qmake
#
-# Configure a qmake-based project.
-# It is assume that the qmake project CONFIG variable is
-# "debug_and_release" (the default value on Windows, see [1]).
-# Using this option, only one Makefile for building both Release and Debug
-# libraries is generated, that then can be run using the vcpkg_build_qmake
-# command.
+# Configure a qmake-based project.
#
# ::
# vcpkg_configure_qmake(SOURCE_PATH <pro_file_path>
@@ -17,28 +12,44 @@
# The path to the *.pro qmake project file.
# ``OPTIONS``
# The options passed to qmake.
-#
-# [1] : http://doc.qt.io/qt-5/qmake-variable-reference.html
function(vcpkg_configure_qmake)
cmake_parse_arguments(_csc "" "SOURCE_PATH" "OPTIONS" ${ARGN})
-
- # Find qmake exectuable
+
+ # Find qmake executable
find_program(QMAKE_COMMAND NAMES qmake.exe PATHS ${CURRENT_INSTALLED_DIR}/tools/qt5)
-
+
if(NOT QMAKE_COMMAND)
message(FATAL_ERROR "vcpkg_configure_qmake: unable to find qmake.")
endif()
- # Cleanup build directories
- file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET})
+ if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
+ list(APPEND _csc_OPTIONS CONFIG+=staticlib)
+ endif()
+
+ # Cleanup build directories
+ file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
+
+ configure_file(${CURRENT_INSTALLED_DIR}/tools/qt5/qt_release.conf ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/qt.conf)
- message(STATUS "Configuring ${TARGET_TRIPLET}")
- file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET})
+ message(STATUS "Configuring ${TARGET_TRIPLET}-rel")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
vcpkg_execute_required_process(
- COMMAND ${QMAKE_COMMAND} ${_csc_OPTIONS} -d ${_csc_SOURCE_PATH}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}
- LOGNAME config-${TARGET_TRIPLET}
+ COMMAND ${QMAKE_COMMAND} CONFIG-=debug CONFIG+=release ${_csc_OPTIONS} ${_csc_SOURCE_PATH} -qtconf "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/qt.conf"
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
+ LOGNAME config-${TARGET_TRIPLET}-rel
)
- message(STATUS "Configuring ${TARGET_TRIPLET} done")
+ message(STATUS "Configuring ${TARGET_TRIPLET}-rel done")
+
+ configure_file(${CURRENT_INSTALLED_DIR}/tools/qt5/qt_debug.conf ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/qt.conf)
+
+ message(STATUS "Configuring ${TARGET_TRIPLET}-dbg")
+ file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
+ vcpkg_execute_required_process(
+ COMMAND ${QMAKE_COMMAND} CONFIG-=release CONFIG+=debug ${_csc_OPTIONS} ${_csc_SOURCE_PATH} -qtconf "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/qt.conf"
+ WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
+ LOGNAME config-${TARGET_TRIPLET}-dbg
+ )
+ message(STATUS "Configuring ${TARGET_TRIPLET}-dbg done")
+
endfunction() \ No newline at end of file
diff --git a/scripts/cmake/vcpkg_copy_pdbs.cmake b/scripts/cmake/vcpkg_copy_pdbs.cmake
index 61ad97728..ca55eb015 100644
--- a/scripts/cmake/vcpkg_copy_pdbs.cmake
+++ b/scripts/cmake/vcpkg_copy_pdbs.cmake
@@ -1,3 +1,19 @@
+## # vcpkg_copy_pdbs
+##
+## Automatically locate pdbs in the build tree and copy them adjacent to all DLLs.
+##
+## ## Usage
+## ```cmake
+## vcpkg_copy_pdbs()
+## ```
+##
+## ## Notes
+## This command should always be called by portfiles after they have finished rearranging the binary output.
+##
+## ## Examples
+##
+## * [zlib](https://github.com/Microsoft/vcpkg/blob/master/ports/zlib/portfile.cmake)
+## * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake)
function(vcpkg_copy_pdbs)
function(merge_filelist OUTVAR INVAR)
diff --git a/scripts/cmake/vcpkg_copy_tool_dependencies.cmake b/scripts/cmake/vcpkg_copy_tool_dependencies.cmake
index f8af19230..165f19ed1 100644
--- a/scripts/cmake/vcpkg_copy_tool_dependencies.cmake
+++ b/scripts/cmake/vcpkg_copy_tool_dependencies.cmake
@@ -1,5 +1,21 @@
-# Copy dlls for all tools in TOOL_DIR
-
+## # vcpkg_copy_tool_dependencies
+##
+## Copy all DLL dependencies of built tools into the tool folder.
+##
+## ## Usage
+## ```cmake
+## vcpkg_copy_tool_dependencies(<${CURRENT_PACKAGES_DIR}/tools/${PORT}>)
+## ```
+## ## Parameters
+## The path to the directory containing the tools.
+##
+## ## Notes
+## This command should always be called by portfiles after they have finished rearranging the binary output, if they have any tools.
+##
+## ## Examples
+##
+## * [glib](https://github.com/Microsoft/vcpkg/blob/master/ports/glib/portfile.cmake)
+## * [fltk](https://github.com/Microsoft/vcpkg/blob/master/ports/fltk/portfile.cmake)
function(vcpkg_copy_tool_dependencies TOOL_DIR)
macro(search_for_dependencies PATH_TO_SEARCH)
file(GLOB TOOLS ${TOOL_DIR}/*.exe ${TOOL_DIR}/*.dll)
diff --git a/scripts/cmake/vcpkg_download_distfile.cmake b/scripts/cmake/vcpkg_download_distfile.cmake
index d086f9d23..9fc0a0c9a 100644
--- a/scripts/cmake/vcpkg_download_distfile.cmake
+++ b/scripts/cmake/vcpkg_download_distfile.cmake
@@ -1,17 +1,92 @@
-# Usage: vcpkg_download_distfile(<VAR> URLS <http://mainUrl> <http://mirror1> <http://mirror2> FILENAME <output.zip> SHA512 <5981de...>)
+## # vcpkg_download_distfile
+##
+## Download and cache a file needed for this port.
+##
+## This helper should always be used instead of CMake's built-in `file(DOWNLOAD)` command.
+##
+## ## Usage
+## ```cmake
+## vcpkg_download_distfile(
+## <OUT_VARIABLE>
+## URLS <http://mainUrl> <http://mirror1>...
+## FILENAME <output.zip>
+## SHA512 <5981de...>
+## )
+## ```
+## ## Parameters
+## ### OUT_VARIABLE
+## This variable will be set to the full path to the downloaded file. This can then immediately be passed in to [`vcpkg_extract_source_archive`](vcpkg_extract_source_archive.md) for sources.
+##
+## ### URLS
+## A list of URLs to be consulted. They will be tried in order until one of the downloaded files successfully matches the SHA512 given.
+##
+## ### FILENAME
+## The local name for the file. Files are shared between ports, so the file may need to be renamed to make it clearly attributed to this port and avoid conflicts.
+##
+## ### SHA512
+## The expected hash for the file.
+##
+## If this doesn't match the downloaded version, the build will be terminated with a message describing the mismatch.
+##
+## ### SKIP_SHA512
+## Skip SHA512 hash check for file.
+##
+## This switch is only valid when building with the `--head` command line flag.
+##
+## ## Notes
+## The helper [`vcpkg_from_github`](vcpkg_from_github.md) should be used for downloading from GitHub projects.
+##
+## ## Examples
+##
+## * [apr](https://github.com/Microsoft/vcpkg/blob/master/ports/apr/portfile.cmake)
+## * [fontconfig](https://github.com/Microsoft/vcpkg/blob/master/ports/fontconfig/portfile.cmake)
+## * [openssl](https://github.com/Microsoft/vcpkg/blob/master/ports/openssl/portfile.cmake)
function(vcpkg_download_distfile VAR)
+ set(options SKIP_SHA512)
set(oneValueArgs FILENAME SHA512)
set(multipleValuesArgs URLS)
- cmake_parse_arguments(vcpkg_download_distfile "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN})
+ cmake_parse_arguments(vcpkg_download_distfile "${options}" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN})
+
+ if(NOT DEFINED vcpkg_download_distfile_URLS)
+ message(FATAL_ERROR "vcpkg_download_distfile requires a URLS argument.")
+ endif()
+ if(NOT DEFINED vcpkg_download_distfile_FILENAME)
+ message(FATAL_ERROR "vcpkg_download_distfile requires a FILENAME argument.")
+ endif()
+ if(NOT _VCPKG_INTERNAL_NO_HASH_CHECK)
+ if(vcpkg_download_distfile_SKIP_SHA512 AND NOT VCPKG_USE_HEAD_VERSION)
+ message(FATAL_ERROR "vcpkg_download_distfile only allows SKIP_SHA512 when building with --head")
+ endif()
+ if(NOT vcpkg_download_distfile_SKIP_SHA512 AND NOT DEFINED vcpkg_download_distfile_SHA512)
+ message(FATAL_ERROR "vcpkg_download_distfile requires a SHA512 argument. If you do not know the SHA512, add it as 'SHA512 0' and re-run this command.")
+ endif()
+ if(vcpkg_download_distfile_SKIP_SHA512 AND DEFINED vcpkg_download_distfile_SHA512)
+ message(FATAL_ERROR "vcpkg_download_distfile must not be passed both SHA512 and SKIP_SHA512.")
+ endif()
+ endif()
+
set(downloaded_file_path ${DOWNLOADS}/${vcpkg_download_distfile_FILENAME})
+ set(download_file_path_part "${DOWNLOADS}/temp/${vcpkg_download_distfile_FILENAME}")
+
+ file(REMOVE_RECURSE "${DOWNLOADS}/temp")
+ file(MAKE_DIRECTORY "${DOWNLOADS}/temp")
+
+ function(test_hash FILE_PATH FILE_KIND CUSTOM_ERROR_ADVICE)
+ if(_VCPKG_INTERNAL_NO_HASH_CHECK)
+ # When using the internal hash skip, do not output an explicit message.
+ return()
+ endif()
+ if(vcpkg_download_distfile_SKIP_SHA512)
+ message(STATUS "Skipping hash check for ${FILE_PATH}.")
+ return()
+ endif()
- function(test_hash FILE_KIND CUSTOM_ERROR_ADVICE)
message(STATUS "Testing integrity of ${FILE_KIND}...")
- file(SHA512 ${downloaded_file_path} FILE_HASH)
+ file(SHA512 ${FILE_PATH} FILE_HASH)
if(NOT "${FILE_HASH}" STREQUAL "${vcpkg_download_distfile_SHA512}")
message(FATAL_ERROR
"\nFile does not have expected hash:\n"
- " File path: [ ${downloaded_file_path} ]\n"
+ " File path: [ ${FILE_PATH} ]\n"
" Expected hash: [ ${vcpkg_download_distfile_SHA512} ]\n"
" Actual hash: [ ${FILE_HASH} ]\n"
"${CUSTOM_ERROR_ADVICE}\n")
@@ -21,35 +96,73 @@ function(vcpkg_download_distfile VAR)
if(EXISTS ${downloaded_file_path})
message(STATUS "Using cached ${downloaded_file_path}")
- test_hash("cached file" "Please delete the file and retry if this file should be downloaded again.")
+ test_hash("${downloaded_file_path}" "cached file" "Please delete the file and retry if this file should be downloaded again.")
else()
if(_VCPKG_NO_DOWNLOADS)
message(FATAL_ERROR "Downloads are disabled, but '${downloaded_file_path}' does not exist.")
endif()
# Tries to download the file.
- foreach(url IN LISTS vcpkg_download_distfile_URLS)
- message(STATUS "Downloading ${url}...")
- file(DOWNLOAD ${url} ${downloaded_file_path} STATUS download_status)
- list(GET download_status 0 status_code)
- if (NOT "${status_code}" STREQUAL "0")
- message(STATUS "Downloading ${url}... Failed. Status: ${download_status}")
- file(REMOVE ${downloaded_file_path})
+ list(GET vcpkg_download_distfile_URLS 0 SAMPLE_URL)
+ if(${_VCPKG_DOWNLOAD_TOOL} MATCHES "ARIA2" AND NOT ${SAMPLE_URL} MATCHES "aria2")
+ vcpkg_find_acquire_program("ARIA2")
+ message(STATUS "Downloading ${vcpkg_download_distfile_FILENAME}...")
+ execute_process(
+ COMMAND ${ARIA2} ${vcpkg_download_distfile_URLS}
+ -o temp/${vcpkg_download_distfile_FILENAME}
+ -l download-${vcpkg_download_distfile_FILENAME}-detailed.log
+ OUTPUT_FILE download-${vcpkg_download_distfile_FILENAME}-out.log
+ ERROR_FILE download-${vcpkg_download_distfile_FILENAME}-err.log
+ RESULT_VARIABLE error_code
+ WORKING_DIRECTORY ${DOWNLOADS}
+ )
+ if (NOT "${error_code}" STREQUAL "0")
+ message(STATUS
+ "Downloading ${vcpkg_download_distfile_FILENAME}... Failed.\n"
+ " Exit Code: ${error_code}\n"
+ " See logs for more information:\n"
+ " ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-out.log\n"
+ " ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-err.log\n"
+ " ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-detailed.log\n"
+ )
set(download_success 0)
else()
- message(STATUS "Downloading ${url}... OK")
+ message(STATUS "Downloading ${vcpkg_download_distfile_FILENAME}... OK")
+ file(REMOVE
+ ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-out.log
+ ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-err.log
+ ${DOWNLOADS}/download-${vcpkg_download_distfile_FILENAME}-detailed.log
+ )
set(download_success 1)
- break()
endif()
- endforeach(url)
+ else()
+ foreach(url IN LISTS vcpkg_download_distfile_URLS)
+ message(STATUS "Downloading ${url}...")
+ file(DOWNLOAD ${url} "${download_file_path_part}" STATUS download_status)
+ list(GET download_status 0 status_code)
+ if (NOT "${status_code}" STREQUAL "0")
+ message(STATUS "Downloading ${url}... Failed. Status: ${download_status}")
+ set(download_success 0)
+ else()
+ message(STATUS "Downloading ${url}... OK")
+ set(download_success 1)
+ break()
+ endif()
+ endforeach(url)
+ endif()
- if (NOT ${download_success})
+ if (NOT download_success)
message(FATAL_ERROR
- "\n"
+ " \n"
" Failed to download file.\n"
- " Add mirrors or submit an issue at https://github.com/Microsoft/vcpkg/issues\n")
+ " If you use a proxy, please set the HTTPS_PROXY and HTTP_PROXY environment\n"
+ " variables to \"https://user:password@your-proxy-ip-address:port/\".\n"
+ " Otherwise, please submit an issue at https://github.com/Microsoft/vcpkg/issues\n")
else()
- test_hash("downloaded file" "The file may be corrupted.")
+ test_hash("${download_file_path_part}" "downloaded file" "The file may have been corrupted in transit. This can be caused by proxies. If you use a proxy, please set the HTTPS_PROXY and HTTP_PROXY environment variables to \"https://user:password@your-proxy-ip-address:port/\".\n")
+ get_filename_component(downloaded_file_dir "${downloaded_file_path}" DIRECTORY)
+ file(MAKE_DIRECTORY "${downloaded_file_dir}")
+ file(RENAME ${download_file_path_part} ${downloaded_file_path})
endif()
endif()
set(${VAR} ${downloaded_file_path} PARENT_SCOPE)
diff --git a/scripts/cmake/vcpkg_execute_required_process.cmake b/scripts/cmake/vcpkg_execute_required_process.cmake
index 7feff08b2..5b8922c14 100644
--- a/scripts/cmake/vcpkg_execute_required_process.cmake
+++ b/scripts/cmake/vcpkg_execute_required_process.cmake
@@ -1,21 +1,63 @@
-# Usage: vcpkg_execute_required_process(COMMAND <cmd> [<args>...] WORKING_DIRECTORY </path/to/dir> LOGNAME <my_log_name>)
+## # vcpkg_execute_required_process
+##
+## Execute a process with logging and fail the build if the command fails.
+##
+## ## Usage
+## ```cmake
+## vcpkg_execute_required_process(
+## COMMAND <${PERL}> [<arguments>...]
+## WORKING_DIRECTORY <${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg>
+## LOGNAME <build-${TARGET_TRIPLET}-dbg>
+## )
+## ```
+## ## Parameters
+## ### COMMAND
+## The command to be executed, along with its arguments.
+##
+## ### WORKING_DIRECTORY
+## The directory to execute the command in.
+##
+## ### LOGNAME
+## The prefix to use for the log files.
+##
+## This should be a unique name for different triplets so that the logs don't conflict when building multiple at once.
+##
+## ## Examples
+##
+## * [ffmpeg](https://github.com/Microsoft/vcpkg/blob/master/ports/ffmpeg/portfile.cmake)
+## * [openssl](https://github.com/Microsoft/vcpkg/blob/master/ports/openssl/portfile.cmake)
+## * [boost](https://github.com/Microsoft/vcpkg/blob/master/ports/boost/portfile.cmake)
+## * [qt5](https://github.com/Microsoft/vcpkg/blob/master/ports/qt5/portfile.cmake)
function(vcpkg_execute_required_process)
cmake_parse_arguments(vcpkg_execute_required_process "" "WORKING_DIRECTORY;LOGNAME" "COMMAND" ${ARGN})
- #debug_message("vcpkg_execute_required_process(${vcpkg_execute_required_process_COMMAND})")
+ set(LOG_OUT "${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-out.log")
+ set(LOG_ERR "${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-err.log")
execute_process(
COMMAND ${vcpkg_execute_required_process_COMMAND}
- OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-out.log
- ERROR_FILE ${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-err.log
+ OUTPUT_FILE ${LOG_OUT}
+ ERROR_FILE ${LOG_ERR}
RESULT_VARIABLE error_code
WORKING_DIRECTORY ${vcpkg_execute_required_process_WORKING_DIRECTORY})
- #debug_message("error_code=${error_code}")
- file(TO_NATIVE_PATH "${CURRENT_BUILDTREES_DIR}" NATIVE_BUILDTREES_DIR)
if(error_code)
+ set(LOGS)
+ file(READ "${LOG_OUT}" out_contents)
+ file(READ "${LOG_ERR}" err_contents)
+ if(out_contents)
+ list(APPEND LOGS "${LOG_OUT}")
+ endif()
+ if(err_contents)
+ list(APPEND LOGS "${LOG_ERR}")
+ endif()
+ set(STRINGIFIED_LOGS)
+ foreach(LOG ${LOGS})
+ file(TO_NATIVE_PATH "${LOG}" NATIVE_LOG)
+ list(APPEND STRINGIFIED_LOGS " ${NATIVE_LOG}\n")
+ endforeach()
message(FATAL_ERROR
" Command failed: ${vcpkg_execute_required_process_COMMAND}\n"
" Working Directory: ${vcpkg_execute_required_process_WORKING_DIRECTORY}\n"
" See logs for more information:\n"
- " ${NATIVE_BUILDTREES_DIR}\\${vcpkg_execute_required_process_LOGNAME}-out.log\n"
- " ${NATIVE_BUILDTREES_DIR}\\${vcpkg_execute_required_process_LOGNAME}-err.log\n")
+ ${STRINGIFIED_LOGS}
+ )
endif()
endfunction()
diff --git a/scripts/cmake/vcpkg_extract_source_archive.cmake b/scripts/cmake/vcpkg_extract_source_archive.cmake
index 71654b452..5c16616c6 100644
--- a/scripts/cmake/vcpkg_extract_source_archive.cmake
+++ b/scripts/cmake/vcpkg_extract_source_archive.cmake
@@ -1,3 +1,32 @@
+## # vcpkg_extract_source_archive
+##
+## Extract an archive into the source directory.
+##
+## ## Usage
+## ```cmake
+## vcpkg_extract_source_archive(
+## <${ARCHIVE}> [<${TARGET_DIRECTORY}>]
+## )
+## ```
+## ## Parameters
+## ### ARCHIVE
+## The full path to the archive to be extracted.
+##
+## This is usually obtained from calling [`vcpkg_download_distfile`](vcpkg_download_distfile.md).
+##
+## ### TARGET_DIRECTORY
+## If specified, the archive will be extracted into the target directory instead of `${CURRENT_BUILDTREES_DIR}\src\`.
+##
+## This can be used to mimic git submodules, by extracting into a subdirectory of another archive.
+##
+## ## Notes
+## This command will also create a tracking file named <FILENAME>.extracted in the TARGET_DIRECTORY. This file, when present, will suppress the extraction of the archive.
+##
+## ## Examples
+##
+## * [libraw](https://github.com/Microsoft/vcpkg/blob/master/ports/libraw/portfile.cmake)
+## * [protobuf](https://github.com/Microsoft/vcpkg/blob/master/ports/protobuf/portfile.cmake)
+## * [msgpack](https://github.com/Microsoft/vcpkg/blob/master/ports/msgpack/portfile.cmake)
include(vcpkg_execute_required_process)
function(vcpkg_extract_source_archive_ex)
diff --git a/scripts/cmake/vcpkg_find_acquire_program.cmake b/scripts/cmake/vcpkg_find_acquire_program.cmake
index 5c8a00ad2..39a722d93 100644
--- a/scripts/cmake/vcpkg_find_acquire_program.cmake
+++ b/scripts/cmake/vcpkg_find_acquire_program.cmake
@@ -1,9 +1,47 @@
+## # vcpkg_find_acquire_program
+##
+## Download or find a well-known tool.
+##
+## ## Usage
+## ```cmake
+## vcpkg_find_acquire_program(<VAR>)
+## ```
+## ## Parameters
+## ### VAR
+## This variable specifies both the program to be acquired as well as the out parameter that will be set to the path of the program executable.
+##
+## ## Notes
+## The current list of programs includes:
+##
+## - 7Z
+## - BISON
+## - FLEX
+## - GASPREPROCESSOR
+## - PERL
+## - PYTHON2
+## - PYTHON3
+## - JOM
+## - MESON
+## - NASM
+## - NINJA
+## - YASM
+## - ARIA2 (Downloader)
+##
+## Note that msys2 has a dedicated helper function: [`vcpkg_acquire_msys`](vcpkg_acquire_msys.md).
+##
+## ## Examples
+##
+## * [ffmpeg](https://github.com/Microsoft/vcpkg/blob/master/ports/ffmpeg/portfile.cmake)
+## * [openssl](https://github.com/Microsoft/vcpkg/blob/master/ports/openssl/portfile.cmake)
+## * [qt5](https://github.com/Microsoft/vcpkg/blob/master/ports/qt5/portfile.cmake)
function(vcpkg_find_acquire_program VAR)
- if(${VAR} AND NOT ${VAR} MATCHES "-NOTFOUND")
+ set(EXPANDED_VAR ${${VAR}})
+ if(EXPANDED_VAR)
return()
endif()
unset(NOEXTRACT)
+ unset(_vfa_RENAME)
unset(SUBDIR)
unset(REQUIRED_INTERPRETER)
@@ -13,49 +51,52 @@ function(vcpkg_find_acquire_program VAR)
if(VAR MATCHES "PERL")
set(PROGNAME perl)
set(PATHS ${DOWNLOADS}/tools/perl/perl/bin)
+ set(BREW_PACKAGE_NAME "perl")
+ set(APT_PACKAGE_NAME "perl")
set(URL "http://strawberryperl.com/download/5.24.1.1/strawberry-perl-5.24.1.1-32bit-portable.zip")
set(ARCHIVE "strawberry-perl-5.24.1.1-32bit-portable.zip")
set(HASH a6e685ea24376f50db5f06c5b46075f1d3be25168fa1f27fa9b02e2ac017826cee62a2b43562f9b6c989337a231ba914416c110075457764de2d11f99d5e0f26)
elseif(VAR MATCHES "NASM")
set(PROGNAME nasm)
set(PATHS ${DOWNLOADS}/tools/nasm/nasm-2.12.02)
- set(URL "http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win32/nasm-2.12.02-win32.zip")
+ set(BREW_PACKAGE_NAME "nasm")
+ set(APT_PACKAGE_NAME "nasm")
+ set(URL
+ "http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win32/nasm-2.12.02-win32.zip"
+ "http://mirrors.kodi.tv/build-deps/win32/nasm-2.12.02-win32.zip"
+ )
set(ARCHIVE "nasm-2.12.02-win32.zip")
set(HASH df7aaba094e17832688c88993997612a2e2c96cc3dc14ca3e8347b44c7762115f5a7fc6d7f20be402553aaa4c9e43ddfcf6228f581cfe89289bae550de151b36)
elseif(VAR MATCHES "YASM")
set(PROGNAME yasm)
- set(PATHS ${DOWNLOADS}/tools/yasm)
- set(URL "http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win32.exe")
- set(ARCHIVE "yasm.exe")
+ set(SUBDIR 1.3.0.6)
+ set(PATHS ${DOWNLOADS}/tools/yasm/${SUBDIR})
+ set(URL "https://www.tortall.net/projects/yasm/snapshots/v1.3.0.6.g1962/yasm-1.3.0.6.g1962.exe")
+ set(ARCHIVE "yasm-1.3.0.6.g1962.exe")
+ set(_vfa_RENAME "yasm.exe")
set(NOEXTRACT ON)
- set(HASH 850b26be5bbbdaeaf45ac39dd27f69f1a85e600c35afbd16b9f621396b3c7a19863ea3ff316b025b578fce0a8280eef2203306a2b3e46ee1389abb65313fb720)
+ set(HASH c1945669d983b632a10c5ff31e86d6ecbff143c3d8b2c433c0d3d18f84356d2b351f71ac05fd44e5403651b00c31db0d14615d7f9a6ecce5750438d37105c55b)
elseif(VAR MATCHES "PYTHON3")
set(PROGNAME python)
- set(PATHS ${DOWNLOADS}/tools/python)
- set(URL "https://www.python.org/ftp/python/3.5.3/python-3.5.3-embed-win32.zip")
- set(ARCHIVE "python-3.5.3-embed-win32.zip")
- set(HASH c8cfdc09d052dc27e4380e8e4bf0d32a4c0def7e03896c1fa6cabc26dde78bb74dbb04e3673cc36e3e307d65a1ef284d69174f0cc80008c83bc6178f192ac5cf)
+ set(SUBDIR "python3")
+ set(PATHS ${DOWNLOADS}/tools/python/${SUBDIR})
+ set(URL "https://www.python.org/ftp/python/3.5.4/python-3.5.4-embed-win32.zip")
+ set(ARCHIVE "python-3.5.4-embed-win32.zip")
+ set(HASH b5240fdc95088c2d7f65d2dd598650f8dd106b49589d94156bd4a078b108c6cabbe7a38ef73e2b2cf00e8312a93d2e587eac2c54ce85540d3c7a26cc60013156)
elseif(VAR MATCHES "PYTHON2")
- find_program(PYTHON2 NAMES python2 python PATHS C:/python27 ENV PYTHON)
- if(NOT PYTHON2 MATCHES "NOTFOUND")
- execute_process(
- COMMAND ${PYTHON2} --version
- OUTPUT_VARIABLE PYTHON_VER_CHECK_OUT
- ERROR_VARIABLE PYTHON_VER_CHECK_ERR
- )
- set(PYTHON_VER_CHECK "${PYTHON_VER_CHECK_OUT}${PYTHON_VER_CHECK_ERR}")
- debug_message("PYTHON_VER_CHECK=${PYTHON_VER_CHECK}")
- if(NOT PYTHON_VER_CHECK MATCHES "Python 2.7")
- set(PYTHON2 PYTHON2-NOTFOUND)
- find_program(PYTHON2 NAMES python2 python PATHS C:/python27 ENV PYTHON NO_SYSTEM_ENVIRONMENT_PATH)
- endif()
- endif()
- if(PYTHON2 MATCHES "NOTFOUND")
- message(FATAL_ERROR "Python 2.7 was not found in the path or by searching inside C:\\Python27.\n"
- "There is no portable redistributable for Python 2.7, so you will need to install the MSI located at:\n"
- " https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi\n"
- )
- endif()
+ set(PROGNAME python)
+ set(SUBDIR "python2")
+ set(PATHS ${DOWNLOADS}/tools/python/${SUBDIR})
+ file(TO_NATIVE_PATH "${PATHS}" DESTINATION_NATIVE_PATH)
+ set(URL "https://www.python.org/ftp/python/2.7.14/python-2.7.14.msi")
+ set(ARCHIVE "python2.msi")
+ set(HASH 8c3ad6e527742d99ba96dcfd1098861b14e7207b80d51a54e9b410ab2f36e44e05561ea1527d8e92b3e10808311536260bd9e82db0da3b513fb1be18e108510e)
+ elseif(VAR MATCHES "RUBY")
+ set(PROGNAME "ruby")
+ set(PATHS ${DOWNLOADS}/tools/ruby/rubyinstaller-2.4.1-1-x86/bin)
+ set(URL https://github.com/oneclick/rubyinstaller2/releases/download/2.4.1-1/rubyinstaller-2.4.1-1-x86.7z)
+ set(ARCHIVE rubyinstaller-2.4.1-1-x86.7z)
+ set(HASH b51112e9b58cfcbe8cec0607e8a16fff6a943d9b4e31b2a7fbf5df5f83f050bf0a4812d3dd6000ff21a3d5fd219cd0a309c58ac1c1db950a9b0072405e4b70f5)
elseif(VAR MATCHES "JOM")
set(PROGNAME jom)
set(SUBDIR "jom-1.1.2")
@@ -65,25 +106,88 @@ function(vcpkg_find_acquire_program VAR)
set(HASH 830cd94ed6518fbe4604a0f5a3322671b4674b87d25a71349c745500d38e85c0fac4f6995242fc5521eb048e3966bb5ec2a96a06b041343ed8da9bba78124f34)
elseif(VAR MATCHES "7Z")
set(PROGNAME 7z)
- set(PATHS "${PROGRAM_FILES_PLATFORM_BITNESS}/7-Zip" "${PROGRAM_FILES_32_BIT}/7-Zip" ${DOWNLOADS}/tools/7z/Files/7-Zip)
+ set(PATHS "${PROGRAM_FILES_PLATFORM_BITNESS}/7-Zip" "${PROGRAM_FILES_32_BIT}/7-Zip" "${DOWNLOADS}/tools/7z/Files/7-Zip")
set(URL "http://7-zip.org/a/7z1604.msi")
set(ARCHIVE "7z1604.msi")
set(HASH 556f95f7566fe23704d136239e4cf5e2a26f939ab43b44145c91b70d031a088d553e5c21301f1242a2295dcde3143b356211f0108c68e65eef8572407618326d)
elseif(VAR MATCHES "NINJA")
set(PROGNAME ninja)
- set(SUBDIR "ninja-1.7.2")
- set(PATHS ${DOWNLOADS}/tools/ninja/${SUBDIR})
- set(URL "https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip")
- set(ARCHIVE "ninja-win.zip")
- set(HASH cccab9281b274c564f9ad77a2115be1f19be67d7b2ee14a55d1db1b27f3b68db8e76076e4f804b61eb8e573e26a8ecc9985675a8dcf03fd7a77b7f57234f1393)
+ set(SUBDIR "ninja-1.8.2")
+ if(CMAKE_HOST_WIN32)
+ set(PATHS "${DOWNLOADS}/tools/ninja/${SUBDIR}")
+ elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+ set(PATHS "${DOWNLOADS}/tools/${SUBDIR}-osx")
+ else()
+ set(PATHS "${DOWNLOADS}/tools/${SUBDIR}-linux")
+ endif()
+ set(BREW_PACKAGE_NAME "ninja")
+ set(APT_PACKAGE_NAME "ninja-build")
+ set(URL "https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip")
+ set(ARCHIVE "ninja-1.8.2-win.zip")
+ set(HASH 9b9ce248240665fcd6404b989f3b3c27ed9682838225e6dc9b67b551774f251e4ff8a207504f941e7c811e7a8be1945e7bcb94472a335ef15e23a0200a32e6d5)
elseif(VAR MATCHES "MESON")
set(PROGNAME meson)
set(REQUIRED_INTERPRETER PYTHON3)
set(SCRIPTNAME meson.py)
- set(PATHS ${DOWNLOADS}/tools/meson/meson-0.40.1)
- set(URL "https://github.com/mesonbuild/meson/archive/0.40.1.zip")
- set(ARCHIVE "meson-0.40.1.zip")
- set(HASH 4c1d07f32d527859f762c34de74d31d569573fc833335ab9652ed38d1f9e64b49869e826527c28a6a07cb8e594fd5c647b34aa95e626236a2707f75df0a2d435)
+ set(PATHS ${DOWNLOADS}/tools/meson/meson-0.43.0)
+ set(URL "https://github.com/mesonbuild/meson/archive/0.43.0.zip")
+ set(ARCHIVE "meson-0.43.0.zip")
+ set(HASH dde4de72eff37046731224f32aa5f4618d45bdf148cec2d1af6e25e7522ebc2b04aedc9eceed483dfa93823a0ea7ea472d0c0c9380061bf3ee2f16b87dd1425e)
+ elseif(VAR MATCHES "FLEX")
+ set(PROGNAME win_flex)
+ set(PATHS ${DOWNLOADS}/tools/win_flex)
+ set(URL "https://sourceforge.net/projects/winflexbison/files/win_flex_bison-2.5.9.zip/download")
+ set(ARCHIVE "win_flex_bison-2.5.9.zip")
+ set(HASH 9580f0e46893670a011645947c1becda69909a41a38bb4197fe33bd1ab7719da6b80e1be316f269e1a4759286870d49a9b07ef83afc4bac33232bd348e0bc814)
+ elseif(VAR MATCHES "BISON")
+ set(PROGNAME win_bison)
+ set(PATHS ${DOWNLOADS}/tools/win_bison)
+ set(URL "https://sourceforge.net/projects/winflexbison/files/win_flex_bison-2.5.9.zip/download")
+ set(ARCHIVE "win_flex_bison-2.5.9.zip")
+ set(HASH 9580f0e46893670a011645947c1becda69909a41a38bb4197fe33bd1ab7719da6b80e1be316f269e1a4759286870d49a9b07ef83afc4bac33232bd348e0bc814)
+ elseif(VAR MATCHES "GPERF")
+ set(PROGNAME gperf)
+ set(PATHS ${DOWNLOADS}/tools/gperf/bin)
+ set(URL "https://sourceforge.net/projects/gnuwin32/files/gperf/3.0.1/gperf-3.0.1-bin.zip/download")
+ set(ARCHIVE "gperf-3.0.1-bin.zip")
+ set(HASH 3f2d3418304390ecd729b85f65240a9e4d204b218345f82ea466ca3d7467789f43d0d2129fcffc18eaad3513f49963e79775b10cc223979540fa2e502fe7d4d9)
+ elseif(VAR MATCHES "GASPREPROCESSOR")
+ set(NOEXTRACT true)
+ set(PROGNAME gas-preprocessor)
+ set(REQUIRED_INTERPRETER PERL)
+ set(SCRIPTNAME "gas-preprocessor.pl")
+ set(PATHS ${DOWNLOADS}/tools/gas-preprocessor)
+ set(URL "https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/36bacb4cba27003c572e5bf7a9c4dfe3c9a8d40d/gas-preprocessor.pl")
+ set(ARCHIVE "gas-preprocessor.pl")
+ set(HASH a25caadccd1457a0fd2abb5a0da9aca1713b2c351d76daf87a4141e52021f51aa09e95a62942c6f0764f79cc1fa65bf71584955b09e62ee7da067b5c82baf6b3)
+ elseif(VAR MATCHES "DARK")
+ set(PROGNAME dark)
+ set(SUBDIR "wix311-binaries")
+ set(PATHS ${DOWNLOADS}/tools/dark/${SUBDIR})
+ set(URL "https://github.com/wixtoolset/wix3/releases/download/wix311rtm/wix311-binaries.zip")
+ set(ARCHIVE "wix311-binaries.zip")
+ set(HASH 74f0fa29b5991ca655e34a9d1000d47d4272e071113fada86727ee943d913177ae96dc3d435eaf494d2158f37560cd4c2c5274176946ebdb17bf2354ced1c516)
+ elseif(VAR MATCHES "SCONS")
+ set(PROGNAME scons)
+ set(REQUIRED_INTERPRETER PYTHON2)
+ set(SCRIPTNAME "scons.py")
+ set(PATHS ${DOWNLOADS}/tools/scons)
+ set(URL "https://sourceforge.net/projects/scons/files/scons-local-3.0.1.zip/download")
+ set(ARCHIVE "scons-local-3.0.1.zip")
+ set(HASH fe121b67b979a4e9580c7f62cfdbe0c243eba62a05b560d6d513ac7f35816d439b26d92fc2d7b7d7241c9ce2a49ea7949455a17587ef53c04a5f5125ac635727)
+ elseif(VAR MATCHES "DOXYGEN")
+ set(PROGNAME doxygen)
+ set(PATHS ${DOWNLOADS}/tools/doxygen)
+ set(URL "http://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.14.windows.bin.zip")
+ set(ARCHIVE "doxygen-1.8.14.windows.bin.zip")
+ set(HASH d0d706501e7112045b1f401f22d12a2c8d9b7728edee9ad1975a17dff914c16494ae48a70beab6f6304643779935843f268c7afed3b9da7d403b5cb11cac0c50)
+ # Download Tools
+ elseif(VAR MATCHES "ARIA2")
+ set(PROGNAME aria2c)
+ set(PATHS ${DOWNLOADS}/tools/aria2c/aria2-1.33.1-win-32bit-build1)
+ set(URL "https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip")
+ set(ARCHIVE "aria2-1.33.1-win-32bit-build1.zip")
+ set(HASH 2456176ba3d506a07cf0cc4f61f080e1ff8cb4106426d66f354c5bb67a9a8720b5ddb26904275e61b1f623c932355f7dcde4cd17556cc895f11293c23c3a9bf3)
else()
message(FATAL "unknown tool ${VAR} -- unable to acquire.")
endif()
@@ -93,34 +197,51 @@ function(vcpkg_find_acquire_program VAR)
find_program(${VAR} ${PROGNAME} PATHS ${PATHS})
else()
vcpkg_find_acquire_program(${REQUIRED_INTERPRETER})
- find_file(SCIRPT ${SCRIPTNAME} PATHS ${PATHS})
- set(${VAR} ${${REQUIRED_INTERPRETER}} ${SCIRPT})
+ find_file(SCRIPT ${SCRIPTNAME} PATHS ${PATHS})
+ set(${VAR} ${${REQUIRED_INTERPRETER}} ${SCRIPT})
endif()
endmacro()
do_find()
- if(${VAR} MATCHES "-NOTFOUND")
- file(DOWNLOAD ${URL} ${DOWNLOADS}/${ARCHIVE}
- EXPECTED_HASH SHA512=${HASH}
- SHOW_PROGRESS
+ if("${${VAR}}" MATCHES "-NOTFOUND")
+ if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
+ set(EXAMPLE ".")
+ if(DEFINED BREW_PACKAGE_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+ set(EXAMPLE ":\n brew install ${BREW_PACKAGE_NAME}")
+ elseif(DEFINED APT_PACKAGE_NAME AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+ set(EXAMPLE ":\n sudo apt-get install ${APT_PACKAGE_NAME}")
+ endif()
+ message(FATAL_ERROR "Could not find ${PROGNAME}. Please install it via your package manager${EXAMPLE}")
+ endif()
+
+ vcpkg_download_distfile(ARCHIVE_PATH
+ URLS ${URL}
+ SHA512 ${HASH}
+ FILENAME ${ARCHIVE}
)
- file(MAKE_DIRECTORY ${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR})
+
+ set(PROG_PATH_SUBDIR "${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR}")
+ file(MAKE_DIRECTORY ${PROG_PATH_SUBDIR})
if(DEFINED NOEXTRACT)
- file(COPY ${DOWNLOADS}/${ARCHIVE} DESTINATION ${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR})
+ if(DEFINED _vfa_RENAME)
+ file(INSTALL ${ARCHIVE_PATH} DESTINATION ${PROG_PATH_SUBDIR} RENAME ${_vfa_RENAME})
+ else()
+ file(COPY ${ARCHIVE_PATH} DESTINATION ${PROG_PATH_SUBDIR})
+ endif()
else()
get_filename_component(ARCHIVE_EXTENSION ${ARCHIVE} EXT)
string(TOLOWER "${ARCHIVE_EXTENSION}" ARCHIVE_EXTENSION)
- if(${ARCHIVE_EXTENSION} STREQUAL ".msi")
- file(TO_NATIVE_PATH "${DOWNLOADS}/${ARCHIVE}" ARCHIVE_NATIVE_PATH)
- file(TO_NATIVE_PATH "${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR}" DESTINATION_NATIVE_PATH)
+ if(ARCHIVE_EXTENSION STREQUAL ".msi")
+ file(TO_NATIVE_PATH "${ARCHIVE_PATH}" ARCHIVE_NATIVE_PATH)
+ file(TO_NATIVE_PATH "${PROG_PATH_SUBDIR}" DESTINATION_NATIVE_PATH)
execute_process(
COMMAND msiexec /a ${ARCHIVE_NATIVE_PATH} /qn TARGETDIR=${DESTINATION_NATIVE_PATH}
WORKING_DIRECTORY ${DOWNLOADS}
)
else()
execute_process(
- COMMAND ${CMAKE_COMMAND} -E tar xzf ${DOWNLOADS}/${ARCHIVE}
- WORKING_DIRECTORY ${DOWNLOADS}/tools/${PROGNAME}/${SUBDIR}
+ COMMAND ${CMAKE_COMMAND} -E tar xzf ${ARCHIVE_PATH}
+ WORKING_DIRECTORY ${PROG_PATH_SUBDIR}
)
endif()
endif()
@@ -128,5 +249,5 @@ function(vcpkg_find_acquire_program VAR)
do_find()
endif()
- set(${VAR} ${${VAR}} PARENT_SCOPE)
+ set(${VAR} "${${VAR}}" PARENT_SCOPE)
endfunction()
diff --git a/scripts/cmake/vcpkg_fixup_cmake_targets.cmake b/scripts/cmake/vcpkg_fixup_cmake_targets.cmake
index 7c1891584..47c91f83c 100644
--- a/scripts/cmake/vcpkg_fixup_cmake_targets.cmake
+++ b/scripts/cmake/vcpkg_fixup_cmake_targets.cmake
@@ -14,81 +14,147 @@
#
function(vcpkg_fixup_cmake_targets)
- cmake_parse_arguments(_vfct "" "CONFIG_PATH" "" ${ARGN})
+ cmake_parse_arguments(_vfct "" "CONFIG_PATH;TARGET_PATH" "" ${ARGN})
- set(DEBUG_SHARE ${CURRENT_PACKAGES_DIR}/debug/share/${PORT})
- set(RELEASE_SHARE ${CURRENT_PACKAGES_DIR}/share/${PORT})
+ if(_vfct_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "vcpkg_fixup_cmake_targets was passed extra arguments: ${_vfct_UNPARSED_ARGUMENTS}")
+ endif()
+
+ if(NOT _vfct_TARGET_PATH)
+ set(_vfct_TARGET_PATH share/${PORT})
+ endif()
+
+ set(DEBUG_SHARE ${CURRENT_PACKAGES_DIR}/debug/${_vfct_TARGET_PATH})
+ set(RELEASE_SHARE ${CURRENT_PACKAGES_DIR}/${_vfct_TARGET_PATH})
+
+ if(_vfct_CONFIG_PATH AND NOT RELEASE_SHARE STREQUAL "${CURRENT_PACKAGES_DIR}/${_vfct_CONFIG_PATH}")
+ if(_vfct_CONFIG_PATH STREQUAL "share")
+ file(RENAME ${CURRENT_PACKAGES_DIR}/debug/share ${CURRENT_PACKAGES_DIR}/debug/share2)
+ file(RENAME ${CURRENT_PACKAGES_DIR}/share ${CURRENT_PACKAGES_DIR}/share2)
+ set(_vfct_CONFIG_PATH share2)
+ endif()
- if(NOT ${_vfct_CONFIG_PATH} STREQUAL "")
set(DEBUG_CONFIG ${CURRENT_PACKAGES_DIR}/debug/${_vfct_CONFIG_PATH})
set(RELEASE_CONFIG ${CURRENT_PACKAGES_DIR}/${_vfct_CONFIG_PATH})
- if(NOT EXISTS ${DEBUG_CONFIG})
- message(FATAL_ERROR "'${DEBUG_CONFIG}' does not exist.")
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ if(NOT EXISTS ${DEBUG_CONFIG})
+ message(FATAL_ERROR "'${DEBUG_CONFIG}' does not exist.")
+ endif()
+
+ # This roundabout handling enables CONFIG_PATH share
+ file(MAKE_DIRECTORY ${DEBUG_SHARE})
+ file(GLOB FILES ${DEBUG_CONFIG}/*)
+ file(COPY ${FILES} DESTINATION ${DEBUG_SHARE})
+ file(REMOVE_RECURSE ${DEBUG_CONFIG})
endif()
- file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/debug/share)
- file(RENAME ${DEBUG_CONFIG} ${DEBUG_SHARE})
- file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/share)
- file(RENAME ${RELEASE_CONFIG} ${RELEASE_SHARE})
+ file(GLOB FILES ${RELEASE_CONFIG}/*)
+ file(COPY ${FILES} DESTINATION ${RELEASE_SHARE})
+ file(REMOVE_RECURSE ${RELEASE_CONFIG})
- get_filename_component(DEBUG_CONFIG_DIR_NAME ${DEBUG_CONFIG} NAME)
- string(TOLOWER "${DEBUG_CONFIG_DIR_NAME}" DEBUG_CONFIG_DIR_NAME)
- if(${DEBUG_CONFIG_DIR_NAME} STREQUAL "cmake")
- file(REMOVE_RECURSE ${DEBUG_CONFIG})
- else()
- get_filename_component(DEBUG_CONFIG_PARENT_DIR ${DEBUG_CONFIG} DIRECTORY)
- get_filename_component(DEBUG_CONFIG_DIR_NAME ${DEBUG_CONFIG_PARENT_DIR} NAME)
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ get_filename_component(DEBUG_CONFIG_DIR_NAME ${DEBUG_CONFIG} NAME)
string(TOLOWER "${DEBUG_CONFIG_DIR_NAME}" DEBUG_CONFIG_DIR_NAME)
- if(${DEBUG_CONFIG_DIR_NAME} STREQUAL "cmake")
- file(REMOVE_RECURSE ${DEBUG_CONFIG_PARENT_DIR})
+ if(DEBUG_CONFIG_DIR_NAME STREQUAL "cmake")
+ file(REMOVE_RECURSE ${DEBUG_CONFIG})
+ else()
+ get_filename_component(DEBUG_CONFIG_PARENT_DIR ${DEBUG_CONFIG} DIRECTORY)
+ get_filename_component(DEBUG_CONFIG_DIR_NAME ${DEBUG_CONFIG_PARENT_DIR} NAME)
+ string(TOLOWER "${DEBUG_CONFIG_DIR_NAME}" DEBUG_CONFIG_DIR_NAME)
+ if(DEBUG_CONFIG_DIR_NAME STREQUAL "cmake")
+ file(REMOVE_RECURSE ${DEBUG_CONFIG_PARENT_DIR})
+ endif()
endif()
endif()
get_filename_component(RELEASE_CONFIG_DIR_NAME ${RELEASE_CONFIG} NAME)
string(TOLOWER "${RELEASE_CONFIG_DIR_NAME}" RELEASE_CONFIG_DIR_NAME)
- if(${RELEASE_CONFIG_DIR_NAME} STREQUAL "cmake")
+ if(RELEASE_CONFIG_DIR_NAME STREQUAL "cmake")
file(REMOVE_RECURSE ${RELEASE_CONFIG})
else()
get_filename_component(RELEASE_CONFIG_PARENT_DIR ${RELEASE_CONFIG} DIRECTORY)
get_filename_component(RELEASE_CONFIG_DIR_NAME ${RELEASE_CONFIG_PARENT_DIR} NAME)
string(TOLOWER "${RELEASE_CONFIG_DIR_NAME}" RELEASE_CONFIG_DIR_NAME)
- if(${RELEASE_CONFIG_DIR_NAME} STREQUAL "cmake")
+ if(RELEASE_CONFIG_DIR_NAME STREQUAL "cmake")
file(REMOVE_RECURSE ${RELEASE_CONFIG_PARENT_DIR})
endif()
endif()
endif()
- if(NOT EXISTS ${DEBUG_SHARE})
- message(FATAL_ERROR "'${DEBUG_SHARE}' does not exist.")
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ if(NOT EXISTS "${DEBUG_SHARE}")
+ message(FATAL_ERROR "'${DEBUG_SHARE}' does not exist.")
+ endif()
endif()
- file(GLOB UNUSED_FILES "${DEBUG_SHARE}/*[Tt]argets.cmake" "${DEBUG_SHARE}/*[Cc]onfig.cmake" "${DEBUG_SHARE}/*[Cc]onfigVersion.cmake")
- file(REMOVE ${UNUSED_FILES})
-
- file(GLOB RELEASE_TARGETS "${RELEASE_SHARE}/*[Tt]argets-release.cmake")
- foreach(RELEASE_TARGET ${RELEASE_TARGETS})
- get_filename_component(RELEASE_TARGET_NAME ${RELEASE_TARGET} NAME)
+ file(GLOB_RECURSE UNUSED_FILES
+ "${DEBUG_SHARE}/*[Tt]argets.cmake"
+ "${DEBUG_SHARE}/*[Cc]onfig.cmake"
+ "${DEBUG_SHARE}/*[Cc]onfigVersion.cmake"
+ "${DEBUG_SHARE}/*[Cc]onfig-version.cmake"
+ )
+ if(UNUSED_FILES)
+ file(REMOVE ${UNUSED_FILES})
+ endif()
+ file(GLOB_RECURSE RELEASE_TARGETS
+ "${RELEASE_SHARE}/*-release.cmake"
+ )
+ foreach(RELEASE_TARGET IN LISTS RELEASE_TARGETS)
file(READ ${RELEASE_TARGET} _contents)
+ string(REPLACE "${CURRENT_INSTALLED_DIR}" "\${_IMPORT_PREFIX}" _contents "${_contents}")
string(REGEX REPLACE "\\\${_IMPORT_PREFIX}/bin/([^ \"]+\\.exe)" "\${_IMPORT_PREFIX}/tools/${PORT}/\\1" _contents "${_contents}")
file(WRITE ${RELEASE_TARGET} "${_contents}")
endforeach()
- file(GLOB DEBUG_TARGETS "${DEBUG_SHARE}/*[Tt]argets-debug.cmake")
- foreach(DEBUG_TARGET ${DEBUG_TARGETS})
- get_filename_component(DEBUG_TARGET_NAME ${DEBUG_TARGET} NAME)
+ if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
+ file(GLOB_RECURSE DEBUG_TARGETS
+ "${DEBUG_SHARE}/*-debug.cmake"
+ )
+ foreach(DEBUG_TARGET IN LISTS DEBUG_TARGETS)
+ file(RELATIVE_PATH DEBUG_TARGET_REL "${DEBUG_SHARE}" "${DEBUG_TARGET}")
+
+ file(READ ${DEBUG_TARGET} _contents)
+ string(REPLACE "${CURRENT_INSTALLED_DIR}" "\${_IMPORT_PREFIX}" _contents "${_contents}")
+ string(REGEX REPLACE "\\\${_IMPORT_PREFIX}/bin/([^ \"]+\\.exe)" "\${_IMPORT_PREFIX}/tools/${PORT}/\\1" _contents "${_contents}")
+ string(REPLACE "\${_IMPORT_PREFIX}/lib" "\${_IMPORT_PREFIX}/debug/lib" _contents "${_contents}")
+ string(REPLACE "\${_IMPORT_PREFIX}/bin" "\${_IMPORT_PREFIX}/debug/bin" _contents "${_contents}")
+ file(WRITE ${RELEASE_SHARE}/${DEBUG_TARGET_REL} "${_contents}")
+
+ file(REMOVE ${DEBUG_TARGET})
+ endforeach()
+ endif()
- file(READ ${DEBUG_TARGET} _contents)
- string(REGEX REPLACE "\\\${_IMPORT_PREFIX}/bin/([^ \"]+\\.exe)" "\${_IMPORT_PREFIX}/tools/${PORT}/\\1" _contents "${_contents}")
- string(REPLACE "\${_IMPORT_PREFIX}/lib" "\${_IMPORT_PREFIX}/debug/lib" _contents "${_contents}")
- string(REPLACE "\${_IMPORT_PREFIX}/bin" "\${_IMPORT_PREFIX}/debug/bin" _contents "${_contents}")
- file(WRITE ${CURRENT_PACKAGES_DIR}/share/${PORT}/${DEBUG_TARGET_NAME} "${_contents}")
+ file(GLOB_RECURSE MAIN_TARGETS "${RELEASE_SHARE}/*[Tt]argets.cmake")
+ foreach(MAIN_TARGET IN LISTS MAIN_TARGETS)
+ file(READ ${MAIN_TARGET} _contents)
+ string(REGEX REPLACE
+ "get_filename_component\\(_IMPORT_PREFIX \"\\\${CMAKE_CURRENT_LIST_FILE}\" PATH\\)(\nget_filename_component\\(_IMPORT_PREFIX \"\\\${_IMPORT_PREFIX}\" PATH\\))*"
+ "get_filename_component(_IMPORT_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"\${_IMPORT_PREFIX}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"\${_IMPORT_PREFIX}\" PATH)"
+ _contents "${_contents}")
+ string(REPLACE "${CURRENT_INSTALLED_DIR}" "_INVALID_ROOT_" _contents "${_contents}")
+ string(REGEX REPLACE ";_INVALID_ROOT_/[^\";]*" "" _contents "${_contents}")
+ string(REGEX REPLACE "_INVALID_ROOT_/[^\";]*;" "" _contents "${_contents}")
+ string(REGEX REPLACE "\"_INVALID_ROOT_/[^\";]*\"" "\"\"" _contents "${_contents}")
+ file(WRITE ${MAIN_TARGET} "${_contents}")
+ endforeach()
- file(REMOVE ${DEBUG_TARGET})
+ file(GLOB_RECURSE MAIN_CONFIGS "${RELEASE_SHARE}/*[Cc]onfig.cmake")
+ foreach(MAIN_CONFIG IN LISTS MAIN_CONFIGS)
+ file(READ ${MAIN_CONFIG} _contents)
+ string(REGEX REPLACE
+ "get_filename_component\\(_IMPORT_PREFIX \"\\\${CMAKE_CURRENT_LIST_FILE}\" PATH\\)(\nget_filename_component\\(_IMPORT_PREFIX \"\\\${_IMPORT_PREFIX}\" PATH\\))*"
+ "get_filename_component(_IMPORT_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"\${_IMPORT_PREFIX}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"\${_IMPORT_PREFIX}\" PATH)"
+ _contents "${_contents}")
+ string(REGEX REPLACE
+ "get_filename_component\\(PACKAGE_PREFIX_DIR \"\\\${CMAKE_CURRENT_LIST_DIR}/\\.\\./(\\.\\./)*\" ABSOLUTE\\)"
+ "get_filename_component(PACKAGE_PREFIX_DIR \"\${CMAKE_CURRENT_LIST_DIR}/../../\" ABSOLUTE)"
+ _contents "${_contents}")
+ file(WRITE ${MAIN_CONFIG} "${_contents}")
endforeach()
- # Remove /debug/share/<port>/ if it's empty.
+ # Remove /debug/<target_path>/ if it's empty.
file(GLOB_RECURSE REMAINING_FILES "${DEBUG_SHARE}/*")
if(NOT REMAINING_FILES)
file(REMOVE_RECURSE ${DEBUG_SHARE})
@@ -99,4 +165,13 @@ function(vcpkg_fixup_cmake_targets)
if(NOT REMAINING_FILES)
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
endif()
+
+ # Patch out any remaining absolute references
+ file(TO_CMAKE_PATH "${CURRENT_PACKAGES_DIR}" CMAKE_CURRENT_PACKAGES_DIR)
+ file(GLOB CMAKE_FILES ${RELEASE_SHARE}/*.cmake)
+ foreach(CMAKE_FILE IN LISTS CMAKE_FILES)
+ file(READ ${CMAKE_FILE} _contents)
+ string(REPLACE "${CMAKE_CURRENT_PACKAGES_DIR}" "\${CMAKE_CURRENT_LIST_DIR}/../.." _contents "${_contents}")
+ file(WRITE ${CMAKE_FILE} "${_contents}")
+ endforeach()
endfunction()
diff --git a/scripts/cmake/vcpkg_from_bitbucket.cmake b/scripts/cmake/vcpkg_from_bitbucket.cmake
new file mode 100644
index 000000000..a12d86b43
--- /dev/null
+++ b/scripts/cmake/vcpkg_from_bitbucket.cmake
@@ -0,0 +1,183 @@
+## # vcpkg_from_bitbucket
+##
+## Download and extract a project from Bitbucket.
+## Enables support for installing HEAD `vcpkg.exe install --head <port>`.
+##
+## ## Usage:
+## ```cmake
+## vcpkg_from_bitbucket(
+## OUT_SOURCE_PATH <SOURCE_PATH>
+## REPO <Microsoft/cpprestsdk>
+## [REF <v2.0.0>]
+## [SHA512 <45d0d7f8cc350...>]
+## [HEAD_REF <master>]
+## )
+## ```
+##
+## ## Parameters:
+## ### OUT_SOURCE_PATH
+## Specifies the out-variable that will contain the extracted location.
+##
+## This should be set to `SOURCE_PATH` by convention.
+##
+## ### REPO
+## The organization or user and repository on GitHub.
+##
+## ### REF
+## A stable git commit-ish (ideally a tag) that will not change contents. **This should not be a branch.**
+##
+## For repositories without official releases, this can be set to the full commit id of the current latest master.
+##
+## If `REF` is specified, `SHA512` must also be specified.
+##
+## ### SHA512
+## The SHA512 hash that should match the archive (https://bitbucket.com/${REPO}/get/${REF}.tar.gz).
+##
+## This is most easily determined by first setting it to `1`, then trying to build the port. The error message will contain the full hash, which can be copied back into the portfile.
+##
+## ### HEAD_REF
+## The unstable git commit-ish (ideally a branch) to pull for `--head` builds.
+##
+## For most projects, this should be `master`. The chosen branch should be one that is expected to be always buildable on all supported platforms.
+##
+## ## Notes:
+## At least one of `REF` and `HEAD_REF` must be specified, however it is preferable for both to be present.
+##
+## This exports the `VCPKG_HEAD_VERSION` variable during head builds.
+##
+## ## Examples:
+##
+## * [blaze](https://github.com/Microsoft/vcpkg/blob/master/ports/blaze/portfile.cmake)
+function(vcpkg_from_bitbucket)
+ set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 HEAD_REF)
+ set(multipleValuesArgs)
+ cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN})
+
+ if(NOT _vdud_OUT_SOURCE_PATH)
+ message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.")
+ endif()
+
+ if((_vdud_REF AND NOT _vdud_SHA512) OR (NOT _vdud_REF AND _vdud_SHA512))
+ message(FATAL_ERROR "SHA512 must be specified if REF is specified.")
+ endif()
+
+ if(NOT _vdud_REPO)
+ message(FATAL_ERROR "The Bitbucket repository must be specified.")
+ endif()
+
+ if(NOT _vdud_REF AND NOT _vdud_HEAD_REF)
+ message(FATAL_ERROR "At least one of REF and HEAD_REF must be specified.")
+ endif()
+
+ string(REGEX REPLACE ".*/" "" REPO_NAME ${_vdud_REPO})
+ string(REGEX REPLACE "/.*" "" ORG_NAME ${_vdud_REPO})
+
+ macro(set_SOURCE_PATH BASE BASEREF)
+ set(SOURCE_PATH "${BASE}/${ORG_NAME}-${REPO_NAME}-${BASEREF}")
+ if(EXISTS ${SOURCE_PATH})
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
+ else()
+ # Sometimes GitHub strips a leading 'v' off the REF.
+ string(REGEX REPLACE "^v" "" REF ${BASEREF})
+ set(SOURCE_PATH "${BASE}/${ORG_NAME}-${REPO_NAME}-${REF}")
+ if(EXISTS ${SOURCE_PATH})
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
+ else()
+ message(FATAL_ERROR "Could not determine source path: '${BASE}/${ORG_NAME}-${REPO_NAME}-${BASEREF}' does not exist")
+ endif()
+ endif()
+ endmacro()
+
+ if(VCPKG_USE_HEAD_VERSION AND NOT _vdud_HEAD_REF)
+ message(STATUS "Package does not specify HEAD_REF. Falling back to non-HEAD version.")
+ set(VCPKG_USE_HEAD_VERSION OFF)
+ endif()
+
+ # Handle --no-head scenarios
+ if(NOT VCPKG_USE_HEAD_VERSION)
+ if(NOT _vdud_REF)
+ message(FATAL_ERROR "Package does not specify REF. It must built using --head.")
+ endif()
+
+ set(URL "https://bitbucket.com/${ORG_NAME}/${REPO_NAME}/get/${_vdud_REF}.tar.gz")
+ set(downloaded_file_path "${DOWNLOADS}/${ORG_NAME}-${REPO_NAME}-${_vdud_REF}.tar.gz")
+
+ file(DOWNLOAD "https://api.bitbucket.com/2.0/repositories/${ORG_NAME}/${REPO_NAME}/refs/tags/${_vdud_REF}"
+ ${downloaded_file_path}.version
+ STATUS download_status
+ )
+ list(GET download_status 0 status_code)
+ if ("${status_code}" STREQUAL "0")
+ # Parse the github refs response with regex.
+ # TODO: use some JSON swiss-army-knife utility instead.
+ file(READ "${downloaded_file_path}.version" _contents)
+ string(REGEX MATCH "\"hash\": \"[a-f0-9]+\"" x "${_contents}")
+ string(REGEX REPLACE "\"hash\": \"([a-f0-9]+)\"" "\\1" _version ${x})
+ string(SUBSTRING ${_version} 0 12 _version) # Get the 12 first numbers from commit hash
+ else()
+ set(_version ${_vdud_REF})
+ endif()
+
+ vcpkg_download_distfile(ARCHIVE
+ URLS "https://bitbucket.com/${ORG_NAME}/${REPO_NAME}/get/${_vdud_REF}.tar.gz"
+ SHA512 "${_vdud_SHA512}"
+ FILENAME "${ORG_NAME}-${REPO_NAME}-${_vdud_REF}.tar.gz"
+ )
+ vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}")
+ set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src ${_version})
+ return()
+ endif()
+
+ # The following is for --head scenarios
+ set(URL "https://bitbucket.com/${ORG_NAME}/${REPO_NAME}/get/${_vdud_HEAD_REF}.tar.gz")
+ set(downloaded_file_name "${ORG_NAME}-${REPO_NAME}-${_vdud_HEAD_REF}.tar.gz")
+ set(downloaded_file_path "${DOWNLOADS}/${downloaded_file_name}")
+
+ if(_VCPKG_NO_DOWNLOADS)
+ if(NOT EXISTS ${downloaded_file_path} OR NOT EXISTS ${downloaded_file_path}.version)
+ message(FATAL_ERROR "Downloads are disabled, but '${downloaded_file_path}' does not exist.")
+ endif()
+ message(STATUS "Using cached ${downloaded_file_path}")
+ else()
+ if(EXISTS ${downloaded_file_path})
+ message(STATUS "Purging cached ${downloaded_file_path} to fetch latest (use --no-downloads to suppress)")
+ file(REMOVE ${downloaded_file_path})
+ endif()
+ if(EXISTS ${downloaded_file_path}.version)
+ file(REMOVE ${downloaded_file_path}.version)
+ endif()
+ if(EXISTS ${CURRENT_BUILDTREES_DIR}/src/head)
+ file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/src/head)
+ endif()
+
+ # Try to download the file and version information from bitbucket.
+ vcpkg_download_distfile(ARCHIVE_VERSION
+ URLS "https://api.bitbucket.com/2.0/repositories/${ORG_NAME}/${REPO_NAME}/refs/branches/${_vdud_HEAD_REF}"
+ FILENAME "${downloaded_file_name}.version"
+ SKIP_SHA512
+ )
+
+ vcpkg_download_distfile(ARCHIVE
+ URLS "${URL}"
+ FILENAME "${downloaded_file_name}"
+ SKIP_SHA512
+ )
+ endif()
+
+ vcpkg_extract_source_archive_ex(
+ ARCHIVE "${ARCHIVE}"
+ WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src/head"
+ )
+
+ # Parse the github refs response with regex.
+ # TODO: use some JSON swiss-army-knife utility instead.
+ file(READ "${ARCHIVE_VERSION}" _contents)
+ string(REGEX MATCH "\"hash\": \"[a-f0-9]+\"" x "${_contents}")
+ string(REGEX REPLACE "\"hash\": \"([a-f0-9]+)\"" "\\1" _version ${x})
+ string(SUBSTRING ${_version} 0 12 _vdud_HEAD_REF) # Get the 12 first numbers from commit hash
+
+ # exports VCPKG_HEAD_VERSION to the caller. This will get picked up by ports.cmake after the build.
+ set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
+
+ set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${_vdud_HEAD_REF})
+endfunction()
diff --git a/scripts/cmake/vcpkg_from_github.cmake b/scripts/cmake/vcpkg_from_github.cmake
index f0f8dba8b..28ada0631 100644
--- a/scripts/cmake/vcpkg_from_github.cmake
+++ b/scripts/cmake/vcpkg_from_github.cmake
@@ -1,55 +1,92 @@
-# Usage:
-# vcpkg_from_github(
-# OUT_SOURCE_PATH <OutVar for SOURCE_PATH (SOURCE_PATH)>
-# REPO <Repository (Microsoft/cpprestsdk)>
-# REF <stable ref (v2.0.0)>
-# SHA512 <SHA for REF (45d0d7f8cc350...)>
-# HEAD_REF <unstable branch (master)>
-# )
-#
-# Notes:
-# This will export VCPKG_HEAD_VERSION variable during head builds.
+## # vcpkg_from_github
+##
+## Download and extract a project from GitHub. Enables support for `install --head`.
+##
+## ## Usage:
+## ```cmake
+## vcpkg_from_github(
+## OUT_SOURCE_PATH <SOURCE_PATH>
+## REPO <Microsoft/cpprestsdk>
+## [REF <v2.0.0>]
+## [SHA512 <45d0d7f8cc350...>]
+## [HEAD_REF <master>]
+## )
+## ```
+##
+## ## Parameters:
+## ### OUT_SOURCE_PATH
+## Specifies the out-variable that will contain the extracted location.
+##
+## This should be set to `SOURCE_PATH` by convention.
+##
+## ### REPO
+## The organization or user and repository on GitHub.
+##
+## ### REF
+## A stable git commit-ish (ideally a tag) that will not change contents. **This should not be a branch.**
+##
+## For repositories without official releases, this can be set to the full commit id of the current latest master.
+##
+## If `REF` is specified, `SHA512` must also be specified.
+##
+## ### SHA512
+## The SHA512 hash that should match the archive (https://github.com/${REPO}/archive/${REF}.tar.gz).
+##
+## This is most easily determined by first setting it to `1`, then trying to build the port. The error message will contain the full hash, which can be copied back into the portfile.
+##
+## ### HEAD_REF
+## The unstable git commit-ish (ideally a branch) to pull for `--head` builds.
+##
+## For most projects, this should be `master`. The chosen branch should be one that is expected to be always buildable on all supported platforms.
+##
+## ## Notes:
+## At least one of `REF` and `HEAD_REF` must be specified, however it is preferable for both to be present.
+##
+## This exports the `VCPKG_HEAD_VERSION` variable during head builds.
+##
+## ## Examples:
+##
+## * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake)
+## * [ms-gsl](https://github.com/Microsoft/vcpkg/blob/master/ports/ms-gsl/portfile.cmake)
+## * [beast](https://github.com/Microsoft/vcpkg/blob/master/ports/beast/portfile.cmake)
function(vcpkg_from_github)
set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 HEAD_REF)
- set(multipleValuesArgs)
+ set(multipleValuesArgs PATCHES)
cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN})
- if(NOT _vdud_OUT_SOURCE_PATH)
+ if(NOT DEFINED _vdud_OUT_SOURCE_PATH)
message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.")
endif()
- if((_vdud_REF AND NOT _vdud_SHA512) OR (NOT _vdud_REF AND _vdud_SHA512))
+ if((DEFINED _vdud_REF AND NOT DEFINED _vdud_SHA512) OR (NOT DEFINED _vdud_REF AND DEFINED _vdud_SHA512))
message(FATAL_ERROR "SHA512 must be specified if REF is specified.")
endif()
- if(NOT _vdud_REPO)
+ if(NOT DEFINED _vdud_REPO)
message(FATAL_ERROR "The GitHub repository must be specified.")
endif()
- if(NOT _vdud_REF AND NOT _vdud_HEAD_REF)
+ if(NOT DEFINED _vdud_REF AND NOT DEFINED _vdud_HEAD_REF)
message(FATAL_ERROR "At least one of REF and HEAD_REF must be specified.")
endif()
string(REGEX REPLACE ".*/" "" REPO_NAME ${_vdud_REPO})
string(REGEX REPLACE "/.*" "" ORG_NAME ${_vdud_REPO})
- macro(set_SOURCE_PATH BASE BASEREF)
- set(SOURCE_PATH "${BASE}/${REPO_NAME}-${BASEREF}")
- if(EXISTS ${SOURCE_PATH})
- set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
- else()
- # Sometimes GitHub strips a leading 'v' off the REF.
- string(REGEX REPLACE "^v" "" REF ${BASEREF})
- set(SOURCE_PATH "${BASE}/${REPO_NAME}-${REF}")
- if(EXISTS ${SOURCE_PATH})
- set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
- else()
- message(FATAL_ERROR "Could not determine source path: '${BASE}/${REPO_NAME}-${BASEREF}' does not exist")
- endif()
+ macro(set_TEMP_SOURCE_PATH BASE BASEREF)
+ set(TEMP_SOURCE_PATH "${BASE}/${REPO_NAME}-${BASEREF}")
+ if(NOT EXISTS ${TEMP_SOURCE_PATH})
+ # Sometimes GitHub strips a leading 'v' off the REF.
+ string(REGEX REPLACE "^v" "" REF ${BASEREF})
+ string(REPLACE "/" "-" REF ${REF})
+ set(TEMP_SOURCE_PATH "${BASE}/${REPO_NAME}-${REF}")
+ if(NOT EXISTS ${TEMP_SOURCE_PATH})
+ message(FATAL_ERROR "Could not determine source path: '${BASE}/${REPO_NAME}-${BASEREF}' does not exist")
endif()
+ endif()
endmacro()
- if(VCPKG_USE_HEAD_VERSION AND NOT _vdud_HEAD_REF)
+ if(VCPKG_USE_HEAD_VERSION AND NOT DEFINED _vdud_HEAD_REF)
message(STATUS "Package does not specify HEAD_REF. Falling back to non-HEAD version.")
set(VCPKG_USE_HEAD_VERSION OFF)
endif()
@@ -60,19 +97,59 @@ function(vcpkg_from_github)
message(FATAL_ERROR "Package does not specify REF. It must built using --head.")
endif()
+ string(REPLACE "/" "-" SANITIZED_REF "${_vdud_REF}")
+
vcpkg_download_distfile(ARCHIVE
URLS "https://github.com/${ORG_NAME}/${REPO_NAME}/archive/${_vdud_REF}.tar.gz"
SHA512 "${_vdud_SHA512}"
- FILENAME "${ORG_NAME}-${REPO_NAME}-${_vdud_REF}.tar.gz"
+ FILENAME "${ORG_NAME}-${REPO_NAME}-${SANITIZED_REF}.tar.gz"
)
- vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}")
- set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src ${_vdud_REF})
+
+ # Take the last 10 chars of the REF
+ set(REF_MAX_LENGTH 10)
+ string(LENGTH ${SANITIZED_REF} REF_LENGTH)
+ math(EXPR FROM_REF ${REF_LENGTH}-${REF_MAX_LENGTH})
+ if(FROM_REF LESS 0)
+ set(FROM_REF 0)
+ endif()
+ string(SUBSTRING ${SANITIZED_REF} ${FROM_REF} ${REF_LENGTH} SHORTENED_SANITIZED_REF)
+
+ # Hash the archive hash along with the patches. Take the first 10 chars of the hash
+ set(PATCHSET_HASH "${_vdud_SHA512}")
+ foreach(PATCH IN LISTS _vdud_PATCHES)
+ file(SHA512 ${PATCH} CURRENT_HASH)
+ string(APPEND PATCHSET_HASH ${CURRENT_HASH})
+ endforeach()
+
+ string(SHA512 PATCHSET_HASH ${PATCHSET_HASH})
+ string(SUBSTRING ${PATCHSET_HASH} 0 10 PATCHSET_HASH)
+ set(SOURCE_PATH "${CURRENT_BUILDTREES_DIR}/src/${SHORTENED_SANITIZED_REF}-${PATCHSET_HASH}")
+
+ if(NOT EXISTS ${SOURCE_PATH})
+ set(TEMP_DIR "${CURRENT_BUILDTREES_DIR}/src/TEMP")
+ file(REMOVE_RECURSE ${TEMP_DIR})
+ vcpkg_extract_source_archive_ex(ARCHIVE "${ARCHIVE}" WORKING_DIRECTORY ${TEMP_DIR})
+ set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/TEMP ${SANITIZED_REF})
+
+ vcpkg_apply_patches(
+ SOURCE_PATH ${TEMP_SOURCE_PATH}
+ PATCHES ${_vdud_PATCHES}
+ )
+
+ file(RENAME ${TEMP_SOURCE_PATH} ${SOURCE_PATH})
+ file(REMOVE_RECURSE ${TEMP_DIR})
+ endif()
+
+ set(${_vdud_OUT_SOURCE_PATH} "${SOURCE_PATH}" PARENT_SCOPE)
+
return()
endif()
# The following is for --head scenarios
set(URL "https://github.com/${ORG_NAME}/${REPO_NAME}/archive/${_vdud_HEAD_REF}.tar.gz")
- set(downloaded_file_path "${DOWNLOADS}/${ORG_NAME}-${REPO_NAME}-${_vdud_HEAD_REF}.tar.gz")
+ string(REPLACE "/" "-" SANITIZED_HEAD_REF "${_vdud_HEAD_REF}")
+ set(downloaded_file_name "${ORG_NAME}-${REPO_NAME}-${SANITIZED_HEAD_REF}.tar.gz")
+ set(downloaded_file_path "${DOWNLOADS}/${downloaded_file_name}")
if(_VCPKG_NO_DOWNLOADS)
if(NOT EXISTS ${downloaded_file_path} OR NOT EXISTS ${downloaded_file_path}.version)
@@ -92,40 +169,40 @@ function(vcpkg_from_github)
endif()
# Try to download the file and version information from github.
- message(STATUS "Downloading ${URL}...")
- file(DOWNLOAD "https://api.github.com/repos/${ORG_NAME}/${REPO_NAME}/git/refs/heads/${_vdud_HEAD_REF}"
- ${downloaded_file_path}.version
- STATUS download_status
+ vcpkg_download_distfile(ARCHIVE_VERSION
+ URLS "https://api.github.com/repos/${ORG_NAME}/${REPO_NAME}/git/refs/heads/${_vdud_HEAD_REF}"
+ FILENAME ${downloaded_file_name}.version
+ SKIP_SHA512
)
- list(GET download_status 0 status_code)
- if (NOT "${status_code}" STREQUAL "0")
- file(REMOVE ${downloaded_file_path}.version)
- message(FATAL_ERROR "Downloading version info for ${URL}... Failed. Status: ${download_status}")
- endif()
- file(DOWNLOAD ${URL} ${downloaded_file_path} STATUS download_status)
- list(GET download_status 0 status_code)
- if (NOT "${status_code}" STREQUAL "0")
- file(REMOVE ${downloaded_file_path})
- message(FATAL_ERROR "Downloading ${URL}... Failed. Status: ${download_status}")
- else()
- message(STATUS "Downloading ${URL}... OK")
- endif()
+ vcpkg_download_distfile(ARCHIVE
+ URLS ${URL}
+ FILENAME ${downloaded_file_name}
+ SKIP_SHA512
+ )
endif()
vcpkg_extract_source_archive_ex(
- ARCHIVE "${downloaded_file_path}"
+ ARCHIVE "${ARCHIVE}"
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/src/head"
)
# Parse the github refs response with regex.
# TODO: use some JSON swiss-army-knife utility instead.
- file(READ "${downloaded_file_path}.version" _contents)
+ file(READ "${ARCHIVE_VERSION}" _contents)
string(REGEX MATCH "\"sha\": \"[a-f0-9]+\"" x "${_contents}")
string(REGEX REPLACE "\"sha\": \"([a-f0-9]+)\"" "\\1" _version ${x})
# exports VCPKG_HEAD_VERSION to the caller. This will get picked up by ports.cmake after the build.
- set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
+ # When multiple vcpkg_from_github's are used after each other, only use the version from the first (hopefully the primary one).
+ if(NOT DEFINED VCPKG_HEAD_VERSION)
+ set(VCPKG_HEAD_VERSION ${_version} PARENT_SCOPE)
+ endif()
- set_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${_vdud_HEAD_REF})
+ set_TEMP_SOURCE_PATH(${CURRENT_BUILDTREES_DIR}/src/head ${SANITIZED_HEAD_REF})
+ vcpkg_apply_patches(
+ SOURCE_PATH ${TEMP_SOURCE_PATH}
+ PATCHES ${_vdud_PATCHES}
+ )
+ set(${_vdud_OUT_SOURCE_PATH} "${TEMP_SOURCE_PATH}" PARENT_SCOPE)
endfunction()
diff --git a/scripts/cmake/vcpkg_get_windows_sdk.cmake b/scripts/cmake/vcpkg_get_windows_sdk.cmake
index ca58ab10a..e7d72a125 100644
--- a/scripts/cmake/vcpkg_get_windows_sdk.cmake
+++ b/scripts/cmake/vcpkg_get_windows_sdk.cmake
@@ -1,15 +1,6 @@
# Returns Windows SDK number via out variable "ret"
function(vcpkg_get_windows_sdk ret)
- execute_process(
- COMMAND powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& {& '${VCPKG_ROOT_DIR}/scripts/getWindowsSDK.ps1'}" 2>&1
- OUTPUT_VARIABLE WINDOWS_SDK
- RESULT_VARIABLE error_code)
-
- if (error_code)
- message(FATAL_ERROR "Could not find Windows SDK")
- endif()
-
- # Remove trailing newline
- string(REGEX REPLACE "\n$" "" WINDOWS_SDK "${WINDOWS_SDK}")
+ set(WINDOWS_SDK $ENV{WindowsSDKVersion})
+ string(REPLACE "\\" "" WINDOWS_SDK "${WINDOWS_SDK}")
set(${ret} ${WINDOWS_SDK} PARENT_SCOPE)
endfunction() \ No newline at end of file
diff --git a/scripts/cmake/vcpkg_install_cmake.cmake b/scripts/cmake/vcpkg_install_cmake.cmake
index 0ebff6961..ab72d054e 100644
--- a/scripts/cmake/vcpkg_install_cmake.cmake
+++ b/scripts/cmake/vcpkg_install_cmake.cmake
@@ -1,41 +1,25 @@
+## # vcpkg_install_cmake
+##
+## Build and install a cmake project.
+##
+## ## Usage:
+## ```cmake
+## vcpkg_install_cmake(...)
+## ```
+##
+## ## Parameters:
+## See [`vcpkg_build_cmake()`](vcpkg_build_cmake.md).
+##
+## ## Notes:
+## This command transparently forwards to [`vcpkg_build_cmake()`](vcpkg_build_cmake.md), adding a `TARGET install`
+## parameter.
+##
+## ## Examples:
+##
+## * [zlib](https://github.com/Microsoft/vcpkg/blob/master/ports/zlib/portfile.cmake)
+## * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake)
+## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake)
+## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake)
function(vcpkg_install_cmake)
- cmake_parse_arguments(_bc "MSVC_64_TOOLSET;DISABLE_PARALLEL" "" "" ${ARGN})
-
- set(MSVC_EXTRA_ARGS
- "/p:VCPkgLocalAppDataDisabled=true"
- "/p:UseIntelMKL=No"
- )
-
- # Specifies the architecture of the toolset, NOT the architecture of the produced binary
- # This can help libraries that cause the linker to run out of memory.
- # https://support.microsoft.com/en-us/help/2891057/linker-fatal-error-lnk1102-out-of-memory
- if (_bc_MSVC_64_TOOLSET)
- list(APPEND MSVC_EXTRA_ARGS "/p:PreferredToolArchitecture=x64")
- endif()
-
- if (NOT _bc_DISABLE_PARALLEL)
- list(APPEND MSVC_EXTRA_ARGS "/m")
- endif()
-
- if(EXISTS ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/build.ninja)
- set(BUILD_ARGS -v) # verbose output
- else()
- set(BUILD_ARGS ${MSVC_EXTRA_ARGS})
- endif()
-
- message(STATUS "Package ${TARGET_TRIPLET}-rel")
- vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} --build . --config Release --target install -- ${BUILD_ARGS}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
- LOGNAME package-${TARGET_TRIPLET}-rel
- )
- message(STATUS "Package ${TARGET_TRIPLET}-rel done")
-
- message(STATUS "Package ${TARGET_TRIPLET}-dbg")
- vcpkg_execute_required_process(
- COMMAND ${CMAKE_COMMAND} --build . --config Debug --target install -- ${BUILD_ARGS}
- WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
- LOGNAME package-${TARGET_TRIPLET}-dbg
- )
- message(STATUS "Package ${TARGET_TRIPLET}-dbg done")
+ vcpkg_build_cmake(LOGFILE_ROOT install TARGET install ${ARGN})
endfunction()
diff --git a/scripts/cmake/vcpkg_replace_string.cmake b/scripts/cmake/vcpkg_replace_string.cmake
new file mode 100644
index 000000000..3eb18d0bf
--- /dev/null
+++ b/scripts/cmake/vcpkg_replace_string.cmake
@@ -0,0 +1,14 @@
+#.rst:
+# .. command:: vcpkg_replace_string
+#
+# Replace a string in a file.
+#
+# ::
+# vcpkg_replace_string(filename match_string replace_string)
+#
+#
+function(vcpkg_replace_string filename match_string replace_string)
+ file(READ ${filename} _contents)
+ string(REPLACE "${match_string}" "${replace_string}" _contents "${_contents}")
+ file(WRITE ${filename} "${_contents}")
+endfunction()
diff --git a/scripts/fetchDependency.ps1 b/scripts/fetchDependency.ps1
deleted file mode 100644
index 98144bffa..000000000
--- a/scripts/fetchDependency.ps1
+++ /dev/null
@@ -1,242 +0,0 @@
-[CmdletBinding()]
-param(
- [string]$Dependency,
- [ValidateNotNullOrEmpty()]
- [string]$downloadPromptOverride = "0"
-)
-
-$downloadPromptOverride_NO_OVERRIDE= 0
-$downloadPromptOverride_DO_NOT_PROMPT = 1
-$downloadPromptOverride_ALWAYS_PROMPT = 2
-
-Import-Module BitsTransfer -Verbose:$false
-
-Write-Verbose "Fetching dependency: $Dependency"
-
-$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition
-$vcpkgRootDir = & $scriptsDir\findFileRecursivelyUp.ps1 $scriptsDir .vcpkg-root
-
-$downloadsDir = "$vcpkgRootDir\downloads"
-
-function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency)
-{
- function promptForDownload([string]$title, [string]$message, [string]$yesDescription, [string]$noDescription, [string]$downloadPromptOverride)
- {
- $do_not_prompt = ($downloadPromptOverride -eq $downloadPromptOverride_DO_NOT_PROMPT) -Or
- (Test-Path "$downloadsDir\AlwaysAllowEverything") -Or
- (Test-Path "$downloadsDir\AlwaysAllowDownloads")
-
- if (($downloadPromptOverride -ne $downloadPromptOverride_ALWAYS_PROMPT) -And $do_not_prompt)
- {
- return $true
- }
-
- $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", $yesDescription
- $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", $noDescription
- $AlwaysAllowDownloads = New-Object System.Management.Automation.Host.ChoiceDescription "&Always Allow Downloads", ($yesDescription + "(Future download prompts will not be displayed)")
-
- $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no, $AlwaysAllowDownloads)
- $result = $host.ui.PromptForChoice($title, $message, $options, 0)
-
- switch ($result)
- {
- 0 {return $true}
- 1 {return $false}
- 2 {
- New-Item "$downloadsDir\AlwaysAllowDownloads" -type file -force | Out-Null
- return $true
- }
- }
-
- throw "Unexpected result"
- }
-
-
- function performDownload( [Parameter(Mandatory=$true)][string]$Dependency,
- [Parameter(Mandatory=$true)][string]$url,
- [Parameter(Mandatory=$true)][string]$downloadDir,
- [Parameter(Mandatory=$true)][string]$downloadPath,
- [Parameter(Mandatory=$true)][string]$downloadVersion,
- [Parameter(Mandatory=$true)][string]$requiredVersion)
- {
- if (Test-Path $downloadPath)
- {
- return
- }
-
- $title = "Download " + $Dependency
- $message = ("No suitable version of " + $Dependency + " was found (requires $requiredVersion or higher). Download portable version?")
- $yesDescription = "Downloads " + $Dependency + " v" + $downloadVersion +" app-locally."
- $noDescription = "Does not download " + $Dependency + "."
-
- $userAllowedDownload = promptForDownload $title $message $yesDescription $noDescription $downloadPromptOverride
- if (!$userAllowedDownload)
- {
- throw [System.IO.FileNotFoundException] ("Could not detect suitable version of " + $Dependency + " and download not allowed")
- }
-
- if (!(Test-Path $downloadDir))
- {
- New-Item -ItemType directory -Path $downloadDir | Out-Null
- }
-
- if ($Dependency -ne "git") # git fails with BITS
- {
- try {
- $WC = New-Object System.Net.WebClient
- $ProxyAuth = !$WC.Proxy.IsBypassed($url)
- If($ProxyAuth){
- $ProxyCred = Get-Credential -Message "Enter credentials for Proxy Authentication"
- $PSDefaultParameterValues.Add("Start-BitsTransfer:ProxyAuthentication","Basic")
- $PSDefaultParameterValues.Add("Start-BitsTransfer:ProxyCredential",$ProxyCred)
- }
-
- Start-BitsTransfer -Source $url -Destination $downloadPath -ErrorAction Stop
- }
- catch [System.Exception] {
- # If BITS fails for any reason, delete any potentially partially downloaded files and continue
- if (Test-Path $downloadPath)
- {
- Remove-Item $downloadPath
- }
- }
- }
- if (!(Test-Path $downloadPath))
- {
- Write-Verbose("Downloading $Dependency...")
- (New-Object System.Net.WebClient).DownloadFile($url, $downloadPath)
- }
- }
-
- # Enums (without resorting to C#) are only available on powershell 5+.
- $ExtractionType_NO_EXTRACTION_REQUIRED = 0
- $ExtractionType_ZIP = 1
- $ExtractionType_SELF_EXTRACTING_7Z = 2
-
-
- # Using this to wait for the execution to finish
- function Invoke-Command()
- {
- param ( [string]$program = $(throw "Please specify a program" ),
- [string]$argumentString = "",
- [switch]$waitForExit )
-
- $psi = new-object "Diagnostics.ProcessStartInfo"
- $psi.FileName = $program
- $psi.Arguments = $argumentString
- $proc = [Diagnostics.Process]::Start($psi)
- if ( $waitForExit )
- {
- $proc.WaitForExit();
- }
- }
-
- function Expand-ZIPFile($file, $destination)
- {
- if (!(Test-Path $destination))
- {
- New-Item -ItemType Directory -Path $destination | Out-Null
- }
-
- $shell = new-object -com shell.application
- $zip = $shell.NameSpace($file)
- foreach($item in $zip.items())
- {
- # Piping to Out-Null is used to block until finished
- $shell.Namespace($destination).copyhere($item) | Out-Null
- }
- }
-
- if($Dependency -eq "cmake")
- {
- $requiredVersion = "3.8.0"
- $downloadVersion = "3.8.0"
- $url = "https://cmake.org/files/v3.8/cmake-3.8.0-win32-x86.zip"
- $downloadPath = "$downloadsDir\cmake-3.8.0-win32-x86.zip"
- $expectedDownloadedFileHash = "857fca00974ad6ac12fa042373d85ad1288770d4f09fbd99753c822df76b1c6c"
- $executableFromDownload = "$downloadsDir\cmake-3.8.0-win32-x86\bin\cmake.exe"
- $extractionType = $ExtractionType_ZIP
- $extractionFolder = $downloadsDir
- }
- elseif($Dependency -eq "nuget")
- {
- $requiredVersion = "3.3.0"
- $downloadVersion = "3.5.0"
- $url = "https://dist.nuget.org/win-x86-commandline/v3.5.0/nuget.exe"
- $downloadPath = "$downloadsDir\nuget-3.5.0\nuget.exe"
- $expectedDownloadedFileHash = "399ec24c26ed54d6887cde61994bb3d1cada7956c1b19ff880f06f060c039918"
- $executableFromDownload = $downloadPath
- $extractionType = $ExtractionType_NO_EXTRACTION_REQUIRED
- }
- elseif($Dependency -eq "git")
- {
- $requiredVersion = "2.0.0"
- $downloadVersion = "2.11.1"
- $url = "https://github.com/git-for-windows/git/releases/download/v2.11.1.windows.1/MinGit-2.11.1-32-bit.zip" # We choose the 32-bit version
- $downloadPath = "$downloadsDir\MinGit-2.11.1-32-bit.zip"
- $expectedDownloadedFileHash = "6ca79af09015625f350ef4ad74a75cfb001b340aec095b6963be9d45becb3bba"
- # There is another copy of git.exe in MinGit\bin. However, an installed version of git add the cmd dir to the PATH.
- # Therefore, choosing the cmd dir here as well.
- $executableFromDownload = "$downloadsDir\MinGit-2.11.1-32-bit\cmd\git.exe"
- $extractionType = $ExtractionType_ZIP
- $extractionFolder = "$downloadsDir\MinGit-2.11.1-32-bit"
- }
- else
- {
- throw "Unknown program requested"
- }
-
- $downloadSubdir = Split-path $downloadPath -Parent
- if (!(Test-Path $downloadSubdir))
- {
- New-Item -ItemType Directory -Path $downloadSubdir | Out-Null
- }
-
- performDownload $Dependency $url $downloadsDir $downloadPath $downloadVersion $requiredVersion
-
- #calculating the hash
- $hashAlgorithm = [Security.Cryptography.HashAlgorithm]::Create("SHA256")
- $fileAsByteArray = [io.File]::ReadAllBytes($downloadPath)
- $hashByteArray = $hashAlgorithm.ComputeHash($fileAsByteArray)
- $downloadedFileHash = -Join ($hashByteArray | ForEach {"{0:x2}" -f $_})
-
- if ($expectedDownloadedFileHash -ne $downloadedFileHash)
- {
- throw [System.IO.FileNotFoundException] ("Mismatching hash of the downloaded " + $Dependency)
- }
-
- if ($extractionType -eq $ExtractionType_NO_EXTRACTION_REQUIRED)
- {
- # do nothing
- }
- elseif($extractionType -eq $ExtractionType_ZIP)
- {
- if (-not (Test-Path $executableFromDownload)) # consider renaming the extraction folder to make sure the extraction finished
- {
- # Expand-Archive $downloadPath -dest "$extractionFolder" -Force # Requires powershell 5+
- Expand-ZIPFile -File $downloadPath -Destination $extractionFolder
- }
- }
- elseif($extractionType -eq $ExtractionType_SELF_EXTRACTING_7Z)
- {
- if (-not (Test-Path $executableFromDownload))
- {
- Invoke-Command $downloadPath "-y" -waitForExit:$true
- }
- }
- else
- {
- throw "Invalid extraction type"
- }
-
- if (-not (Test-Path $executableFromDownload))
- {
- throw [System.IO.FileNotFoundException] ("Could not detect or download " + $Dependency)
- }
-
- return $executableFromDownload
-}
-
-SelectProgram $Dependency
-
-Write-Verbose "Fetching dependency: $Dependency. Done."
diff --git a/scripts/findAnyMSBuildWithCppPlatformToolset.ps1 b/scripts/findAnyMSBuildWithCppPlatformToolset.ps1
deleted file mode 100644
index f72491e5d..000000000
--- a/scripts/findAnyMSBuildWithCppPlatformToolset.ps1
+++ /dev/null
@@ -1,164 +0,0 @@
-[CmdletBinding()]
-param(
- [Parameter(Mandatory=$False)]
- [switch]$DisableVS2017 = $False,
-
- [Parameter(Mandatory=$False)]
- [switch]$DisableVS2015 = $False
-)
-
-if ($DisableVS2017 -and $DisableVS2015)
-{
- throw "Both VS2015 and VS2017 were disabled."
-}
-
-function New-MSBuildInstance()
-{
- param ($msbuildExePath, $toolsetVersion)
-
- $instance = new-object PSObject
- $instance | add-member -type NoteProperty -Name msbuildExePath -Value $msbuildExePath
- $instance | add-member -type NoteProperty -Name toolsetVersion -Value $toolsetVersion
-
- return $instance
-}
-
-Write-Verbose "Executing $($MyInvocation.MyCommand.Name) with DisableVS2017=$DisableVS2017, DisableVS2015=$DisableVS2015"
-$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition
-
-$validInstances = New-Object System.Collections.ArrayList
-
-# VS2017
-Write-Verbose "`n`n"
-Write-Verbose "Checking for MSBuild from VS2017 instances..."
-$VisualStudio2017InstallationInstances = & $scriptsDir\findVisualStudioInstallationInstances.ps1
-Write-Verbose "VS2017 Candidates: $([system.String]::Join(',', $VisualStudio2017InstallationInstances))"
-foreach ($instanceCandidate in $VisualStudio2017InstallationInstances)
-{
- $VCFolder= "$instanceCandidate\VC\Tools\MSVC\"
-
- if (Test-Path $VCFolder)
- {
- $instance = New-MSBuildInstance "$instanceCandidate\MSBuild\15.0\Bin\MSBuild.exe" "v141"
- Write-Verbose "Found $instance"
- $validInstances.Add($instance) > $null
- }
-}
-
-# VS2015 - in Program Files
-Write-Verbose "`n`n"
-Write-Verbose "Checking for MSBuild from VS2015 in Program Files..."
-$CandidateProgramFiles = $(& $scriptsDir\getProgramFiles32bit.ps1), $(& $scriptsDir\getProgramFilesPlatformBitness.ps1)
-Write-Verbose "Program Files Candidate locations: $([system.String]::Join(',', $CandidateProgramFiles))"
-foreach ($ProgramFiles in $CandidateProgramFiles)
-{
- $clExe= "$ProgramFiles\Microsoft Visual Studio 14.0\VC\bin\cl.exe"
-
- if (!(Test-Path $clExe))
- {
- Write-Verbose "$clExe - Not Found"
- continue
- }
-
- Write-Verbose "$clExe - Found"
- $instance = New-MSBuildInstance "$ProgramFiles\MSBuild\14.0\Bin\MSBuild.exe" "v140"
- Write-Verbose "Found $instance"
- $validInstances.Add($instance) > $null
-}
-
-# VS2015 - through the registry
-function NewCppRegistryPair()
-{
- param ($visualStudioEntry, $msBuildEntry)
-
- $instance = new-object PSObject
- $instance | add-member -type NoteProperty -Name visualStudioEntry -Value $visualStudioEntry
- $instance | add-member -type NoteProperty -Name msBuildEntry -Value $msBuildEntry
-
- return $instance
-}
-
-Write-Verbose "`n`n"
-Write-Verbose "Checking for MSBuild from VS2015 through the registry..."
-
-$registryPairs =
-$(NewCppRegistryPair "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\visualstudio\14.0" "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\msbuild\toolsversions\14.0"),
-$(NewCppRegistryPair "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\visualstudio\14.0" "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\msbuild\toolsversions\14.0")
-
-foreach ($pair in $registryPairs)
-{
- $vsEntry = $pair.visualStudioEntry
- try
- {
- $VS14InstallDir = $(gp $vsEntry InstallDir -erroraction Stop | % { $_.InstallDir })
- Write-Verbose "$vsEntry\InstallDir - Found"
- }
- catch
- {
- Write-Verbose "$vsEntry\InstallDir - Not Found"
- continue
- }
-
- Write-Verbose "$VS14InstallDir - Obtained from registry"
- # We want "${VS14InstallDir}..\..\VC\bin\cl.exe"
- # Doing Split-path to avoid the ..\.. from appearing in the output
- $clExePath = Split-path $VS14InstallDir -Parent
- $clExePath = Split-path $clExePath -Parent
- $clExePath = "$clExePath\VC\bin\cl.exe"
-
- if (!(Test-Path $clExePath))
- {
- Write-Verbose "$clExePath - Not Found"
- continue
- }
-
- Write-Verbose "$clExePath - Found"
-
- $msbuildEntry = $pair.msBuildEntry
- try
- {
- $MSBuild14 = $(gp $msbuildEntry MSBuildToolsPath -erroraction Stop | % { $_.MSBuildToolsPath })
- Write-Verbose "$msbuildEntry\MSBuildToolsPath - Found"
- }
- catch
- {
- Write-Verbose "$msbuildEntry\MSBuildToolsPath - Not Found"
- continue
- }
-
- Write-Verbose "${MSBuild14} - Obtained from registry"
- $msbuildPath = "${MSBuild14}MSBuild.exe"
- if (!(Test-Path $msbuildPath))
- {
- Write-Verbose "$msbuildPath - Not Found"
- continue
- }
-
- $instance = New-MSBuildInstance $msbuildPath "v140"
- Write-Verbose "Found $instance"
- $validInstances.Add($instance) > $null
-}
-
-Write-Verbose "`n`n`n"
-Write-Verbose "The following MSBuild instances were found:"
-foreach ($instance in $validInstances)
-{
- Write-Verbose $instance
-}
-
-# Selecting
-foreach ($instance in $validInstances)
-{
- if (!$DisableVS2017 -and $instance.toolsetVersion -eq "v141")
- {
- return $instance.msbuildExePath, $instance.toolsetVersion
- }
-
- if (!$DisableVS2015 -and $instance.toolsetVersion -eq "v140")
- {
- return $instance.msbuildExePath, $instance.toolsetVersion
- }
-}
-
-
-throw "Could not find MSBuild version with C++ support. VS2015 or VS2017 (with C++) needs to be installed." \ No newline at end of file
diff --git a/scripts/findFileRecursivelyUp.ps1 b/scripts/findFileRecursivelyUp.ps1
deleted file mode 100644
index 4b6409e8c..000000000
--- a/scripts/findFileRecursivelyUp.ps1
+++ /dev/null
@@ -1,18 +0,0 @@
-[CmdletBinding()]
-param(
- [ValidateNotNullOrEmpty()]
- [Parameter(Mandatory=$true)][string]$startingDir,
- [ValidateNotNullOrEmpty()]
- [Parameter(Mandatory=$true)][string]$filename
-)
-
-$ErrorActionPreference = "Stop"
-$currentDir = $startingDir
-
-while (!($currentDir -eq "") -and !(Test-Path "$currentDir\$filename"))
-{
- Write-Verbose "Examining $currentDir for $filename"
- $currentDir = Split-path $currentDir -Parent
-}
-Write-Verbose "Examining $currentDir for $filename - Found"
-return $currentDir \ No newline at end of file
diff --git a/scripts/findVisualStudioInstallationInstances.ps1 b/scripts/findVisualStudioInstallationInstances.ps1
deleted file mode 100644
index 14bfc244b..000000000
--- a/scripts/findVisualStudioInstallationInstances.ps1
+++ /dev/null
@@ -1,35 +0,0 @@
-[CmdletBinding()]
-param(
-
-)
-
-$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition
-$vcpkgRootDir = & $scriptsDir\findFileRecursivelyUp.ps1 $scriptsDir .vcpkg-root
-
-$downloadsDir = "$vcpkgRootDir\downloads"
-
-$nugetexe = & $scriptsDir\fetchDependency.ps1 "nuget" 1
-$nugetPackageDir = "$downloadsDir\nuget-packages"
-
-$SetupAPIVersion = "1.8.24"
-Write-Verbose "Fetching Microsoft.VisualStudio.Setup.Configuration.Native@$SetupAPIVersion from NuGet."
-$nugetOutput = & $nugetexe install Microsoft.VisualStudio.Setup.Configuration.Native -Version $SetupAPIVersion -OutputDirectory $nugetPackageDir -Source "https://api.nuget.org/v3/index.json" -nocache 2>&1
-Write-Verbose "Fetching Microsoft.VisualStudio.Setup.Configuration.Native@$SetupAPIVersion from NuGet. Done."
-
-$SetupConsoleExe = "$nugetPackageDir\Microsoft.VisualStudio.Setup.Configuration.Native.$SetupAPIVersion\tools\x86\Microsoft.VisualStudio.Setup.Configuration.Console.exe"
-
-if (!(Test-Path $SetupConsoleExe))
-{
- throw $nugetOutput
-}
-
-$instances = & $SetupConsoleExe -nologo -value InstallationPath 2>&1
-$instanceCount = $instances.Length
-
-# The last item can be empty
-if ($instanceCount -gt 0 -and $instances[$instanceCount - 1] -eq "")
-{
- $instances = $instances[0..($instanceCount - 2)]
-}
-
-return $instances
diff --git a/scripts/getProgramFiles32bit.ps1 b/scripts/getProgramFiles32bit.ps1
deleted file mode 100644
index 6b71915b1..000000000
--- a/scripts/getProgramFiles32bit.ps1
+++ /dev/null
@@ -1,17 +0,0 @@
-[CmdletBinding()]
-param(
-
-)
-
-$out = ${env:PROGRAMFILES(X86)}
-if ($out -eq $null)
-{
- $out = ${env:PROGRAMFILES}
-}
-
-if ($out -eq $null)
-{
- throw "Could not find [Program Files 32-bit]"
-}
-
-return $out \ No newline at end of file
diff --git a/scripts/getProgramFilesPlatformBitness.ps1 b/scripts/getProgramFilesPlatformBitness.ps1
deleted file mode 100644
index 2be4c1137..000000000
--- a/scripts/getProgramFilesPlatformBitness.ps1
+++ /dev/null
@@ -1,17 +0,0 @@
-[CmdletBinding()]
-param(
-
-)
-
-$out = ${env:ProgramW6432}
-if ($out -eq $null)
-{
- $out = ${env:PROGRAMFILES}
-}
-
-if ($out -eq $null)
-{
- throw "Could not find [Program Files Platform Bitness]"
-}
-
-return $out \ No newline at end of file
diff --git a/scripts/getWindowsSDK.ps1 b/scripts/getWindowsSDK.ps1
deleted file mode 100644
index 7902707cb..000000000
--- a/scripts/getWindowsSDK.ps1
+++ /dev/null
@@ -1,102 +0,0 @@
-[CmdletBinding()]
-param(
- [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 "Executing $($MyInvocation.MyCommand.Name)"
-$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition
-
-$validInstances = New-Object System.Collections.ArrayList
-
-$CandidateProgramFiles = $(& $scriptsDir\getProgramFiles32bit.ps1), $(& $scriptsDir\getProgramFilesPlatformBitness.ps1)
-Write-Verbose "Program Files Candidate locations: $([system.String]::Join(',', $CandidateProgramFiles))"
-
-# Windows 10 SDK
-Write-Verbose "`n"
-Write-Verbose "Looking for Windows 10 SDK"
-foreach ($ProgramFiles in $CandidateProgramFiles)
-{
- $folder = "$ProgramFiles\Windows Kits\10\Include"
- if (!(Test-Path $folder))
- {
- Write-Verbose "$folder - Not Found"
- continue
- }
-
- 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
- }
-}
-
-# Windows 8.1 SDK
-Write-Verbose "`n"
-Write-Verbose "Looking for Windows 8.1 SDK"
-foreach ($ProgramFiles in $CandidateProgramFiles)
-{
- $folder = "$ProgramFiles\Windows Kits\8.1\Include"
- if (!(Test-Path $folder))
- {
- Write-Verbose "$folder - Not Found"
- continue
- }
-
- Write-Verbose "$folder - Found"
- $win81sdkVersionString = "8.1"
- Write-Verbose "Found $win81sdkVersionString"
- $validInstances.Add($win81sdkVersionString) > $null
-}
-
-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" \ No newline at end of file
diff --git a/scripts/get_triplet_environment.cmake b/scripts/get_triplet_environment.cmake
index 69e06bf97..bc79b16ce 100644
--- a/scripts/get_triplet_environment.cmake
+++ b/scripts/get_triplet_environment.cmake
@@ -5,4 +5,7 @@ message("c35112b6-d1ba-415b-aa5d-81de856ef8eb")
message("VCPKG_TARGET_ARCHITECTURE=${VCPKG_TARGET_ARCHITECTURE}")
message("VCPKG_CMAKE_SYSTEM_NAME=${VCPKG_CMAKE_SYSTEM_NAME}")
message("VCPKG_CMAKE_SYSTEM_VERSION=${VCPKG_CMAKE_SYSTEM_VERSION}")
-message("VCPKG_PLATFORM_TOOLSET=${VCPKG_PLATFORM_TOOLSET}") \ No newline at end of file
+message("VCPKG_PLATFORM_TOOLSET=${VCPKG_PLATFORM_TOOLSET}")
+message("VCPKG_VISUAL_STUDIO_PATH=${VCPKG_VISUAL_STUDIO_PATH}")
+message("VCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
+message("VCPKG_BUILD_TYPE=${VCPKG_BUILD_TYPE}")
diff --git a/scripts/ifw/maintenance.qs b/scripts/ifw/maintenance.qs
new file mode 100644
index 000000000..5cdad7225
--- /dev/null
+++ b/scripts/ifw/maintenance.qs
@@ -0,0 +1,46 @@
+// constructor
+function Component()
+{
+ installer.installationStarted.connect(this, Component.prototype.onInstallationStarted);
+}
+
+Component.prototype.onInstallationStarted = function()
+{
+ if (component.updateRequested() || component.installationRequested()) {
+ if (installer.value("os") == "win")
+ component.installerbaseBinaryPath = "@TargetDir@/tempmaintenancetool.exe";
+ installer.setInstallerBaseBinary(component.installerbaseBinaryPath);
+ }
+}
+
+Component.prototype.createOperations = function()
+{
+ // call the base createOperations
+ component.createOperations();
+
+ // only for windows online installer
+ if ( installer.value("os") == "win" && !installer.isOfflineOnly() )
+ {
+ // shortcut to add or remove packages
+ component.addOperation( "CreateShortcut",
+ "@TargetDir@/maintenancetool.exe",
+ "@StartMenuDir@/Manage vcpkg.lnk",
+ " --manage-packages");
+ // shortcut to update packages
+ component.addOperation( "CreateShortcut",
+ "@TargetDir@/maintenancetool.exe",
+ "@StartMenuDir@/Update vcpkg.lnk",
+ " --updater");
+ }
+
+ // create uninstall link only for windows
+ if (installer.value("os") == "win")
+ {
+ // shortcut to uninstaller
+ component.addOperation( "CreateShortcut",
+ "@TargetDir@/maintenancetool.exe",
+ "@StartMenuDir@/Uninstall vcpkg.lnk",
+ " --uninstall");
+ }
+}
+
diff --git a/scripts/internalCI.ps1 b/scripts/internalCI.ps1
deleted file mode 100644
index 151b664b8..000000000
--- a/scripts/internalCI.ps1
+++ /dev/null
@@ -1,25 +0,0 @@
-$ErrorActionPreference = "Stop"
-
-New-Item -type directory downloads -errorAction SilentlyContinue | Out-Null
-New-Item -type file downloads\AlwaysAllowDownloads -errorAction SilentlyContinue | Out-Null
-./scripts/bootstrap.ps1
-if (-not $?) { throw $? }
-
-# Clear out any intermediate files from the previous build
-Get-ChildItem buildtrees/*/* | ? Name -ne "src" | Remove-Item -Recurse -Force
-
-# Purge any outdated packages
-./vcpkg remove --outdated --recurse
-if (-not $?) { throw $? }
-
-./vcpkg.exe install azure-storage-cpp cpprestsdk:x64-windows-static cpprestsdk:x86-uwp
-if (-not $?) { throw $? }
-
-./vcpkg.exe install bond chakracore cryptopp zlib expat sdl2 curl sqlite3 libuv protobuf:x64-windows sfml opencv:x64-windows
-if (-not $?) { throw $? }
-
-./vcpkg.exe install opencv:x86-uwp boost:x86-uwp
-if (-not $?) { throw $? }
-
-# ./vcpkg.exe install folly:x64-windows
-# if (-not $?) { throw $? }
diff --git a/scripts/ports.cmake b/scripts/ports.cmake
index 9558ac2dc..ef06a4d65 100644
--- a/scripts/ports.cmake
+++ b/scripts/ports.cmake
@@ -32,8 +32,6 @@ endif()
if(CMD MATCHES "^BUILD$")
- string(REGEX REPLACE "([^-]*)-([^-]*)" "\\1" TRIPLET_SYSTEM_ARCH ${TARGET_TRIPLET})
-
set(CMAKE_TRIPLET_FILE ${VCPKG_ROOT_DIR}/triplets/${TARGET_TRIPLET}.cmake)
if(NOT EXISTS ${CMAKE_TRIPLET_FILE})
message(FATAL_ERROR "Unsupported target triplet. Triplet file does not exist: ${CMAKE_TRIPLET_FILE}")
@@ -70,6 +68,7 @@ if(CMD MATCHES "^BUILD$")
file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR} ${CURRENT_PACKAGES_DIR})
include(${CMAKE_TRIPLET_FILE})
+ set(TRIPLET_SYSTEM_ARCH ${VCPKG_TARGET_ARCHITECTURE})
include(${CURRENT_PORT_DIR}/portfile.cmake)
set(BUILD_INFO_FILE_PATH ${CURRENT_PACKAGES_DIR}/BUILD_INFO)
@@ -85,6 +84,9 @@ if(CMD MATCHES "^BUILD$")
if (DEFINED VCPKG_POLICY_ONLY_RELEASE_CRT)
file(APPEND ${BUILD_INFO_FILE_PATH} "PolicyOnlyReleaseCRT: ${VCPKG_POLICY_ONLY_RELEASE_CRT}\n")
endif()
+ if (DEFINED VCPKG_POLICY_ALLOW_OBSOLETE_MSVCRT)
+ file(APPEND ${BUILD_INFO_FILE_PATH} "PolicyAllowObsoleteMsvcrt: ${VCPKG_POLICY_ALLOW_OBSOLETE_MSVCRT}\n")
+ endif()
if (DEFINED VCPKG_POLICY_EMPTY_INCLUDE_FOLDER)
file(APPEND ${BUILD_INFO_FILE_PATH} "PolicyEmptyIncludeFolder: ${VCPKG_POLICY_EMPTY_INCLUDE_FOLDER}\n")
endif()
@@ -106,10 +108,12 @@ elseif(CMD MATCHES "^CREATE$")
message(STATUS "If this is not desired, delete the file and ${NATIVE_VCPKG_ROOT_DIR}\\ports\\${PORT}")
else()
include(vcpkg_download_distfile)
- file(DOWNLOAD ${URL} ${DOWNLOADS}/${FILENAME} STATUS error_code)
- if(NOT error_code MATCHES "0;")
- message(FATAL_ERROR "Error downloading file: ${error_code}")
- endif()
+ set(_VCPKG_INTERNAL_NO_HASH_CHECK "TRUE")
+ vcpkg_download_distfile(ARCHIVE
+ URLS ${URL}
+ FILENAME ${FILENAME}
+ )
+ set(_VCPKG_INTERNAL_NO_HASH_CHECK "FALSE")
endif()
file(SHA512 ${DOWNLOADS}/${FILENAME} SHA512)
diff --git a/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psd1 b/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psd1
new file mode 100644
index 000000000..3fb94fe7d
--- /dev/null
+++ b/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psd1
@@ -0,0 +1,31 @@
+@{
+
+# Script module or binary module file associated with this manifest.
+ModuleToProcess = 'posh-vcpkg.psm1'
+
+# Version number of this module.
+ModuleVersion = '0.0.1'
+
+# ID used to uniquely identify this module
+GUID = '948f02ab-fc99-4a53-8335-b6556eef129b'
+
+# Minimum version of the Windows PowerShell engine required by this module
+PowerShellVersion = '5.0'
+
+FunctionsToExport = @('TabExpansion')
+CmdletsToExport = @()
+VariablesToExport = @()
+AliasesToExport = @()
+
+# Private data to pass to the module specified in RootModule/ModuleToProcess.
+# This may also contain a PSData hashtable with additional module metadata used by PowerShell.
+PrivateData =
+@{
+ PSData =
+ @{
+ # Tags applied to this module. These help with module discovery in online galleries.
+ Tags = @('vcpkg', 'tab', 'tab-completion', 'tab-expansion', 'tabexpansion')
+ }
+}
+
+}
diff --git a/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psm1 b/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psm1
new file mode 100644
index 000000000..25ef99609
--- /dev/null
+++ b/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psm1
@@ -0,0 +1,39 @@
+param()
+
+if (Get-Module posh-vcpkg) { return }
+
+if ($PSVersionTable.PSVersion.Major -lt 5) {
+ Write-Warning ("posh-vcpkg does not support PowerShell versions before 5.0.")
+ return
+}
+
+if (Test-Path Function:\TabExpansion) {
+ Rename-Item Function:\TabExpansion VcpkgTabExpansionBackup
+}
+
+function TabExpansion($line, $lastWord) {
+ $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart()
+
+ switch -regex ($lastBlock) {
+ "^(?<vcpkgexe>(\./|\.\\|)vcpkg(\.exe|)) (?<remaining>.*)$"
+ {
+ & $matches['vcpkgexe'] autocomplete $matches['remaining']
+ return
+ }
+
+ # Fall back on existing tab expansion
+ default {
+ if (Test-Path Function:\VcpkgTabExpansionBackup) {
+ VcpkgTabExpansionBackup $line $lastWord
+ }
+ }
+ }
+}
+
+$exportModuleMemberParams = @{
+ Function = @(
+ 'TabExpansion'
+ )
+}
+
+Export-ModuleMember @exportModuleMemberParams
diff --git a/scripts/templates/portfile.in.cmake b/scripts/templates/portfile.in.cmake
index 2ea430453..e89ad4640 100644
--- a/scripts/templates/portfile.in.cmake
+++ b/scripts/templates/portfile.in.cmake
@@ -1,7 +1,7 @@
# Common Ambient Variables:
# CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT}
# CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET}
-# CURRENT_PORT DIR = ${VCPKG_ROOT_DIR}\ports\${PORT}
+# CURRENT_PORT_DIR = ${VCPKG_ROOT_DIR}\ports\${PORT}
# PORT = current port name (zlib, etc)
# TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc)
# VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic)
@@ -30,5 +30,4 @@ vcpkg_configure_cmake(
vcpkg_install_cmake()
# Handle copyright
-#file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/@PORT@)
-#file(RENAME ${CURRENT_PACKAGES_DIR}/share/@PORT@/LICENSE ${CURRENT_PACKAGES_DIR}/share/@PORT@/copyright) \ No newline at end of file
+# file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/@PORT@ RENAME copyright)
diff --git a/scripts/toolchains/android.cmake b/scripts/toolchains/android.cmake
new file mode 100644
index 000000000..2a37e4c39
--- /dev/null
+++ b/scripts/toolchains/android.cmake
@@ -0,0 +1,13 @@
+
+set(ANDROID_CPP_FEATURES "rtti exceptions" CACHE STRING "")
+set(CMAKE_SYSTEM_NAME Android CACHE STRING "")
+set(ANDROID_ABI x86_64 CACHE STRING "")
+set(ANDROID_TOOLCHAIN clang CACHE STRING "")
+set(ANDROID_NATIVE_API_LEVEL 21 CACHE STRING "")
+set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang CACHE STRING "")
+
+if(NOT EXISTS "$ENV{ProgramData}/Microsoft/AndroidNDK64/android-ndk-r13b/build/cmake/android.toolchain.cmake")
+ message(FATAL_ERROR "Could not find android ndk. Searched at $ENV{ProgramData}/Microsoft/AndroidNDK64/android-ndk-r13b")
+endif()
+
+include("$ENV{ProgramData}/Microsoft/AndroidNDK64/android-ndk-r13b/build/cmake/android.toolchain.cmake")
diff --git a/scripts/toolchains/freebsd.cmake b/scripts/toolchains/freebsd.cmake
new file mode 100644
index 000000000..bfeabe18b
--- /dev/null
+++ b/scripts/toolchains/freebsd.cmake
@@ -0,0 +1,4 @@
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD")
+ set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "")
+endif()
+set(CMAKE_SYSTEM_NAME FreeBSD CACHE STRING "")
diff --git a/scripts/toolchains/linux.cmake b/scripts/toolchains/linux.cmake
new file mode 100644
index 000000000..1ad180b4b
--- /dev/null
+++ b/scripts/toolchains/linux.cmake
@@ -0,0 +1,18 @@
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+ set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "")
+endif()
+set(CMAKE_SYSTEM_NAME Linux CACHE STRING "")
+
+get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
+if(NOT _CMAKE_IN_TRY_COMPILE)
+ set(CMAKE_CXX_FLAGS " ${VCPKG_CXX_FLAGS}" CACHE STRING "")
+ set(CMAKE_C_FLAGS " ${VCPKG_C_FLAGS}" CACHE STRING "")
+
+ set(CMAKE_CXX_FLAGS_DEBUG "${VCPKG_CXX_FLAGS_DEBUG}" CACHE STRING "")
+ set(CMAKE_C_FLAGS_DEBUG "${VCPKG_C_FLAGS_DEBUG}" CACHE STRING "")
+ set(CMAKE_CXX_FLAGS_RELEASE "${VCPKG_CXX_FLAGS_RELEASE}" CACHE STRING "")
+ set(CMAKE_C_FLAGS_RELEASE "${VCPKG_C_FLAGS_RELEASE}" CACHE STRING "")
+
+ set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${VCPKG_LINKER_FLAGS}" CACHE STRING "")
+ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${VCPKG_LINKER_FLAGS}" CACHE STRING "")
+endif()
diff --git a/scripts/toolchains/osx.cmake b/scripts/toolchains/osx.cmake
new file mode 100644
index 000000000..dd21f5264
--- /dev/null
+++ b/scripts/toolchains/osx.cmake
@@ -0,0 +1,4 @@
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+ set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "")
+endif()
+set(CMAKE_SYSTEM_NAME Darwin CACHE STRING "")
diff --git a/scripts/toolchains/windows.cmake b/scripts/toolchains/windows.cmake
new file mode 100644
index 000000000..266e023b1
--- /dev/null
+++ b/scripts/toolchains/windows.cmake
@@ -0,0 +1,32 @@
+get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
+if(NOT _CMAKE_IN_TRY_COMPILE)
+
+ if(VCPKG_CRT_LINKAGE STREQUAL "dynamic")
+ set(VCPKG_CRT_LINK_FLAG_PREFIX "/MD")
+ elseif(VCPKG_CRT_LINKAGE STREQUAL "static")
+ set(VCPKG_CRT_LINK_FLAG_PREFIX "/MT")
+ else()
+ message(FATAL_ERROR "Invalid setting for VCPKG_CRT_LINKAGE: \"${VCPKG_CRT_LINKAGE}\". It must be \"static\" or \"dynamic\"")
+ endif()
+
+ set(CHARSET_FLAG "/utf-8")
+ if(VCPKG_PLATFORM_TOOLSET MATCHES "v120")
+ # VS 2013 does not support /utf-8
+ set(CHARSET_FLAG)
+ endif()
+
+ set(CMAKE_CXX_FLAGS " /DWIN32 /D_WINDOWS /W3 ${CHARSET_FLAG} /GR /EHsc /MP ${VCPKG_CXX_FLAGS}" CACHE STRING "")
+ set(CMAKE_C_FLAGS " /DWIN32 /D_WINDOWS /W3 ${CHARSET_FLAG} /MP ${VCPKG_C_FLAGS}" CACHE STRING "")
+ set(CMAKE_RC_FLAGS "-c65001 /DWIN32" CACHE STRING "")
+
+ unset(CHARSET_FLAG)
+
+ set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG ${VCPKG_CRT_LINK_FLAG_PREFIX}d /Z7 /Ob0 /Od /RTC1 ${VCPKG_CXX_FLAGS_DEBUG}" CACHE STRING "")
+ set(CMAKE_C_FLAGS_DEBUG "/D_DEBUG ${VCPKG_CRT_LINK_FLAG_PREFIX}d /Z7 /Ob0 /Od /RTC1 ${VCPKG_C_FLAGS_DEBUG}" CACHE STRING "")
+ set(CMAKE_CXX_FLAGS_RELEASE "${VCPKG_CRT_LINK_FLAG_PREFIX} /O2 /Oi /Gy /DNDEBUG /Z7 ${VCPKG_CXX_FLAGS_RELEASE}" CACHE STRING "")
+ set(CMAKE_C_FLAGS_RELEASE "${VCPKG_CRT_LINK_FLAG_PREFIX} /O2 /Oi /Gy /DNDEBUG /Z7 ${VCPKG_C_FLAGS_RELEASE}" CACHE STRING "")
+
+ set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF ${VCPKG_LINKER_FLAGS}" CACHE STRING "")
+ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF ${VCPKG_LINKER_FLAGS}" CACHE STRING "")
+
+endif()
diff --git a/scripts/vcpkgTools.xml b/scripts/vcpkgTools.xml
new file mode 100644
index 000000000..9d5487577
--- /dev/null
+++ b/scripts/vcpkgTools.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<tools version="2">
+ <tool name="cmake" os="windows">
+ <version>3.10.2</version>
+ <exeRelativePath>cmake-3.10.2-win32-x86\bin\cmake.exe</exeRelativePath>
+ <url>https://cmake.org/files/v3.10/cmake-3.10.2-win32-x86.zip</url>
+ <sha512>9c16861a2ac09c7011b84f38459ecfec2829a9f825b254acbbde46d98f12f8ca0d4db3a6764758cb671507ee7c0327576d87658b81d7ddf1e8280b37569eb16d</sha512>
+ <archiveName>cmake-3.10.2-win32-x86.zip</archiveName>
+ </tool>
+ <tool name="cmake" os="osx">
+ <version>3.10.2</version>
+ <exeRelativePath>cmake-3.10.2-Darwin-x86_64/CMake.app/Contents/bin/cmake</exeRelativePath>
+ <url>https://cmake.org/files/v3.10/cmake-3.10.2-Darwin-x86_64.tar.gz</url>
+ <sha512>cb7d76e11c892eb786da5804282c4141564390c3552e08c506c7abb93015eb5f619c55255459872b219399ce8114ac321fe92df7f82a7e42bbc874eec240571e</sha512>
+ <archiveName>cmake-3.10.2-Darwin-x86_64.tar.gz</archiveName>
+ </tool>
+ <tool name="cmake" os="linux">
+ <version>3.10.2</version>
+ <exeRelativePath>cmake-3.10.2-Linux-x86_64/bin/cmake</exeRelativePath>
+ <url>https://cmake.org/files/v3.10/cmake-3.10.2-Linux-x86_64.tar.gz</url>
+ <sha512>54389b5cb3f3cb9d182d35e0b1eaf7b301695899930da0d26e9df1dc25056213a077646d23ea609a93daa81d30687757d9cf0dc263339fa3d73dbeb1284bc1a9</sha512>
+ <archiveName>cmake-3.10.2-Linux-x86_64.tar.gz</archiveName>
+ </tool>
+ <tool name="git" os="windows">
+ <version>2.17.0</version>
+ <exeRelativePath>cmd\git.exe</exeRelativePath>
+ <url>https://github.com/git-for-windows/git/releases/download/v2.17.0.windows.1/MinGit-2.17.0-32-bit.zip</url>
+ <sha512>a34575ab1b4f553e62535e38492904b512df4d6a837cf4abf205dbcdd05edf1eef450cc5b15a4f63f901424d5f3cd1f78b6b22437d0d4f8cd9ce4e42e82617b9</sha512>
+ <archiveName>MinGit-2.17.0-32-bit.zip</archiveName>
+ </tool>
+ <tool name="git" os="linux">
+ <version>2.7.4</version>
+ <exeRelativePath></exeRelativePath>
+ <url></url>
+ <sha512></sha512>
+ </tool>
+ <tool name="git" os="osx">
+ <version>2.7.4</version>
+ <exeRelativePath></exeRelativePath>
+ <url></url>
+ <sha512></sha512>
+ </tool>
+ <tool name="vswhere" os="windows">
+ <version>2.4.1</version>
+ <exeRelativePath>vswhere.exe</exeRelativePath>
+ <url>https://github.com/Microsoft/vswhere/releases/download/2.4.1/vswhere.exe</url>
+ <sha512>f477842d0cebefcd6bf9c6d536ab8ea20ec5b0aa967ee963ab6a101aeff9df8742ca600d35f39e2e7158d76d8231f1ed2bef6104dce84d2bf8d6b07d17d706a1</sha512>
+ </tool>
+ <tool name="nuget" os="windows">
+ <version>4.6.2</version>
+ <exeRelativePath>nuget.exe</exeRelativePath>
+ <url>https://dist.nuget.org/win-x86-commandline/v4.6.2/nuget.exe</url>
+ <sha512>60daea7bec2de23089f7ad73985dd788ac154171d6326c2c456726849b8f97dfc38cbdd9b9bf8d96aced009ccaaed317905b65c108e149cfbbbcdfb95f8f0519</sha512>
+ </tool>
+ <tool name="installerbase" os="windows">
+ <version>3.1.81</version>
+ <exeRelativePath>QtInstallerFramework-win-x86\bin\installerbase.exe</exeRelativePath>
+ <url>https://github.com/podsvirov/installer-framework/releases/download/cr203958-9/QtInstallerFramework-win-x86.zip</url>
+ <sha512>1f3e593270d7c2a4e271fdb49c637a2de462351310ef66bba298d30f6ca23365ec6aecf2e57799a00c873267cd3f92060ecac03eb291d42903d0e0869cd17c73</sha512>
+ <archiveName>QtInstallerFramework-win-x86.zip</archiveName>
+ </tool>
+ <tool name="7zip" os="windows">
+ <version>18.01.0</version>
+ <exeRelativePath>7-Zip.CommandLine.18.1.0\tools\7za.exe</exeRelativePath>
+ <url>https://www.nuget.org/api/v2/package/7-Zip.CommandLine/18.1.0</url>
+ <sha512>8c75314102e68d2b2347d592f8e3eb05812e1ebb525decbac472231633753f1d4ca31c8e6881a36144a8da26b2571305b3ae3f4e2b85fc4a290aeda63d1a13b8</sha512>
+ <archiveName>7-zip.commandline.18.1.0.nupkg</archiveName>
+ </tool>
+ <tool name="aria2" os="windows">
+ <version>18.01.0</version>
+ <exeRelativePath>aria2-1.33.1-win-32bit-build1\aria2c.exe</exeRelativePath>
+ <url>https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip</url>
+ <sha512>2456176ba3d506a07cf0cc4f61f080e1ff8cb4106426d66f354c5bb67a9a8720b5ddb26904275e61b1f623c932355f7dcde4cd17556cc895f11293c23c3a9bf3</sha512>
+ <archiveName>aria2-1.33.1-win-32bit-build1.zip</archiveName>
+ </tool>
+ <tool name="ninja" os="linux">
+ <version>1.8.2</version>
+ <exeRelativePath>ninja</exeRelativePath>
+ <url>https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip</url>
+ <sha512>38fcb68e745c1f15b4b50f20069ffe686b1ef5baf93b74958e132ea5d30d155cf6970d6dc1b095aafd421ebd8bcc63acf4f64e305c496266b5182f99b815cca5</sha512>
+ <archiveName>ninja-linux.zip</archiveName>
+ </tool>
+ <tool name="ninja" os="osx">
+ <version>1.8.2</version>
+ <exeRelativePath>ninja</exeRelativePath>
+ <url>https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-mac.zip</url>
+ <sha512>acadfb286eb7d93676629701917fa0c3c39f36daa068c169e4a098c29f97380d1ea95abfd42b04798ff118fd9dc93fdb250fcda36086bac20bc5506354214fc3</sha512>
+ <archiveName>ninja-mac.zip</archiveName>
+ </tool>
+</tools>