From fec5b4080a87cb99e1aff19d36afcbbec4f725cf Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Wed, 3 Aug 2022 20:54:16 +0800 Subject: [PATCH] linux/diagnostic: add check for versioned GCC linkage This complements my other two GCC-on-Linux PRs (#13631, #13633), however they are both reliant on bottles eventually being (re-)poured. Let's try to speed that up by returning an error message from `brew doctor` whenever a user has formulae installed that would benefit from a `brew reinstall`. --- .../Homebrew/extend/os/linux/diagnostic.rb | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Library/Homebrew/extend/os/linux/diagnostic.rb b/Library/Homebrew/extend/os/linux/diagnostic.rb index 35eb83ff10..d3d46cd79c 100644 --- a/Library/Homebrew/extend/os/linux/diagnostic.rb +++ b/Library/Homebrew/extend/os/linux/diagnostic.rb @@ -139,6 +139,34 @@ module Homebrew e.g. by using homebrew instead). EOS end + + def check_gcc_dependent_linkage + gcc_dependents = Formula.installed.select do |formula| + next false unless formula.tap&.core_tap? + + formula.recursive_dependencies.map(&:name).include? "gcc" + rescue TapFormulaUnavailableError + false + end + return if gcc_dependents.empty? + + badly_linked = gcc_dependents.select do |dependent| + keg = Keg.new(dependent.prefix) + keg.binary_executable_or_library_files.any? do |binary| + paths = binary.rpath.split(":") + versioned_linkage = paths.any? { |path| path.match?(%r{lib/gcc/\d+$}) } + unversioned_linkage = paths.any? { |path| path.match?(%r{lib/gcc/current$}) } + + versioned_linkage && !unversioned_linkage + end + end + return if badly_linked.empty? + + inject_file_list badly_linked, <<~EOS + Formulae which link to GCC through a versioned path were found. These formulae + are prone to breaking when GCC is updated. You should `brew reinstall` these formulae: + EOS + end end end end