From b8e191995e0bb0fd89e45a7bae96accc44334221 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Fri, 2 Oct 2026 01:39:21 +0200 Subject: [PATCH] THRIFT-6401: Declare the minimum Visual C++ runtime for WinGet and Chocolatey, and drop the dead Chocolatey icon Client: build The Chocolatey review of the thrift 0.25.0 package flagged the nuspec's iconUrl, which returns 404, and a dependency without a version. There is no square Thrift logo to point at, so the package goes without an icon, as the 0.12.0 package did. The released thrift.exe links the shared Visual C++ runtime, and the installed redistributable has to be at least as new as the build tools the program was built with; thrift-0.25.0.exe reports linker version 14.51. Without a minimum, any vcredist140 that is already installed satisfies the dependency and is not updated, and the WinGet manifest had the same gap. The nuspec now asks for vcredist140 14.51 or later, and the WinGet installer manifest asks for Microsoft.VCRedist.2015+.x64 14.51 or later through MinimumVersion, quoted so that YAML keeps it a string. The tests check both minimums, that the two agree, and that the nuspec names no icon. doc/ReleaseManagement.md says to raise the minimum when the compiler is built with newer build tools, and build/windows/README.md mentions it. Co-Authored-By: Claude Opus 5.5 (1M context) --- build/windows/README.md | 5 ++++- .../chocolatey/test-chocolatey-package.ps1 | 19 +++++++++++++++++++ build/windows/chocolatey/thrift.nuspec.in | 9 ++++++--- .../winget/Apache.Thrift.installer.yaml.in | 7 ++++++- .../windows/winget/test-winget-manifests.ps1 | 7 +++++++ doc/ReleaseManagement.md | 7 +++++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/build/windows/README.md b/build/windows/README.md index 223ca18f8c8..715a4515fba 100644 --- a/build/windows/README.md +++ b/build/windows/README.md @@ -131,7 +131,10 @@ redistributable, which the ASF cannot ship. An interactive install says so when it cannot find `vcruntime140.dll`, rather than letting the first run fail with a missing-DLL dialog. It never blocks, and a silent install - which is what a package manager does - shows nothing; the WinGet and Chocolatey packages declare -the redistributable as a dependency instead, so their users never see it. +the redistributable as a dependency instead, so their users never see it. They +ask for version 14.51 or later, because it has to be at least as new as the build +tools the compiler was built with; a version already installed only counts from +there on. ## `installer/test-installer.ps1` diff --git a/build/windows/chocolatey/test-chocolatey-package.ps1 b/build/windows/chocolatey/test-chocolatey-package.ps1 index 5e0e4d9a5a4..e200e3b8686 100644 --- a/build/windows/chocolatey/test-chocolatey-package.ps1 +++ b/build/windows/chocolatey/test-chocolatey-package.ps1 @@ -117,6 +117,25 @@ try { (@($dependencies | Where-Object { $_.id -eq 'vcredist140' }).Count -eq 1) ` (($dependencies | ForEach-Object { $_.id }) -join ', ') + # The installed redistributable has to be at least as new as the build + # tools the compiler was built with. Without a minimum, any version that is + # already installed satisfies the dependency and is not updated. + $redist = @($dependencies | Where-Object { $_.id -eq 'vcredist140' }) | Select-Object -First 1 + $redistMinimum = if ($redist) { [string]$redist.version } else { '' } + Assert-True 'the redistributable dependency names a minimum version' ` + ($redistMinimum -match '^14\.\d+') "version '$redistMinimum'" + + # Both package managers have to ask for the same runtime. + $wingetTemplate = Get-Content -LiteralPath (Join-Path $PSScriptRoot '..\winget\Apache.Thrift.installer.yaml.in') -Raw + $wingetMinimum = ([regex]::Match($wingetTemplate, "MinimumVersion:\s*'([^']*)'")).Groups[1].Value + Assert-True 'the minimum matches the one in the WinGet manifest' ` + ([bool]$redistMinimum -and ($redistMinimum -eq $wingetMinimum)) "nuspec '$redistMinimum', WinGet '$wingetMinimum'" + + # There is no square Thrift logo to point at, and Chocolatey flags a dead + # icon link. + Assert-True 'the nuspec names no icon' (-not $nuspec.package.metadata.iconUrl) ` + ([string]$nuspec.package.metadata.iconUrl) + $install = Get-Content -LiteralPath $installPath -Raw Assert-True 'the install script holds no placeholders' ($install -notmatch '__[A-Z0-9_]+__') Assert-True 'the checksum reaches the install script' ($install -match "checksum64\s*=\s*'$sha'") diff --git a/build/windows/chocolatey/thrift.nuspec.in b/build/windows/chocolatey/thrift.nuspec.in index 6f713525fed..02f1a081610 100644 --- a/build/windows/chocolatey/thrift.nuspec.in +++ b/build/windows/chocolatey/thrift.nuspec.in @@ -36,7 +36,7 @@ https://thrift.apache.org/mailing https://www.apache.org/licenses/LICENSE-2.0 false - https://thrift.apache.org/assets/images/thrift-logo.svg + Copyright (c) The Apache Software Foundation apache thrift rpc idl codegen compiler serialization admin The Apache Thrift IDL compiler @@ -64,8 +64,11 @@ shell afterwards. - + this first. It has to be at least as new as the build tools the + compiler was built with, so a version already installed only + counts from that one on. Keep it equal to MinimumVersion in + build/windows/winget/Apache.Thrift.installer.yaml.in. --> + diff --git a/build/windows/winget/Apache.Thrift.installer.yaml.in b/build/windows/winget/Apache.Thrift.installer.yaml.in index c9dfe1e38e8..7c4acaa746e 100644 --- a/build/windows/winget/Apache.Thrift.installer.yaml.in +++ b/build/windows/winget/Apache.Thrift.installer.yaml.in @@ -32,10 +32,15 @@ UpgradeBehavior: install ProductCode: '{064E0C5D-29EE-47DD-BB5E-172FE25FE936}_is1' ReleaseDate: __RELEASE_DATE__ # The compiler links the shared runtime, so it needs the Visual C++ -# redistributable, which the ASF cannot ship. WinGet installs this first. +# redistributable, which the ASF cannot ship. WinGet installs this first. It +# has to be at least as new as the build tools the compiler was built with, so +# a version already installed only counts from that one on. Keep it equal to +# the vcredist140 version in build/windows/chocolatey/thrift.nuspec.in. Quoted, +# so that YAML does not read it as a number. Dependencies: PackageDependencies: - PackageIdentifier: Microsoft.VCRedist.2015+.x64 + MinimumVersion: '14.51' Installers: - Architecture: x64 InstallerUrl: __INSTALLER_URL__ diff --git a/build/windows/winget/test-winget-manifests.ps1 b/build/windows/winget/test-winget-manifests.ps1 index 2b2fff10e3a..13c52465a73 100644 --- a/build/windows/winget/test-winget-manifests.ps1 +++ b/build/windows/winget/test-winget-manifests.ps1 @@ -126,6 +126,13 @@ try { Assert-True 'the redistributable is declared as a dependency' ` ($installer -match 'PackageIdentifier:\s*Microsoft\.VCRedist\.2015\+\.x64') $installer + # The installed redistributable has to be at least as new as the build + # tools the compiler was built with. Without a minimum, any version that is + # already installed satisfies the dependency and is not updated. Quoted, so + # that YAML does not read 14.51 as a number. + Assert-True 'the redistributable dependency names a minimum version' ` + ($installer -match "PackageIdentifier:\s*Microsoft\.VCRedist\.2015\+\.x64\s*\n\s*MinimumVersion:\s*'14\.\d+'") $installer + # downloads.apache.org only carries the current release, so a manifest # naming it stops working at the next one. Assert-True 'the installer URL defaults to the Apache archive' ` diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md index 3e58a9d86f1..1d48f948d41 100644 --- a/doc/ReleaseManagement.md +++ b/doc/ReleaseManagement.md @@ -205,6 +205,13 @@ All Apache Thrift releases go through a 72-hour final release candidate voting p Do **not** build a statically linked compiler to make that list shorter. The project moved away from one deliberately, and the released compiler is expected to require the Visual C++ redistributable; the check fails if it does not. + + The installed redistributable has to be at least as new as the build tools the + compiler was built with, so the WinGet and Chocolatey packages ask for that version + or later: 14.51, what 0.25.0 was built with. If you build with newer build tools - + `dumpbin /headers thrift.exe` shows their version as the linker version - raise + `MinimumVersion` in `build/windows/winget/Apache.Thrift.installer.yaml.in` and the + `vcredist140` version in `build/windows/chocolatey/thrift.nuspec.in` to match. 1. Copy the executable `thrift.exe` to your linux system where the signed tarball lives and rename it to `thrift-1.0.0.exe` (substitute the correct version, of course). 1. Sign the executable the same way you signed the tarball. 1. Build the Windows installer from the very same executable: