From 7be6b8e6d1172b0a5a65944254c2ef4f73342ad4 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Tue, 2 Aug 2022 23:49:05 +0800 Subject: [PATCH] update-report: migrate GCC recursive dependents When GCC 12 ships (Homebrew/homebrew-core#106755) ships, most (all?) Linux bottles that depend on GCC will break. Let's fix that by using the same trick for handling divergent formula revisions when migrating formulae from linuxbrew-core (#11982). We set the recorded `version_scheme` to -1, which spoofs the formula being outdated. When `brew upgrade` installs GCC 12, the broken formulae will have their bottles reinstalled too. This works because the reinstallation will also rewrite the existing RPATHs to point to the new version of GCC instead (#13631). This should handle most of the breakage. --- Library/Homebrew/cmd/update-report.rb | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index 89b8f50fca..b8aa5169f2 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -148,6 +148,8 @@ module Homebrew Homebrew.failed = true if ENV["HOMEBREW_UPDATE_FAILED"] return if Homebrew::EnvConfig.disable_load_formula? + migrate_gcc_dependents_if_needed + hub = ReporterHub.new updated_taps = [] @@ -289,6 +291,34 @@ module Homebrew #{e} EOS end + + def migrate_gcc_dependents_if_needed + return if OS.mac? + + # TODO: Remove this block when GCC 12 ships. + begin + return if Formula["gcc"].version < 12 + rescue FormulaUnavailableError + return if Homebrew::EnvConfig.install_from_api? + end + + return if Settings.read("gcc.dependents.migrated") == "true" + + Formula.installed.each do |formula| + next unless formula.tap.core_tap? + next unless formula.recursive_dependencies.map(&:name).include? "gcc" + + keg = formula.installed_kegs.last + tab = Tab.for_keg(keg) + # Force reinstallation upon `brew upgrade` to fix the bottle RPATH. + tab.source["versions"]["version_scheme"] = -1 + tab.write + rescue TapFormulaUnavailableError + nil + end + + Settings.write "gcc.dependents.migrated", true + end end class Reporter