Skip to content

Commit

Permalink
Merge pull request #7847 from maxim-belkin/allow_missing_libs
Browse files Browse the repository at this point in the history
Allow missing libraries
  • Loading branch information
jonchang authored Jul 17, 2020
2 parents 4765814 + f2ddcda commit 13f0d4a
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 6 deletions.
27 changes: 27 additions & 0 deletions Library/Homebrew/extend/os/linux/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,38 @@ def shared_library(name, version = nil)
"#{name}.so#{"." unless version.nil?}#{version}"
end

undef allowed_missing_lib?
def allowed_missing_lib?(lib)
# lib: Full path to the missing library
# Ex.: /home/linuxbrew/.linuxbrew/lib/libsomething.so.1
# x - Name of or a pattern for a library, linkage to which is allowed to be missing.
# Ex. 1: "libONE.so.1"
# Ex. 2: %r{(libONE|libTWO)\.so}
self.class.allowed_missing_libraries.any? do |x|
case x
when Regexp
x.match? lib
when String
lib.include? x
end
end
end

class << self
undef on_linux

def on_linux(&_block)
yield
end

def ignore_missing_libraries(*libs)
libs.flatten!
allowed_missing_libraries.merge(libs)
end

# @private
def allowed_missing_libraries
@allowed_missing_libraries ||= Set.new
end
end
end
7 changes: 7 additions & 0 deletions Library/Homebrew/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,13 @@ def link_overwrite?(path)
end
end

# Whether this {Formula} is allowed to have a broken linkage to specified library.
# Defaults to false.
# @return [Boolean]
def allowed_missing_lib?(*)
false
end

# Whether this {Formula} is deprecated (i.e. warns on installation).
# Defaults to false.
# @method deprecated?
Expand Down
29 changes: 23 additions & 6 deletions Library/Homebrew/linkage_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,35 @@ def display_reverse_output
end

def display_test_output(puts_output: true)
display_items "Missing libraries", @broken_dylibs, puts_output: puts_output
display_items "Missing libraries", broken_dylibs_with_expectations, 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
puts "No broken library linkage" unless broken_library_linkage?

if @broken_dylibs.empty?
puts "No broken library linkage detected"
elsif unexpected_broken_libs.empty?
puts "No unexpected broken library linkage detected."
else
puts "Broken library linkage detected"
end
end

def broken_library_linkage?
!@broken_dylibs.empty? ||
!@broken_deps.empty? ||
!@unwanted_system_dylibs.empty? ||
!@version_conflict_deps.empty?
issues = [@broken_deps, @unwanted_system_dylibs, @version_conflict_deps]
[issues, unexpected_broken_libs].flatten.any?(&:present?)
end

def unexpected_broken_libs
@broken_dylibs.reject { |lib| @formula.allowed_missing_lib? lib }
end

def broken_dylibs_with_expectations
output = {}
@broken_dylibs.each do |lib|
output[lib] = (unexpected_broken_libs.include? lib) ? ["unexpected"] : ["expected"]
end
output
end

private
Expand Down

0 comments on commit 13f0d4a

Please sign in to comment.