Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

linkage_checker: deprecate linkage to libcrypt.so.1 #13151

Merged
merged 2 commits into from
Apr 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 38 additions & 0 deletions Library/Homebrew/extend/os/linux/linkage_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,47 @@ class LinkageChecker
libstdc++.so.6
].freeze

def display_deprecated_warning(strict: false)
return unless @libcrypt_found

# Steps when moving this to `odisabled`:
# - Remove `libcrypt.so.1` from SYSTEM_LIBRARY_ALLOWLIST above.
# - Remove the `disable` and `disable_for_developer` kwargs here.
# - Remove `broken_library_linkage?` override below and the generic alias in HOMEBREW_LIBRARY/linkage_checker.rb.
# - Remove `fail_on_libcrypt1?`.
# Steps when removing this entirely (assuming the above has already been done):
# - Remove the `display_` overrides here and the associated generic aliases in HOMEBREW_LIBRARY/linkage_checker.rb
# - Remove the setting of `@libcrypt_found` in `check_dylibs` below.
odeprecated "linkage to libcrypt.so.1", "libcrypt.so.2 in the libxcrypt formula",
disable: fail_on_libcrypt1?(strict: strict),
disable_for_developers: false
end

def display_normal_output
generic_display_normal_output
display_deprecated_warning
end

def display_test_output(puts_output: true, strict: false)
generic_display_test_output(puts_output: puts_output, strict: strict)
display_deprecated_warning(strict: strict)
end

def broken_library_linkage?(strict: false)
generic_broken_library_linkage?(strict: strict) || (fail_on_libcrypt1?(strict: strict) && @libcrypt_found)
end

private

def fail_on_libcrypt1?(strict:)
strict || ENV["HOMEBREW_DISALLOW_LIBCRYPT1"].present?
end

def check_dylibs(rebuild_cache:)
generic_check_dylibs(rebuild_cache: rebuild_cache)

@libcrypt_found = true if @system_dylibs.any? { |s| File.basename(s) == "libcrypt.so.1" }

# glibc and gcc are implicit dependencies.
# No other linkage to system libraries is expected or desired.
@unwanted_system_dylibs = @system_dylibs.reject do |s|
Expand Down
6 changes: 6 additions & 0 deletions Library/Homebrew/linkage_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ def display_normal_output
display_items "Unwanted system libraries", @unwanted_system_dylibs
display_items "Files with missing rpath", @files_missing_rpaths
end
alias generic_display_normal_output display_normal_output
private :generic_display_normal_output

def display_reverse_output
return if @reverse_links.empty?
Expand All @@ -75,13 +77,17 @@ def display_test_output(puts_output: true, strict: false)
display_items "Undeclared dependencies with linkage", @undeclared_deps, puts_output: puts_output
display_items "Files with missing rpath", @files_missing_rpaths, puts_output: puts_output
end
alias generic_display_test_output display_test_output
private :generic_display_test_output

sig { params(strict: T::Boolean).returns(T::Boolean) }
def broken_library_linkage?(strict: false)
issues = [@broken_deps, @unwanted_system_dylibs, @version_conflict_deps]
issues += [@undeclared_deps, @files_missing_rpaths] if strict
[issues, unexpected_broken_dylibs, unexpected_present_dylibs].flatten.any?(&:present?)
end
alias generic_broken_library_linkage? broken_library_linkage?
private :generic_broken_library_linkage?

def unexpected_broken_dylibs
return @unexpected_broken_dylibs if @unexpected_broken_dylibs
Expand Down
9 changes: 7 additions & 2 deletions Library/Homebrew/utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,11 @@ def odie(error)
exit 1
end

def odeprecated(method, replacement = nil, disable: false, disable_on: nil, caller: send(:caller))
def odeprecated(method, replacement = nil,
disable: false,
disable_on: nil,
disable_for_developers: true,
caller: send(:caller))
replacement_message = if replacement
"Use #{replacement} instead."
else
Expand Down Expand Up @@ -219,7 +223,8 @@ def odeprecated(method, replacement = nil, disable: false, disable_on: nil, call
message << tap_message if tap_message
message.freeze

if Homebrew::EnvConfig.developer? || disable || Homebrew.raise_deprecation_exceptions?
disable = true if disable_for_developers && Homebrew::EnvConfig.developer?
if disable || Homebrew.raise_deprecation_exceptions?
exception = MethodDeprecatedError.new(message)
exception.set_backtrace(backtrace)
raise exception
Expand Down