diff --git a/Library/Homebrew/extend/os/linux/formula.rb b/Library/Homebrew/extend/os/linux/formula.rb index 0816edbb87..e1562909aa 100644 --- a/Library/Homebrew/extend/os/linux/formula.rb +++ b/Library/Homebrew/extend/os/linux/formula.rb @@ -24,10 +24,5 @@ class Formula allowed_missing_libraries.merge(libraries) end - - # @private - def allowed_missing_libraries - @allowed_missing_libraries ||= Set.new - end end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 6114a8896c..f307705323 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -2760,6 +2760,11 @@ class Formula def ignore_missing_libraries(*) raise FormulaSpecificationError, "#{__method__} is available on Linux only" end + + # @private + def allowed_missing_libraries + @allowed_missing_libraries ||= Set.new + end end end diff --git a/Library/Homebrew/linkage_checker.rb b/Library/Homebrew/linkage_checker.rb index c97a691f10..65263161d9 100644 --- a/Library/Homebrew/linkage_checker.rb +++ b/Library/Homebrew/linkage_checker.rb @@ -16,6 +16,7 @@ class LinkageChecker @system_dylibs = Set.new @broken_dylibs = Set.new @unexpected_broken_dylibs = nil + @unexpected_present_dylibs = nil @variable_dylibs = Set.new @brewed_dylibs = Hash.new { |h, k| h[k] = Set.new } @reverse_links = Hash.new { |h, k| h[k] = Set.new } @@ -57,6 +58,7 @@ class LinkageChecker def display_test_output(puts_output: true) display_items "Missing libraries", broken_dylibs_with_expectations, puts_output: puts_output + display_items "Unused missing linkage information", unexpected_present_dylibs, puts_output: puts_output display_items "Broken dependencies", @broken_deps, puts_output: puts_output display_items "Unwanted system libraries", @unwanted_system_dylibs, puts_output: puts_output display_items "Conflicting libraries", @version_conflict_deps, puts_output: puts_output @@ -66,13 +68,15 @@ class LinkageChecker elsif unexpected_broken_dylibs.empty? puts "No unexpected broken library linkage detected." else - puts "Broken library linkage detected" + puts "Unexpected missing library linkage detected" end + + puts "Unexpected non-missing linkage detected" if unexpected_present_dylibs.present? end def broken_library_linkage? issues = [@broken_deps, @unwanted_system_dylibs, @version_conflict_deps] - [issues, unexpected_broken_dylibs].flatten.any?(&:present?) + [issues, unexpected_broken_dylibs, unexpected_present_dylibs].flatten.any?(&:present?) end def unexpected_broken_dylibs @@ -90,6 +94,19 @@ class LinkageChecker end end + def unexpected_present_dylibs + @unexpected_present_dylibs ||= @formula.class.allowed_missing_libraries.reject do |allowed_missing_lib| + @broken_dylibs.any? do |broken_lib| + case allowed_missing_lib + when Regexp + allowed_missing_lib.match? broken_lib + when String + broken_lib.include? allowed_missing_lib + end + end + end + end + def broken_dylibs_with_expectations output = {} @broken_dylibs.each do |broken_lib| @@ -291,7 +308,11 @@ class LinkageChecker end else things.sort.each do |item| - output += "\n #{item}" + output += if item.is_a? Regexp + "\n #{item.inspect}" + else + "\n #{item}" + end end end puts output if puts_output