vcpkg/scripts/boost/generate-ports.ps1

826 lines
32 KiB
PowerShell

#requires -Version 6.2
# This script requires at least PowerShell 6.2, due to:
# - Set-Content UTF8 encoding doesn't add BOM anymore (since PS 6.0)
# - Join-String was added in PS 6.2
# As Windows 11 currently only ships PS 5.1, install the latest version!
# See https://aka.ms/PSWindows
[CmdletBinding()]
param (
$libraries = @(),
$version = '1.91.0',
# This script treats support statements as platform expressions. This is incorrect
# in a few cases e.g. boost-parameter-python not depending on boost-python for uwp since
# boost-python is not supported on uwp. Update $suppressPlatformForDependency as needed,
# don't blindly stage/commit changes containing platform expressions in dependencies.
$portsDir = $null,
$vcpkg = $null
)
$ErrorActionPreference = 'Stop'
$scriptsBoostDir = split-path -parent $MyInvocation.MyCommand.Definition
if ($null -eq $portsDir) {
$portsDir = "$scriptsBoostDir/../../ports"
}
if ($null -eq $vcpkg) {
$vcpkg = "$scriptsBoostDir/../../vcpkg"
if ($IsWindows) {
$vcpkg = "$vcpkg.exe"
}
}
# Beta builds contains a text in the version string
$semverVersion = ($version -replace '(\d+(\.\d+){1,3}).*', '$1')
# Clear this array when moving to a new boost version
$defaultPortVersion = 0
$portVersions = @{
'boost-cobalt' = 1
}
function Get-PortVersion {
param (
[string]$PortName
)
$nonDefault = $portVersions[$PortName]
if ($null -ne $nonDefault) {
return $nonDefault
}
return $defaultPortVersion
}
$portData = @{
'boost' = @{
'features' = @{
'mpi' = @{
'description' = 'Build with MPI support';
'dependencies' = @('boost-mpi', 'boost-graph-parallel', 'boost-property-map-parallel');
}
}
};
'boost-asio' = @{
'default-features' = @('deadline-timer'; @{ 'name' = 'spawn'; 'platform' = '!uwp & !emscripten' };);
'features' = @{
'ssl' = @{
'description' = 'Build with SSL support';
'dependencies' = @(@{ 'name' = 'openssl'; 'platform' = '!emscripten' });
};
'deadline-timer' = @{
'description' = 'Build with deadline_timer support';
'dependencies' = @('boost-date-time');
}
'spawn' = @{
'description' = 'Build with spawn (stackful coroutines) support';
'dependencies' = @(@{ 'name' = 'boost-context'; 'platform' = '!uwp & !emscripten' });
};
}
};
'boost-beast' = @{ 'supports' = '!emscripten' };
'boost-cmake' = @{ 'dependencies' = @(@{ 'name' = 'vcpkg-boost'; 'host' = $true }); };
'boost-cobalt' = @{
'supports' = '!uwp';
'features' = @{
'ssl' = @{
'description' = 'Build boost_cobalt_io_ssl';
'dependencies' = @('openssl');
}
}
};
'boost-context' = @{ 'supports' = '!uwp & !emscripten' };
'boost-coroutine' = @{ 'supports' = '!(arm & windows) & !uwp & !emscripten' };
'boost-dll' = @{ 'supports' = '!uwp' };
'boost-fiber' = @{
'supports' = '!uwp & !(arm & windows) & !emscripten';
'features' = @{
'numa' = @{
'description' = 'Enable NUMA support';
}
}
};
'boost-filesystem' = @{ 'supports' = '!uwp' };
'boost-geometry' = @{
'dependencies' = @('boost-crc', 'boost-program-options');
'supports' = '!uwp';
};
'boost-graph' = @{ 'supports' = '!uwp' };
'boost-graph-parallel' = @{
'dependencies' = @('mpi');
'supports' = '!uwp';
};
'boost-iostreams' = @{
'default-features' = @('bzip2', 'lzma', 'zlib', 'zstd');
'supports' = '!uwp';
'features' = @{
'bzip2' = @{
'description' = 'Support bzip2 filters';
'dependencies' = @('bzip2');
};
'lzma' = @{
'description' = 'Support LZMA/xz filters';
'dependencies' = @('liblzma');
};
'zlib' = @{
'description' = 'Support zlib filters';
'dependencies' = @('zlib');
};
'zstd' = @{
'description' = 'Support zstd filters';
'dependencies' = @('zstd');
};
};
};
'boost-locale' = @{
'dependencies' = @(@{ 'name' = 'libiconv'; 'platform' = '!uwp & !windows & !mingw' });
'supports' = '!uwp';
'features' = @{
'icu' = @{
'description' = 'ICU backend for Boost.Locale';
'dependencies' = @('icu');
}
}
};
'boost-log' = @{ 'supports' = '!uwp & !emscripten' };
'boost-math' = @{
'features' = @{
'legacy' = @{
'description' = 'Build the legacy C99 and TR1 libraries';
}
}
};
'boost-mpi' = @{
'dependencies' = @('mpi');
'supports' = '!uwp';
'features' = @{
'python3' = @{
'description' = 'Build Python3 bindings';
'supports' = '!static';
'dependencies' = @(@{ 'name' = 'boost-python'; 'platform' = '!uwp & !emscripten & !ios & !android' }, 'python3');
}
}
};
'boost-mqtt5' = @{ 'supports' = '!uwp' };
'boost-mysql' = @{ 'dependencies' = @('openssl'); };
'boost-odeint' = @{
'features' = @{
'mpi' = @{
'description' = 'Support parallelization with MPI';
'dependencies' = @('boost-mpi');
}
}
};
'boost-process' = @{ 'supports' = '!uwp & !emscripten & !android' };
'boost-python' = @{ 'supports' = '!uwp & !emscripten & !ios & !android'; 'dependencies' = @('python3');};
'boost-random' = @{ 'supports' = '!uwp' };
'boost-regex' = @{
'features' = @{
'icu' = @{
'description' = 'ICU backend for Boost.Regex';
'dependencies' = @('icu');
}
}
}
'boost-stacktrace' = @{
'default-features' = @(@{ 'name' = 'backtrace'; 'platform' = '!windows' }; @{ 'name' = 'windbg'; 'platform' = 'windows' });
'supports' = '!uwp';
'features' = @{
'backtrace' = @{
'description' = 'Use boost_stacktrace_backtrace';
'supports' = '!windows';
'dependencies' = @(@{ 'name' = 'libbacktrace'; 'platform' = '!windows' });
};
'windbg' = @{
'description' = 'Use boost_stacktrace_windbg';
'supports' = 'windows';
};
}
};
'boost-test' = @{ 'supports' = '!uwp' };
'boost-wave' = @{ 'supports' = '!uwp' };
}
# For some dependent ports (LHS), the dependency's [RHS] "supports" is enough,
# and no "platform" field shall be added to the dependency.
$suppressPlatformForDependency = @{
'boost-coroutine2' = @('boost-context');
'boost-dll' = @('boost-filesystem');
'boost-process' = @('boost-filesystem');
'boost-geometry' = @('boost-graph');
'boost-graph' = @('boost-random');
'boost-graph-parallel' = @('boost-filesystem', 'boost-graph', 'boost-mpi', 'boost-random');
'boost-log' = @('boost-filesystem');
'boost-mpi' = @('boost-graph');
'boost-mqtt5' = @('boost-random');
'boost-parameter-python' = @('boost-python');
'boost-property-map-parallel' = @('boost-mpi');
'boost-python' = @('boost-graph');
'boost-wave' = @('boost-filesystem');
}
# boost/static_assert.hpp is provided by Boost.Config in 1.91.0.
# However, these Boost libraries still link the CMake target
# Boost::static_assert in their upstream CMakeLists.txt, so they still need
# boost-static-assert to provide boost_static_assertConfig.cmake.
$staticAssertCMakeTargetUsers = @(
'contract',
'date_time',
'geometry',
'graph',
'icl',
'program_options',
'python',
'serialization',
'spirit',
'variant',
'wave'
)
function GeneratePortName() {
param (
[string]$Library
)
'boost-' + ($Library -replace '_', '-')
}
function GeneratePortHash() {
param (
[string]$Archive
)
$hash = & $vcpkg --x-wait-for-lock hash $Archive
# Remove prefix "Waiting to take filesystem lock on <path>/.vcpkg-root... "
if ($hash -is [Object[]]) {
$hash = $hash[1]
}
return $hash
}
function GetPortDocumentation() {
param (
[string]$Library
)
# Null value means no explicit documentation site
$specicalDocumentationPaths = @{
'build' = $null;
'cmake' = $null;
'headers' = $null;
'interval' = 'https://www.boost.org/libs/numeric/interval';
'logic' = 'https://www.boost.org/libs/logictribool';
'numeric_conversion' = 'https://www.boost.org/libs/numeric/conversion';
'odeint' = 'https://www.boost.org/libs/numeric/odeint';
'ublas' = 'https://www.boost.org/libs/numeric/ublas';
}
if ($specicalDocumentationPaths.ContainsKey($Library)) {
$documentationPath = $specicalDocumentationPaths[$Library]
} else {
$documentationPath = "https://www.boost.org/libs/$Library"
}
return $documentationPath
}
function GetPortHomepage() {
param (
[string]$Library
)
$specicalHomepagePaths = @{
'build' = 'https://github.com/boostorg/build';
'cmake' = 'https://github.com/boostorg/cmake';
'headers' = 'https://github.com/boostorg/headers';
'interval' = 'https://www.boost.org/library/latest/numericinterval/';
'logic' = 'https://www.boost.org/library/latest/logictribool/';
'numeric_conversion' = 'https://www.boost.org/library/latest/numericconversion/';
'odeint' = 'https://www.boost.org/library/latest/numericodeint/';
'ublas' = 'https://www.boost.org/library/latest/numericublas/';
}
if ($specicalHomepagePaths.ContainsKey($Library)) {
$homepagePath = $specicalHomepagePaths[$Library]
} else {
$homepagePath = "https://www.boost.org/library/latest/$Library/"
}
return $homepagePath
}
function GeneratePortDependency() {
param (
[string]$Library = '',
[string]$PortName = '',
[string]$ForLibrary = ''
)
if ($PortName -eq '') {
$PortName = GeneratePortName $Library
}
$forPortName = GeneratePortName $ForLibrary
if ($suppressPlatformForDependency.Contains($forPortName) -and $suppressPlatformForDependency[$forPortName].Contains($PortName)) {
$PortName
}
elseif ($portData.Contains($PortName) -and $portData[$PortName].Contains('supports')) {
@{name = $PortName; platform = $portData[$PortName]['supports'] }
}
elseif ($ForLibrary -eq '' -and $suppressPlatformForDependency.Contains($PortName)) {
# For 'boost'.
$platform = $suppressPlatformForDependency[$PortName] `
| ForEach-Object { (GeneratePortDependency -PortName $_).platform } `
| Group-Object -NoElement `
| Join-String -Property Name -Separator ' & '
if ($platform -ne '') {
@{name = $PortName; platform = $platform }
}
else {
$PortName
}
}
else {
$PortName
}
}
function AddBoostVersionConstraints() {
param (
$Dependencies = @()
)
$updatedDependencies = @()
foreach ($dependency in $Dependencies) {
if ($dependency.Contains('name')) {
if ($dependency.name.StartsWith('boost')) {
$dependency['version>='] = $semverVersion
}
}
else {
if ($dependency.StartsWith('boost')) {
$dependency = @{
'name' = $dependency
'version>=' = $semverVersion
}
}
}
$updatedDependencies += $dependency
}
$updatedDependencies
}
function GeneratePortManifest() {
param (
[string]$PortName,
[string]$Homepage,
[string]$Documentation,
[string]$Description,
[string]$License,
$Dependencies = @()
)
$manifest = @{
'$comment' = 'Automatically generated by scripts/boost/generate-ports.ps1'
'name' = $PortName
'homepage' = $Homepage
'description' = $Description
}
if ($Documentation) {
$manifest['documentation'] = $Documentation
}
if ($version -eq $semverVersion) {
$manifest['version'] = $version
}
else {
$manifest['version-string'] = $version
}
if ($License) {
$manifest['license'] += $License
}
if ($portData.Contains($PortName)) {
$manifest += $portData[$PortName]
}
$thisPortVersion = Get-PortVersion $PortName
if ($thisPortVersion -ne 0) {
$manifest['port-version'] = $thisPortVersion
}
if ($Dependencies.Count -gt 0) {
$manifest['dependencies'] += $Dependencies
}
# Remove from the dependencies the ports that are included in the feature dependencies
if ($manifest.Contains('features') -and $manifest.Contains('dependencies')) {
foreach ($feature in $manifest.features.Keys) {
$feature_dependencies = $manifest.features.$feature['dependencies']
foreach ($dependency in $feature_dependencies) {
if ($dependency.Contains('name')) {
$dep_name = $dependency.name
}
else {
$dep_name = $dependency
}
$manifest['dependencies'] = $manifest['dependencies'] `
| Where-Object {
if ($_.Contains('name')) {
$_.name -notmatch "$dep_name"
}
else {
$_ -notmatch "$dep_name"
}
}
}
}
}
# Add version constraints to boost dependencies
$manifest['dependencies'] = @(AddBoostVersionConstraints $manifest['dependencies'])
foreach ($feature in $manifest.features.Keys) {
$manifest.features.$feature['dependencies'] = @(AddBoostVersionConstraints $manifest.features.$feature['dependencies'])
}
$manifest | ConvertTo-Json -Depth 10 -Compress `
| Out-File -Encoding UTF8 "$portsDir/$PortName/vcpkg.json"
& $vcpkg format-manifest "$portsDir/$PortName/vcpkg.json"
}
function GeneratePort() {
param (
[string]$Library,
[string]$Archive,
[bool]$NeedsBuild = $true,
$Dependencies = @()
)
$portName = GeneratePortName $Library
$portHash = GeneratePortHash $Archive
$homepage = GetPortHomepage $Library
$documentation = GetPortDocumentation $Library
New-Item -ItemType 'Directory' "$portsDir/$portName" -erroraction SilentlyContinue | out-null
# Generate vcpkg.json
GeneratePortManifest `
-PortName $portName `
-Homepage $homepage `
-Documentation $documentation `
-Description "Boost $Library module" `
-License 'BSL-1.0' `
-Dependencies $Dependencies
$portfileLines = @(
'# Automatically generated by scripts/boost/generate-ports.ps1'
''
)
if (Test-Path "$scriptsBoostDir/pre-source-stubs/$Library.cmake") {
$portfileLines += @(
Get-Content "$scriptsBoostDir/pre-source-stubs/$Library.cmake"
''
)
}
$portfileLines += @(
"vcpkg_from_github(",
" OUT_SOURCE_PATH SOURCE_PATH",
" REPO boostorg/$Library",
" REF boost-`${VERSION}",
" SHA512 $portHash",
" HEAD_REF master"
)
[string[]]$patches = @()
$patches += Get-ChildItem -Path "$portsDir/$portName/*" -Name -Include @('*.patch', '*.diff')
if (Test-Path "$scriptsBoostDir/patch-stubs/$Library.txt") {
$patches += Get-Content "$scriptsBoostDir/patch-stubs/$Library.txt"
}
if ($patches.Length -ne 0) {
$portfileLines += @(' PATCHES')
foreach ($patch in $patches) {
$portfileLines += " $patch"
}
}
$portfileLines += @(
')'
''
)
if (Test-Path "$scriptsBoostDir/post-source-stubs/$Library.cmake") {
$portfileLines += @(Get-Content "$scriptsBoostDir/post-source-stubs/$Library.cmake")
}
if ($NeedsBuild) {
$portfileLines += @(
'set(FEATURE_OPTIONS "")'
)
if (Test-Path "$portsDir/$portName/features.cmake") {
$portfileLines += @(
'include("${CMAKE_CURRENT_LIST_DIR}/features.cmake")'
)
}
if (Test-Path "$scriptsBoostDir/pre-build-stubs/$Library.cmake") {
$portfileLines += Get-Content "$scriptsBoostDir/pre-build-stubs/$Library.cmake"
}
$portfileLines += @(
'boost_configure_and_install('
' SOURCE_PATH "${SOURCE_PATH}"'
' OPTIONS ${FEATURE_OPTIONS}'
')'
)
if (Test-Path "$scriptsBoostDir/post-build-stubs/$Library.cmake") {
$portfileLines += @(Get-Content "$scriptsBoostDir/post-build-stubs/$Library.cmake")
}
}
$portfileLines += @("")
Set-Content -LiteralPath "$portsDir/$portName/portfile.cmake" `
-Value "$($portfileLines -join "`n")" `
-Encoding UTF8 `
-NoNewline
}
if (!(Test-Path "$scriptsBoostDir/boost")) {
'Cloning boost...'
Push-Location $scriptsBoostDir
try {
git clone https://github.com/boostorg/boost --branch boost-$version
}
finally {
Pop-Location
}
}
else {
Push-Location $scriptsBoostDir/boost
try {
git fetch
git checkout -f boost-$version
}
finally {
Pop-Location
}
}
$foundLibraries = Get-ChildItem $scriptsBoostDir/boost/libs -directory | ForEach-Object name | ForEach-Object {
if ($_ -eq 'numeric') {
'numeric_conversion'
'interval'
'odeint'
'ublas'
}
else {
$_.ToString()
}
}
$tools = @('build', 'cmake')
$foundLibraries += $tools
$foundLibraries = $foundLibraries | Sort-Object
$updateServicePorts = $false
if ($libraries.Length -eq 0) {
$libraries = $foundLibraries
$updateServicePorts = $true
}
$downloads = "$scriptsBoostDir/../../downloads"
New-Item -ItemType 'Directory' $downloads -erroraction SilentlyContinue | out-null
$boostPortDependencies = @()
foreach ($library in $libraries) {
$archive = "$downloads/boostorg-$library-boost-$version.tar.gz"
"Handling boost/$library... $archive"
if (!(Test-Path $archive)) {
"Downloading boost/$library..."
Invoke-WebRequest -Uri "https://github.com/boostorg/$library/archive/boost-$version.tar.gz" -OutFile "$archive"
"Downloaded boost/$library..."
}
$unpacked = "$scriptsBoostDir/libs/$library-boost-$version"
if (!(Test-Path $unpacked)) {
"Unpacking boost/$library..."
New-Item -ItemType 'Directory' $scriptsBoostDir/libs -erroraction SilentlyContinue | out-null
Push-Location $scriptsBoostDir/libs
try {
cmake -E tar xf $archive
}
finally {
Pop-Location
}
}
Push-Location $unpacked
try {
$usedLibraries = Get-ChildItem -Recurse -Path include, src -File `
| Where-Object { $_ -is [System.IO.FileInfo] } `
| ForEach-Object {
Write-Verbose "${library}: processing file: $_"
Get-Content -LiteralPath $_.FullName
} `
| Where-Object {
$_ -match ' *# *include *[<"]boost\/'
} `
| ForEach-Object {
# Extract path from the line
Write-Verbose '${library}: processing line: $_'
$_ -replace ' *# *include *[<"]boost\/([a-zA-Z0-9\.\-_\/]*)[>"].*', '$1'
}`
| ForEach-Object {
# Map the path to the library name
Write-Verbose "${library}: processing path: $_"
if ($_ -match '^detail\/winapi\/') { 'winapi' }
elseif ($_ -eq 'detail/algorithm.hpp') { 'graph' }
elseif ($_ -eq 'detail/atomic_count.hpp') { 'smart_ptr' }
elseif ($_ -eq 'detail/basic_pointerbuf.hpp') { 'lexical_cast' }
elseif ($_ -eq 'detail/call_traits.hpp') { 'utility' }
elseif ($_ -eq 'detail/compressed_pair.hpp') { 'utility' }
elseif ($_ -eq 'detail/interlocked.hpp') { 'winapi' }
elseif ($_ -eq 'detail/iterator.hpp') { 'core' }
elseif ($_ -eq 'detail/lcast_precision.hpp') { 'lexical_cast' }
elseif ($_ -eq 'detail/lightweight_mutex.hpp') { 'smart_ptr' }
elseif ($_ -eq 'detail/lightweight_test.hpp') { 'core' }
elseif ($_ -eq 'detail/lightweight_thread.hpp') { 'smart_ptr' }
elseif ($_ -eq 'detail/no_exceptions_support.hpp') { 'core' }
elseif ($_ -eq 'detail/scoped_enum_emulation.hpp') { 'core' }
elseif ($_ -eq 'detail/sp_typeinfo.hpp') { 'core' }
elseif ($_ -eq 'detail/ob_compressed_pair.hpp') { 'utility' }
elseif ($_ -eq 'detail/quick_allocator.hpp') { 'smart_ptr' }
elseif ($_ -eq 'detail/workaround.hpp') { 'config' }
elseif ($_ -match '^functional\/hash\/') { 'container_hash' }
elseif ($_ -eq 'functional/hash.hpp') { 'container_hash' }
elseif ($_ -eq 'functional/hash_fwd.hpp') { 'container_hash' }
elseif ($_ -match '^graph\/distributed\/') { 'graph_parallel' }
elseif ($_ -match '^graph\/parallel\/') { 'graph_parallel' }
elseif ($_ -eq 'graph/accounting.hpp') { 'graph_parallel' }
elseif ($_ -eq 'exception/exception.hpp') { 'throw_exception' }
elseif ($_ -match '^numeric\/conversion\/') { 'numeric_conversion' }
elseif ($_ -match '^numeric\/interval\/') { 'interval' }
elseif ($_ -match '^numeric\/odeint\/') { 'odeint' }
elseif ($_ -match '^numeric\/ublas\/') { 'ublas' }
elseif ($_ -eq 'numeric/interval.hpp') { 'interval' }
elseif ($_ -eq 'numeric/odeint.hpp') { 'odeint' }
elseif ($_ -match '^parameter\/aux_\/python\/') { 'parameter_python' }
elseif ($_ -eq 'parameter/python.hpp') { 'parameter_python' }
elseif ($_ -eq 'pending/detail/disjoint_sets.hpp') { 'graph' }
elseif ($_ -eq 'pending/detail/int_iterator.hpp') { 'iterator' }
elseif ($_ -eq 'pending/detail/property.hpp') { 'graph' }
elseif ($_ -eq 'pending/bucket_sorter.hpp') { 'graph' }
elseif ($_ -eq 'pending/container_traits.hpp') { 'graph' }
elseif ($_ -eq 'pending/disjoint_sets.hpp') { 'graph' }
elseif ($_ -eq 'pending/fenced_priority_queue.hpp') { 'graph' }
elseif ($_ -eq 'pending/fibonacci_heap.hpp') { 'graph' }
elseif ($_ -eq 'pending/indirect_cmp.hpp') { 'graph' }
elseif ($_ -eq 'pending/integer_log2.hpp') { 'integer' }
elseif ($_ -eq 'pending/is_heap.hpp') { 'graph' }
elseif ($_ -eq 'pending/iterator_adaptors.hpp') { 'iterator' }
elseif ($_ -eq 'pending/iterator_tests.hpp') { 'iterator' }
elseif ($_ -eq 'pending/mutable_heap.hpp') { 'graph' }
elseif ($_ -eq 'pending/mutable_queue.hpp') { 'graph' }
elseif ($_ -eq 'pending/property.hpp') { 'graph' }
elseif ($_ -eq 'pending/property_serialize.hpp') { 'graph' }
elseif ($_ -eq 'pending/queue.hpp') { 'graph' }
elseif ($_ -eq 'pending/relaxed_heap.hpp') { 'graph' }
elseif ($_ -eq 'pending/stringtok.hpp') { 'graph' }
elseif ($_ -match '^property_map\/parallel\/') { 'property_map_parallel' }
elseif ($_ -eq 'utility/addressof.hpp') { 'core' }
elseif ($_ -eq 'utility/declval.hpp') { 'type_traits' }
elseif ($_ -eq 'utility/enable_if.hpp') { 'core' }
elseif ($_ -eq 'utility/explicit_operator_bool.hpp') { 'core' }
elseif ($_ -eq 'utility/swap.hpp') { 'core' }
# Extract first directory name or file name from the path
else { $_ -replace '([a-zA-Z0-9\.\-_]*).*', '$1' }
} `
| ForEach-Object {
# Map directory/file name to the library name
Write-Verbose "${library}: processing name: $_"
if ($_ -eq 'current_function.hpp') { 'assert' }
elseif ($_ -eq 'memory_order.hpp') { 'atomic' }
elseif ($_ -match 'is_placeholder.hpp|mem_fn.hpp') { 'bind' }
elseif ($_ -eq 'circular_buffer_fwd.hpp') { 'circular_buffer' }
elseif ($_ -match '^concept$|concept_archetype.hpp') { 'concept_check' }
elseif ($_ -match 'cstdint.hpp|cxx11_char_types.hpp|limits.hpp|version.hpp|static_assert.hpp') { 'config' }
elseif ($_ -eq 'contract_macro.hpp') { 'contract' }
elseif ($_ -match 'implicit_cast.hpp|polymorphic_cast.hpp|polymorphic_pointer_cast.hpp') { 'conversion' }
elseif ($_ -eq 'make_default.hpp') { 'convert' }
elseif ($_ -match 'checked_delete.hpp|get_pointer.hpp|iterator.hpp|non_type.hpp|noncopyable.hpp|ref.hpp|swap.hpp|type.hpp|visit_each.hpp') { 'core' }
elseif ($_ -match 'blank.hpp|blank_fwd.hpp|cstdlib.hpp') { 'detail' }
elseif ($_ -eq 'dynamic_bitset_fwd.hpp') { 'dynamic_bitset' }
elseif ($_ -eq 'exception_ptr.hpp') { 'exception' }
elseif ($_ -eq 'foreach_fwd.hpp') { 'foreach' }
elseif ($_ -eq 'function_equal.hpp') { 'function' }
elseif ($_ -match 'integer_fwd.hpp|integer_traits.hpp') { 'integer' }
elseif ($_ -eq 'io_fwd.hpp') { 'io' }
elseif ($_ -match 'function_output_iterator.hpp|generator_iterator.hpp|indirect_reference.hpp|iterator_adaptors.hpp|next_prior.hpp|pointee.hpp|shared_container_iterator.hpp') { 'iterator' }
elseif ($_ -match 'cstdfloat.hpp|math_fwd.hpp') { 'math' }
elseif ($_ -match 'multi_index_container.hpp|multi_index_container_fwd.hpp') { 'multi_index' }
elseif ($_ -eq 'cast.hpp') { 'numeric_conversion' }
elseif ($_ -match 'none.hpp|none_t.hpp') { 'optional' }
elseif ($_ -eq 'qvm_lite.hpp') { 'qvm' }
elseif ($_ -eq 'nondet_random.hpp') { 'random' }
elseif ($_ -match 'cregex.hpp|regex_fwd.hpp') { 'regex' }
elseif ($_ -eq 'archive') { 'serialization' }
elseif ($_ -match 'last_value.hpp|signal.hpp') { 'signals' }
elseif ($_ -match 'enable_shared_from_this.hpp|intrusive_ptr.hpp|make_shared.hpp|make_unique.hpp|pointer_cast.hpp|pointer_to_other.hpp|scoped_array.hpp|scoped_ptr.hpp|shared_array.hpp|shared_ptr.hpp|weak_ptr.hpp') { 'smart_ptr' }
elseif ($_ -eq 'cerrno.hpp') { 'system' }
elseif ($_ -eq 'progress.hpp') { 'timer' }
elseif ($_ -match 'token_functions.hpp|token_iterator.hpp') { 'tokenizer' }
elseif ($_ -match 'aligned_storage.hpp') { 'type_traits' }
elseif ($_ -match 'unordered_map.hpp|unordered_set.hpp') { 'unordered' }
elseif ($_ -match 'call_traits.hpp|compressed_pair.hpp|operators.hpp|operators_v1.hpp') { 'utility' }
# By dafault use the name as is, just remove the file extension if available
else { $_ -replace '\.hp?p?', '' }
} `
| Where-Object {
$_ -ne $library
} `
| Group-Object -NoElement | ForEach-Object Name
' [known] ' + $($usedLibraries | Where-Object { $foundLibraries -contains $_ })
'[unknown] ' + $($usedLibraries | Where-Object { $foundLibraries -notcontains $_ })
$deps = @($usedLibraries | Where-Object { $foundLibraries -contains $_ })
# Remove optional dependencies
$deps = @($deps `
| Where-Object {
# Boost.SmartPtr is not linked by default
# See https://github.com/apolukhin/Boost.DLL/blob/develop/CMakeLists.txt
-not ($library -eq 'dll' -and $_ -eq 'smart_ptr')
} `
| Where-Object {
# Boost.Filesystem only used for tests or examples
# See https://github.com/boostorg/gil#requirements
-not ($library -eq 'gil' -and $_ -eq 'filesystem')
} `
| Where-Object {
# Note that Boost.Pfr is not listed because it's a peer dependency
# See CMakeLists.txt
-not ($library -eq 'mysql' -and $_ -eq 'pfr')
} `
| Where-Object {
# Boost.Beast only used for MQTT connections over WebSocket
# See CMakeLists.txt
-not ($library -eq 'mqtt5' -and $_ -eq 'beast')
}
)
# Remove cyclic dependencies
$deps = @($deps `
| Where-Object {
-not ($library -eq 'graph' -and $_ -eq 'geometry')
}
)
$needsBuild = $true
if ($tools -contains $library) {
$needsBuild = $false
$deps += @('uninstall')
}
else {
$deps += @('cmake')
if ($library -ne 'headers') {
$deps += @('headers')
if ($library -ne 'config') {
# Note: CMake's built-in finder (FindBoost.cmake) looks for Boost header files (boost/version.h or boost/config.h)
# and stores the result in the Boost_INCLUDE_DIR variable. The files boost/version.h or boost/config.h are owned by the config library.
# Without these files, the Boost_INCLUDE_DIR variable will not be set and the Boost version will not be detected.
$deps += @('config')
}
}
$boostPortDependencies += @(GeneratePortDependency $library)
}
if ($staticAssertCMakeTargetUsers -contains $library) {
$deps += 'static_assert'
}
$deps = $deps | Select-Object -Unique
$deps = @($deps | ForEach-Object { GeneratePortDependency $_ -ForLibrary $library })
GeneratePort `
-Library $library `
-Archive $archive `
-NeedsBuild $needsBuild `
-Dependencies $deps
}
finally {
Pop-Location
}
}
if ($updateServicePorts) {
# Generate manifest file for master boost port which depends on each individual library
GeneratePortManifest `
-PortName 'boost' `
-Homepage 'https://boost.org' `
-Description 'Peer-reviewed portable C++ source libraries' `
-License 'BSL-1.0' `
-Dependencies $boostPortDependencies
Set-Content -LiteralPath "$portsDir/boost/portfile.cmake" `
-Value "set(VCPKG_POLICY_EMPTY_PACKAGE enabled)`n" `
-Encoding UTF8 `
-NoNewline
# Generate manifest files for boost-uninstall
GeneratePortManifest `
-PortName 'boost-uninstall' `
-Description 'Internal vcpkg port used to uninstall Boost' `
-License 'MIT'
}