From f43fb7caa66451954bde4f2b3cb30a84432f0401 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Sun, 30 Mar 2025 17:26:36 +0530 Subject: [PATCH 1/7] Revert "Add patch for imagick for PHP 8.4" This reverts commit c580f4824614336caad90327558168785baea89a. --- extension/BuildPhpExtension/patches/imagick.ps1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 extension/BuildPhpExtension/patches/imagick.ps1 diff --git a/extension/BuildPhpExtension/patches/imagick.ps1 b/extension/BuildPhpExtension/patches/imagick.ps1 deleted file mode 100644 index 9fd1366..0000000 --- a/extension/BuildPhpExtension/patches/imagick.ps1 +++ /dev/null @@ -1 +0,0 @@ -(Get-Content imagick.c) | ForEach-Object { $_ -replace 'php_strtolower', 'zend_str_tolower' } | Set-Content imagick.c \ No newline at end of file From e6d8e3f5766ff8f8f8ed3a82610f1cdbfc935424 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Tue, 1 Apr 2025 12:20:40 +0530 Subject: [PATCH 2/7] Add patch for tensor --- extension/BuildPhpExtension/patches/tensor.ps1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 extension/BuildPhpExtension/patches/tensor.ps1 diff --git a/extension/BuildPhpExtension/patches/tensor.ps1 b/extension/BuildPhpExtension/patches/tensor.ps1 new file mode 100644 index 0000000..c71f600 --- /dev/null +++ b/extension/BuildPhpExtension/patches/tensor.ps1 @@ -0,0 +1 @@ +Invoke-Webrequest -Uri https://raw.githubusercontent.com/RubixML/Tensor/9e9281957fb9223122d1ef77bf5343897492225d/ext/config.w32 -OutFile ext\config.w32 From 726837e55b931c1e6a29749edf01626abc3d51d4 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Tue, 29 Apr 2025 07:59:25 +0530 Subject: [PATCH 3/7] Only package extension DLL for datadog_trace --- extension/BuildPhpExtension/private/Add-Package.ps1 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/extension/BuildPhpExtension/private/Add-Package.ps1 b/extension/BuildPhpExtension/private/Add-Package.ps1 index b950cf0..36a822c 100644 --- a/extension/BuildPhpExtension/private/Add-Package.ps1 +++ b/extension/BuildPhpExtension/private/Add-Package.ps1 @@ -76,6 +76,15 @@ function Add-Package { Remove-Item -Path "vc140.pdb" -Force } + # Keep only the extension DLL for ddtrace. + if($Config.name -eq 'ddtrace') { + Get-ChildItem -Filter "*.dll" | ForEach-Object { + if($_.Name -ne "php_$($Config.name).dll") { + Remove-Item -Path $_.FullName -Force + } + } + } + # As per https://github.com/ThePHPF/pie-design#windows-binaries $arch = $Config.arch if(-not(Test-Path -Path "php_$($Config.name).dll")) { From 90ef3fec99461cd31b2b88fa4d4d3cc57fa97122 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Tue, 29 Apr 2025 08:36:39 +0530 Subject: [PATCH 4/7] Add support to package extensions without debug symbols --- extension/BuildPhpExtension/config/task.bat | 5 +++++ .../private/Get-ExtensionConfig.ps1 | 5 +++++ .../BuildPhpExtension/private/Invoke-Build.ps1 | 16 ++++++++-------- 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 extension/BuildPhpExtension/config/task.bat diff --git a/extension/BuildPhpExtension/config/task.bat b/extension/BuildPhpExtension/config/task.bat new file mode 100644 index 0000000..749df37 --- /dev/null +++ b/extension/BuildPhpExtension/config/task.bat @@ -0,0 +1,5 @@ + +call phpize 2>&1 +call configure --with-php-build="..\deps" OPTIONS --with-mp="disable" 2>&1 +nmake /nologo 2>&1 +exit %errorlevel% diff --git a/extension/BuildPhpExtension/private/Get-ExtensionConfig.ps1 b/extension/BuildPhpExtension/private/Get-ExtensionConfig.ps1 index 73aea14..e39638b 100644 --- a/extension/BuildPhpExtension/private/Get-ExtensionConfig.ps1 +++ b/extension/BuildPhpExtension/private/Get-ExtensionConfig.ps1 @@ -79,6 +79,7 @@ Function Get-ExtensionConfig { ts = $Ts vs_version = $VsVersion vs_toolset = $VsToolset + debug_symbols = $True options = @() php_libraries = @() extension_libraries = @() @@ -145,6 +146,10 @@ Function Get-ExtensionConfig { } } + if ([System.Environment]::GetEnvironmentVariable("no-debug-symbols-$Extension") -eq 'true') { + $config.debug_symbols = $False + } + if($env:AUTO_DETECT_LIBS -eq 'true') { $detectedLibraries = Get-LibrariesFromConfig $Extension $VsVersion $Arch $configW32Content if($null -ne $detectedLibraries) { diff --git a/extension/BuildPhpExtension/private/Invoke-Build.ps1 b/extension/BuildPhpExtension/private/Invoke-Build.ps1 index 448543f..bb7b0d1 100644 --- a/extension/BuildPhpExtension/private/Invoke-Build.ps1 +++ b/extension/BuildPhpExtension/private/Invoke-Build.ps1 @@ -16,16 +16,16 @@ Function Invoke-Build { Add-StepLog "Building $($Config.name) extension" try { Set-GAGroup start - $bat_content = @() - $bat_content += "" - $bat_content += "call phpize 2>&1" - $bat_content += "call configure --with-php-build=`"..\deps`" $($Config.options) --with-mp=`"disable`" --enable-debug-pack 2>&1" - $bat_content += "nmake /nologo 2>&1" - $bat_content += "exit %errorlevel%" - Set-Content -Encoding "ASCII" -Path task.bat -Value $bat_content $builder = "php-sdk\phpsdk-starter.bat" - $task = (Get-Item -Path "." -Verbose).FullName + '\task.bat' + $task = [System.IO.Path]::Combine($PSScriptRoot, '..\config\task.bat') + + $options = $Config.options + if ($Config.debug_symbols) { + $options += " --enable-debug-pack" + } + Set-Content -Path $task -Value (Get-Content -Path $task -Raw).Replace("OPTIONS", $options) + $ref = $Config.ref if($env:ARTIFACT_NAMING_SCHEME -eq 'pecl') { $ref = $Config.ref.ToLower() From 58e7f37f75e600802199003cda2ac13c377b2157 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Tue, 29 Apr 2025 08:37:13 +0530 Subject: [PATCH 5/7] Package datadog_trace without debug symbols --- .github/workflows/pecl.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pecl.yml b/.github/workflows/pecl.yml index de04e92..40dae09 100644 --- a/.github/workflows/pecl.yml +++ b/.github/workflows/pecl.yml @@ -84,6 +84,7 @@ jobs: artifact-naming-scheme: pecl auto-detect-args: true auto-detect-libs: true + no-debug-symbols-ddtrace: true artifacts: runs-on: ubuntu-latest From 41ea5bc12f6db36b772180734e0d9d4a3b7ac949 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Wed, 30 Apr 2025 23:29:32 +0530 Subject: [PATCH 6/7] Switch to windows-2022 for VS2019 --- extension-matrix/config/vs.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extension-matrix/config/vs.json b/extension-matrix/config/vs.json index 1d6a655..f8d24a0 100644 --- a/extension-matrix/config/vs.json +++ b/extension-matrix/config/vs.json @@ -26,22 +26,22 @@ }, "8.0": { "vs": "2019", - "os": "windows-2019", + "os": "windows-2022", "type": "github-hosted" }, "8.1": { "vs": "2019", - "os": "windows-2019", + "os": "windows-2022", "type": "github-hosted" }, "8.2": { "vs": "2019", - "os": "windows-2019", + "os": "windows-2022", "type": "github-hosted" }, "8.3": { "vs": "2019", - "os": "windows-2019", + "os": "windows-2022", "type": "github-hosted" }, "8.4": { From 862a0fa7b3b143b97f1b1d8ab9cdc243ca3718e3 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Wed, 30 Apr 2025 23:45:12 +0530 Subject: [PATCH 7/7] Add support for adding VS components --- .../BuildPhpExtension/BuildPhpExtension.psd1 | 2 + extension/BuildPhpExtension/config/vs.json | 32 +++++++- .../BuildPhpExtension/private/Add-VS.ps1 | 80 +++++++++++++++++++ .../private/Get-VsVersion.ps1 | 23 ++---- .../private/Get-VsVersionHelper.ps1 | 50 ++++++++++++ 5 files changed, 165 insertions(+), 22 deletions(-) create mode 100644 extension/BuildPhpExtension/private/Add-VS.ps1 create mode 100644 extension/BuildPhpExtension/private/Get-VsVersionHelper.ps1 diff --git a/extension/BuildPhpExtension/BuildPhpExtension.psd1 b/extension/BuildPhpExtension/BuildPhpExtension.psd1 index 29aa572..10e6ea5 100644 --- a/extension/BuildPhpExtension/BuildPhpExtension.psd1 +++ b/extension/BuildPhpExtension/BuildPhpExtension.psd1 @@ -77,6 +77,7 @@ 'Add-Path', 'Add-PhpDependencies', 'Add-StepLog', + 'Add-Vs', 'Get-ArgumentFromConfig', 'Get-BuildDirectory', 'Get-Extension', @@ -90,6 +91,7 @@ 'Get-PhpDevelBuild', 'Get-PhpSdk', 'Get-TempFiles', + 'Get-VsVersionHelper', 'Get-VsVersion', 'Invoke-Build', 'Invoke-CleanupTempFiles', diff --git a/extension/BuildPhpExtension/config/vs.json b/extension/BuildPhpExtension/config/vs.json index 9c5806f..7a8710d 100644 --- a/extension/BuildPhpExtension/config/vs.json +++ b/extension/BuildPhpExtension/config/vs.json @@ -14,22 +14,46 @@ "vc14": { "major": 14, "minorMin": 0, - "minorMax": 9 + "minorMax": 9, + "components": [ + "Microsoft.VisualStudio.Component.CoreBuildTools", + "Microsoft.VisualStudio.Component.VC.140", + "Microsoft.VisualStudio.Component.VC.ATL", + "Microsoft.VisualStudio.Component.Windows10SDK.19041" + ] }, "vc15": { "major": 14, "minorMin": 10, - "minorMax": 19 + "minorMax": 19, + "components": [ + "Microsoft.VisualStudio.Component.CoreBuildTools", + "Microsoft.VisualStudio.Component.VC.v141.x86.x64", + "Microsoft.VisualStudio.Component.VC.ATL", + "Microsoft.VisualStudio.Component.Windows10SDK.19041" + ] }, "vs16": { "major": 14, "minorMin": 20, - "minorMax": 29 + "minorMax": 29, + "components": [ + "Microsoft.VisualStudio.Component.CoreBuildTools", + "Microsoft.VisualStudio.ComponentGroup.VC.Tools.142.x86.x64", + "Microsoft.VisualStudio.Component.VC.ATL", + "Microsoft.VisualStudio.Component.Windows10SDK.19041" + ] }, "vs17": { "major": 14, "minorMin": 30, - "minorMax": null + "minorMax": null, + "components": [ + "Microsoft.VisualStudio.Component.CoreBuildTools", + "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", + "Microsoft.VisualStudio.Component.VC.ATL", + "Microsoft.VisualStudio.Component.Windows10SDK.19041" + ] } } } diff --git a/extension/BuildPhpExtension/private/Add-VS.ps1 b/extension/BuildPhpExtension/private/Add-VS.ps1 new file mode 100644 index 0000000..bdf6c1c --- /dev/null +++ b/extension/BuildPhpExtension/private/Add-VS.ps1 @@ -0,0 +1,80 @@ +function Add-Vs { + <# + .SYNOPSIS + Add the required Visual Studio components. + .PARAMETER VsConfig + Visual Studio Configuration + .PARAMETER VsVersion + Visual Studio Version + #> + [OutputType()] + param ( + [Parameter(Mandatory = $true, Position=0, HelpMessage='Visual Studio Version')] + [ValidateNotNull()] + [ValidateLength(1, [int]::MaxValue)] + [string] $VsVersion, + [Parameter(Mandatory = $true, Position=1, HelpMessage='Visual Studio Configuration')] + [PSCustomObject] $VsConfig + ) + begin { + $vsWhereUrl = 'https://github.com/microsoft/vswhere/releases/latest/download/vswhere.exe' + } + process { + Add-StepLog "Adding Visual Studio components" + try + { + Set-GAGroup start + $Config = $VsConfig.vs.$VsVersion + + $installerDir = Join-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio" 'Installer' + $vswherePath = Join-Path $installerDir 'vswhere.exe' + if (-not (Test-Path $vswherePath)) { + if (-not (Test-Path $installerDir)) { + New-Item -Path $installerDir -ItemType Directory -Force | Out-Null + } + Invoke-WebRequest -Uri $vsWhereUrl -OutFile $vswherePath -UseBasicParsing + } + + $instances = & $vswherePath -products '*' -format json 2> $null | ConvertFrom-Json + $vsInst = $instances | Select-Object -First 1 + + $componentArgs = $Config.components | ForEach-Object { '--add'; $_ } + + if ($vsInst) { + [string]$channel = $vsInst.installationVersion.Split('.')[0] + if ($vsInst.catalog.productId -match '(Enterprise|Professional|Community)$' ) { + $exe = "vs_$($Matches[1].ToLower()).exe" + } else { + $exe = 'vs_buildtools.exe' + } + + $installerUrl = "https://aka.ms/vs/$channel/release/$exe" + $installerPath = Join-Path $env:TEMP $exe + + Invoke-WebRequest -Uri $installerUrl -OutFile $installerPath -UseBasicParsing + + & $installerPath modify ` + --installPath $vsInst.installationPath ` + --quiet --wait --norestart --nocache ` + @componentArgs 2>&1 | ForEach-Object { Write-Host $_ } + } else { + $channel = $VsVersion -replace '/D', '' + $exe = 'vs_buildtools.exe' + $installerUrl = "https://aka.ms/vs/$channel/release/$exe" + $installerPath = Join-Path $env:TEMP $exe + + Invoke-WebRequest -Uri $installerUrl -OutFile $installerPath -UseBasicParsing + & $installerPath ` + --quiet --wait --norestart --nocache ` + @componentArgs 2>&1 | ForEach-Object { Write-Host $_ } + } + Set-GAGroup end + Add-BuildLog tick "Visual Studio" "Visual Studio components installed successfully" + } catch { + Add-BuildLog cross "Visual Studio" "Failed to install Visual Studio components" + throw + } + } + end { + } +} \ No newline at end of file diff --git a/extension/BuildPhpExtension/private/Get-VsVersion.ps1 b/extension/BuildPhpExtension/private/Get-VsVersion.ps1 index eda0eb9..57ddbe8 100644 --- a/extension/BuildPhpExtension/private/Get-VsVersion.ps1 +++ b/extension/BuildPhpExtension/private/Get-VsVersion.ps1 @@ -20,25 +20,12 @@ function Get-VsVersion { $VsConfig = ConvertFrom-Json -InputObject $jsonContent $majorMinor = $PhpVersion.Substring(0, 3) $VsVersion = $($VsConfig.php.$majorMinor) - - if($null -eq (Get-Command vswhere -ErrorAction SilentlyContinue)) { - throw "vswhere is not available" - } - $MSVCDirectory = vswhere -latest -find "VC\Tools\MSVC" $selectedToolset = $null - $minor = $null - foreach ($toolset in (Get-ChildItem $MSVCDirectory)) { - $toolsetMajorVersion, $toolsetMinorVersion = $toolset.Name.split(".")[0,1] - $requiredVs = $VsConfig.vs.$VsVersion - if ($requiredVs.major -eq $toolsetMajorVersion -and ($toolsetMinorVersion -ge $requiredVs.minorMin -and ($null -eq $requiredVs.minorMax -or $toolsetMinorVersion -le $requiredVs.minorMax))) { - if($null -eq $minor -or $toolsetMinorVersion -gt $minor) { - $selectedToolset = $toolset.Name.Trim() - $minor = $toolsetMinorVersion - } - } - } - if (-not $selectedToolset) { - throw "toolset not available" + try { + $selectedToolset = Get-VsVersionHelper -VsVersion $VsVersion -VsConfig $VsConfig + } catch { + Add-Vs -VsVersion $VsVersion -VsConfig $VsConfig + $selectedToolset = Get-VsVersionHelper -VsVersion $VsVersion -VsConfig $VsConfig } return [PSCustomObject]@{ vs = $VsVersion diff --git a/extension/BuildPhpExtension/private/Get-VsVersionHelper.ps1 b/extension/BuildPhpExtension/private/Get-VsVersionHelper.ps1 new file mode 100644 index 0000000..e5a89d6 --- /dev/null +++ b/extension/BuildPhpExtension/private/Get-VsVersionHelper.ps1 @@ -0,0 +1,50 @@ +function Get-VsVersionHelper { + <# + .SYNOPSIS + Helper to get the Visual Studio version and toolset. + .PARAMETER VsConfig + Visual Studio Configuration + .PARAMETER VsVersion + Visual Studio Version + #> + [OutputType()] + param ( + [Parameter(Mandatory = $true, Position=0, HelpMessage='Visual Studio Version')] + [ValidateNotNull()] + [ValidateLength(1, [int]::MaxValue)] + [string] $VsVersion, + [Parameter(Mandatory = $true, Position=1, HelpMessage='Visual Studio Configuration')] + [PSCustomObject] $VsConfig + ) + begin { + } + process { + if($null -eq (Get-Command vswhere -ErrorAction SilentlyContinue)) { + throw "vswhere is not available" + } + $MSVCDirectory = vswhere -latest -products * -find "VC\Tools\MSVC" + $selectedToolset = $null + $minor = $null + foreach ($toolset in (Get-ChildItem $MSVCDirectory)) { + $toolsetMajorVersion, $toolsetMinorVersion = $toolset.Name.split(".")[0,1] + $requiredVs = $VsConfig.vs.$VsVersion + $majorVersionCheck = [int]$requiredVs.major -eq [int]$toolsetMajorVersion + $minorLowerBoundCheck = [int]$toolsetMinorVersion -ge [int]$requiredVs.minorMin + $minorUpperBoundCheck = ($null -eq $requiredVs.minorMax) -or ([int]$toolsetMinorVersion -le [int]$requiredVs.minorMax) + if ($majorVersionCheck -and $minorLowerBoundCheck -and $minorUpperBoundCheck) { + if($null -eq $minor -or [int]$toolsetMinorVersion -gt [int]$minor) { + $selectedToolset = $toolset.Name.Trim() + $minor = $toolsetMinorVersion + } + } + } + + if (-not $selectedToolset) { + throw "toolset not available" + } + + return $selectedToolset + } + end { + } +} \ No newline at end of file