Fixes for linkage_checker

1. In "display_test_output": when printing dependencies without
linkage, use "Dependencies with no linkage" string instead of "Possible
unnecessary dependencies" for consistency with "display_normal_output"

2. In "check_dylibs": keep track of and skip repetitive checking of
those dylibs that have been previously checked. This is applicable when
different executables/libraries are linked against the same libraries.

3. In "check_undeclared_deps": when there are missing libraries,
corresponding dependencies should be excluded from the list of
dependencies with no linkage.
This commit is contained in:
Maxim Belkin 2018-03-17 00:15:51 -05:00
parent e8a4aad56c
commit 2a6a2b2fa0

View File

@ -22,6 +22,7 @@ class LinkageChecker
end end
def check_dylibs def check_dylibs
checked_dylibs = Set.new
@keg.find do |file| @keg.find do |file|
next if file.symlink? || file.directory? next if file.symlink? || file.directory?
next unless file.dylib? || file.binary_executable? || file.mach_o_bundle? next unless file.dylib? || file.binary_executable? || file.mach_o_bundle?
@ -30,6 +31,7 @@ class LinkageChecker
# when checking for broken linkage # when checking for broken linkage
file.dynamically_linked_libraries(except: :LC_LOAD_WEAK_DYLIB).each do |dylib| file.dynamically_linked_libraries(except: :LC_LOAD_WEAK_DYLIB).each do |dylib|
@reverse_links[dylib] << file @reverse_links[dylib] << file
next if checked_dylibs.include? dylib
if dylib.start_with? "@" if dylib.start_with? "@"
@variable_dylibs << dylib @variable_dylibs << dylib
else else
@ -50,6 +52,7 @@ class LinkageChecker
@brewed_dylibs[f] << dylib @brewed_dylibs[f] << dylib
end end
end end
checked_dylibs << dylib
end end
end end
@ -83,6 +86,12 @@ class LinkageChecker
next true if Formula[name].bin.directory? next true if Formula[name].bin.directory?
@brewed_dylibs.keys.map { |x| x.split("/").last }.include?(name) @brewed_dylibs.keys.map { |x| x.split("/").last }.include?(name)
end end
missing = []
@broken_dylibs.each do |str|
next unless str.start_with? "#{HOMEBREW_PREFIX}/opt"
missing << str.sub("#{HOMEBREW_PREFIX}/opt/", "").split("/")[0]
end
unnecessary_deps -= missing
[indirect_deps, undeclared_deps, unnecessary_deps] [indirect_deps, undeclared_deps, unnecessary_deps]
end end
@ -123,7 +132,7 @@ class LinkageChecker
def display_test_output def display_test_output
display_items "Missing libraries", @broken_dylibs display_items "Missing libraries", @broken_dylibs
display_items "Possible unnecessary dependencies", @unnecessary_deps display_items "Dependencies with no linkage", @unnecessary_deps
puts "No broken dylib links" if @broken_dylibs.empty? puts "No broken dylib links" if @broken_dylibs.empty?
end end