Merge pull request #8064 from maxim-belkin/missing-libs-follow-up2

Detect unexpected linkage
This commit is contained in:
Maxim Belkin 2020-07-24 16:29:17 -05:00 committed by GitHub
commit 0a5ac65b56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 8 deletions

View File

@ -24,10 +24,5 @@ class Formula
allowed_missing_libraries.merge(libraries) allowed_missing_libraries.merge(libraries)
end end
# @private
def allowed_missing_libraries
@allowed_missing_libraries ||= Set.new
end
end end
end end

View File

@ -2760,6 +2760,11 @@ class Formula
def ignore_missing_libraries(*) def ignore_missing_libraries(*)
raise FormulaSpecificationError, "#{__method__} is available on Linux only" raise FormulaSpecificationError, "#{__method__} is available on Linux only"
end end
# @private
def allowed_missing_libraries
@allowed_missing_libraries ||= Set.new
end
end end
end end

View File

@ -16,6 +16,7 @@ class LinkageChecker
@system_dylibs = Set.new @system_dylibs = Set.new
@broken_dylibs = Set.new @broken_dylibs = Set.new
@unexpected_broken_dylibs = nil @unexpected_broken_dylibs = nil
@unexpected_present_dylibs = nil
@variable_dylibs = Set.new @variable_dylibs = Set.new
@brewed_dylibs = Hash.new { |h, k| h[k] = Set.new } @brewed_dylibs = Hash.new { |h, k| h[k] = Set.new }
@reverse_links = 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) def display_test_output(puts_output: true)
display_items "Missing libraries", broken_dylibs_with_expectations, puts_output: puts_output 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 "Broken dependencies", @broken_deps, puts_output: puts_output
display_items "Unwanted system libraries", @unwanted_system_dylibs, 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 display_items "Conflicting libraries", @version_conflict_deps, puts_output: puts_output
@ -66,13 +68,15 @@ class LinkageChecker
elsif unexpected_broken_dylibs.empty? elsif unexpected_broken_dylibs.empty?
puts "No unexpected broken library linkage detected." puts "No unexpected broken library linkage detected."
else else
puts "Broken library linkage detected" puts "Unexpected missing library linkage detected"
end end
puts "Unexpected non-missing linkage detected" if unexpected_present_dylibs.present?
end end
def broken_library_linkage? def broken_library_linkage?
issues = [@broken_deps, @unwanted_system_dylibs, @version_conflict_deps] 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 end
def unexpected_broken_dylibs def unexpected_broken_dylibs
@ -90,6 +94,19 @@ class LinkageChecker
end end
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 def broken_dylibs_with_expectations
output = {} output = {}
@broken_dylibs.each do |broken_lib| @broken_dylibs.each do |broken_lib|
@ -291,7 +308,11 @@ class LinkageChecker
end end
else else
things.sort.each do |item| things.sort.each do |item|
output += "\n #{item}" output += if item.is_a? Regexp
"\n #{item.inspect}"
else
"\n #{item}"
end
end end
end end
puts output if puts_output puts output if puts_output