Merge pull request #20418 from Homebrew/copilot/fix-16137

Add diagnostic check for pkg-config macOS SDK version mismatch
This commit is contained in:
Mike McQuaid 2025-08-13 08:18:28 +00:00 committed by GitHub
commit ec207feca4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 84 additions and 0 deletions

View File

@ -506,6 +506,42 @@ module OS
nil
end
def check_pkgconf_macos_sdk_mismatch
# We don't provide suitable bottles for these versions.
return if OS::Mac.version.prerelease? || OS::Mac.version.outdated_release?
pkgconf = begin
::Formula["pkgconf"]
rescue FormulaUnavailableError
nil
end
return unless pkgconf
return unless pkgconf.any_version_installed?
tab = Tab.for_formula(pkgconf)
return unless tab.built_on
built_on_version = tab.built_on["os_version"]
&.delete_prefix("macOS ")
&.sub(/\.\d+$/, "")
return unless built_on_version
current_version = MacOS.version.to_s
return if built_on_version == current_version
<<~EOS
You have pkgconf installed that was built on macOS #{built_on_version}
but you are running macOS #{current_version}.
This can cause issues with packages that depend on system libraries, such as libffi.
To fix this issue, reinstall pkgconf:
brew reinstall pkgconf
For more information, see: https://github.com/Homebrew/brew/issues/16137
We'd welcome a PR to automatically mitigate this instead of just warning about it.
EOS
end
end
end
end

View File

@ -95,4 +95,52 @@ RSpec.describe Homebrew::Diagnostic::Checks do
.to include("The contents of the SDKs in your Xcode installation do not match the SDK folder names")
end
end
describe "#check_pkgconf_macos_sdk_mismatch" do
let(:pkg_config_formula) { instance_double(Formula, any_version_installed?: true) }
let(:tab) { instance_double(Tab, built_on: { "os_version" => "13" }) }
before do
allow(Formula).to receive(:[]).with("pkgconf").and_return(pkg_config_formula)
allow(Tab).to receive(:for_formula).with(pkg_config_formula).and_return(tab)
end
it "doesn't trigger when pkgconf is not installed" do
allow(Formula).to receive(:[]).with("pkgconf").and_raise(FormulaUnavailableError.new("pkgconf"))
expect(checks.check_pkgconf_macos_sdk_mismatch).to be_nil
end
it "doesn't trigger when no versions are installed" do
allow(pkg_config_formula).to receive(:any_version_installed?).and_return(false)
expect(checks.check_pkgconf_macos_sdk_mismatch).to be_nil
end
it "doesn't trigger when built_on information is missing" do
allow(tab).to receive(:built_on).and_return(nil)
expect(checks.check_pkgconf_macos_sdk_mismatch).to be_nil
end
it "doesn't trigger when os_version information is missing" do
allow(tab).to receive(:built_on).and_return({ "cpu_family" => "x86_64" })
expect(checks.check_pkgconf_macos_sdk_mismatch).to be_nil
end
it "doesn't trigger when versions match" do
current_version = MacOS.version.to_s
allow(tab).to receive(:built_on).and_return({ "os_version" => current_version })
expect(checks.check_pkgconf_macos_sdk_mismatch).to be_nil
end
it "triggers when built_on version differs from current macOS version" do
allow(MacOS).to receive(:version).and_return(MacOSVersion.new("14"))
allow(tab).to receive(:built_on).and_return({ "os_version" => "13" })
expect(checks.check_pkgconf_macos_sdk_mismatch).to include("brew reinstall pkgconf")
end
end
end