private/Get-LibrariesFromConfig.ps1

Function Get-LibrariesFromConfig {
    <#
    .SYNOPSIS
        Get the Libraries from the config.w32 file
    .PARAMETER Extension
        Extension
    .PARAMETER VsVersion
        Visual Studio Version
    .PARAMETER Arch
        Architecture
    .PARAMETER ConfigW32Content
        config.w32 content
    #>

    [OutputType()]
    param (
        [Parameter(Mandatory = $true, Position=0, HelpMessage='Extension')]
        [string] $Extension,
        [Parameter(Mandatory = $true, Position=1, HelpMessage='Visual Studio Version')]
        [string] $VsVersion,
        [Parameter(Mandatory = $true, Position=2, HelpMessage='Architecture')]
        [string] $Arch,
        [Parameter(Mandatory = $true, Position=3, HelpMessage='config.w32 content')]
        [string] $ConfigW32Content
    )
    begin {
        $jsonPath = [System.IO.Path]::Combine($PSScriptRoot, '..\config\vs.json')
    }
    process {
        $jsonData = (
        Get-File -Url "https://downloads.php.net/~windows/pecl/deps/libmapping.json"
        ).Content | ConvertFrom-Json

        $phpSeries = (Get-File -Url "https://downloads.php.net/~windows/php-sdk/deps/$VsVersion/$Arch").Content.ToLower()

        Function Find-Library {
            param (
                [Parameter(Mandatory=$true, Position=0)]
                [string]$MatchString,
                [Parameter(Mandatory=$true, Position=1)]
                [string[]]$VsVersions
            )
            foreach ($vsVersion in $VsVersions) {
                foreach ($vsVersionData in $JsonData.PSObject.Properties) {
                    if($vsVersionData.Name -eq $VsVersion) {
                        foreach ($archData in $vsVersionData.Value.PSObject.Properties) {
                            if($archData.Name -eq $Arch) {
                                foreach ($libs in $archData.Value.PSObject.Properties) {
                                    if ($libs.Value -match ($MatchString.Replace('*', '.*'))) {
                                        $libs.Name -Match '^(.+?)-\d' | Out-Null
                                        if(!$phpSeries.contains($matches[1].ToLower())) {
                                            $libs.Name -Match '^(.+?-\d)' | Out-Null
                                        }
                                        return $matches[1]
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return $null
        }

        $jsonContent = Get-Content -Path $jsonPath -Raw
        $VsConfig = ConvertFrom-Json -InputObject $jsonContent
        $VsVersions = @($VsVersion)
        $VsVersions += $($VsConfig.vs | Get-Member -MemberType *Property).Name | Where-Object {
            # vs15 and above builds are compatible.
            ($_ -lt $VsVersion -and $_ -ge "vc15")
        }

        $foundItems = @()
        $libraryFilesFound = @()
        [regex]::Matches($ConfigW32Content, 'CHECK_LIB\(["'']([^"'']+)["'']|["'']([^"'']+\.lib)["'']|(\w+\.lib)|(SETUP_\w+)') | ForEach-Object {
            $_.Groups[1].Value.Split(';') + ($_.Groups[2].Value -Split '[^\w\.]') + ($_.Groups[3].Value -Split '[^\w\.]') + ($_.Groups[4].Value) | ForEach-Object {
                $libraryFilesFound += $_
            }
        }
        $libraryFilesFound | Select-Object -Unique | ForEach-Object {
            if($_) {
                switch ($_) {
                    SETUP_ZLIB_LIB { $library = "zlib" }
                    SETUP_OPENSSL { $library = "openssl" }
                    SETUP_SQLITE3 { $library = "sqlite" }
                    libeay32.lib { $library = "openssl" }
                    ssleay32.lib { $library = "openssl" }
                    Default { $library = Find-Library $_ $VsVersions }
                }
                if($library -and (-not($foundItems.Contains($library)))) {
                    $foundItems += $library.ToLower()
                }
            }
        }

        # Exceptions
        # Remove libsasl if the extension is mongodb
        if($Extension -eq "mongodb") {
            $foundItems = $foundItems | Where-Object {$_ -notmatch "libsasl.*"}
        }
        # Add zlib if the extension is memcached
        if($Extension -eq "memcached") {
            $foundItems += "zlib"
        }

        $highestVersions = @{}

        foreach ($item in $foundItems) {
            if ($item -match '^(.*?)-(\d+)$') {
                $libraryName, $version = $matches[1], $matches[2]
                if (-not $highestVersions.ContainsKey($libraryName) -or $highestVersions[$libraryName] -lt $version) {
                    $highestVersions[$libraryName] = $version
                }
            } else {
                $highestVersions[$item] = -1
            }
        }

        $finalItems = @()
        foreach ($library in $highestVersions.Keys) {
            if ($highestVersions[$library] -eq -1) {
                $finalItems += $library
            } else {
                $finalItems += "$library-" + $highestVersions[$library]
            }
        }

        return $finalItems
    }
    end {
    }
}