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 1/3] 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 From f0d2de1869f11eb692c38360912340fb6f2a3255 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:29:53 +0800 Subject: [PATCH 2/3] Skip GCC version check This is not necessary. In addition, 1. Avoid an error when `formula.tap` is `nil`. 2. Use the more suggestive `gcc.dep.rpaths.migrated` as the setting name. --- Library/Homebrew/cmd/update-report.rb | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index b8aa5169f2..660b7cf9f2 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -294,18 +294,10 @@ module Homebrew 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" + return if Settings.read("gcc.dep.rpaths.migrated") == "true" Formula.installed.each do |formula| - next unless formula.tap.core_tap? + next unless formula.tap&.core_tap? next unless formula.recursive_dependencies.map(&:name).include? "gcc" keg = formula.installed_kegs.last @@ -317,7 +309,7 @@ module Homebrew nil end - Settings.write "gcc.dependents.migrated", true + Settings.write "gcc.dep.rpaths.migrated", true end end From e1f8fa2c9be199365e25cd1ab490095001c18aa8 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Wed, 3 Aug 2022 20:15:45 +0800 Subject: [PATCH 3/3] Improve settings name This leads to a slightly more readable entry in `.git/config`. --- Library/Homebrew/cmd/update-report.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index 660b7cf9f2..a2dc75bf97 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -294,7 +294,7 @@ module Homebrew def migrate_gcc_dependents_if_needed return if OS.mac? - return if Settings.read("gcc.dep.rpaths.migrated") == "true" + return if Settings.read("gcc-rpaths.fixed") == "true" Formula.installed.each do |formula| next unless formula.tap&.core_tap? @@ -309,7 +309,7 @@ module Homebrew nil end - Settings.write "gcc.dep.rpaths.migrated", true + Settings.write "gcc-rpaths.fixed", true end end