2020-10-10 14:16:11 +02:00
|
|
|
# typed: false
|
2019-04-19 15:38:03 +09:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-04-25 17:58:50 +01:00
|
|
|
module Homebrew
|
|
|
|
module Diagnostic
|
2020-08-14 04:33:33 +02:00
|
|
|
class Volumes
|
|
|
|
def initialize
|
|
|
|
@volumes = get_mounts
|
|
|
|
end
|
|
|
|
|
|
|
|
def which(path)
|
|
|
|
vols = get_mounts path
|
|
|
|
|
|
|
|
# no volume found
|
|
|
|
return -1 if vols.empty?
|
|
|
|
|
|
|
|
vol_index = @volumes.index(vols[0])
|
|
|
|
# volume not found in volume list
|
|
|
|
return -1 if vol_index.nil?
|
|
|
|
|
|
|
|
vol_index
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_mounts(path = nil)
|
|
|
|
vols = []
|
|
|
|
# get the volume of path, if path is nil returns all volumes
|
|
|
|
|
|
|
|
args = %w[/bin/df -P]
|
|
|
|
args << path if path
|
|
|
|
|
|
|
|
Utils.popen_read(*args) do |io|
|
|
|
|
io.each_line do |line|
|
|
|
|
case line.chomp
|
|
|
|
# regex matches: /dev/disk0s2 489562928 440803616 48247312 91% /
|
|
|
|
when /^.+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[0-9]{1,3}%\s+(.+)/
|
|
|
|
vols << Regexp.last_match(1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
vols
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-25 17:58:50 +01:00
|
|
|
class Checks
|
2021-02-05 12:26:28 +00:00
|
|
|
undef fatal_preinstall_checks, fatal_build_from_source_checks,
|
|
|
|
fatal_setup_build_environment_checks, supported_configuration_checks,
|
|
|
|
build_from_source_checks
|
|
|
|
|
|
|
|
def fatal_preinstall_checks
|
|
|
|
checks = %w[
|
|
|
|
check_access_directories
|
|
|
|
]
|
|
|
|
|
|
|
|
# We need the developer tools for `codesign`.
|
|
|
|
checks << "check_for_installed_developer_tools" if Hardware::CPU.arm?
|
|
|
|
|
|
|
|
checks.freeze
|
|
|
|
end
|
2019-01-21 19:23:31 +00:00
|
|
|
|
|
|
|
def fatal_build_from_source_checks
|
|
|
|
%w[
|
|
|
|
check_xcode_license_approved
|
|
|
|
check_xcode_minimum_version
|
|
|
|
check_clt_minimum_version
|
|
|
|
check_if_xcode_needs_clt_installed
|
2020-07-01 16:02:29 +01:00
|
|
|
check_if_supported_sdk_available
|
2021-02-07 04:21:59 +00:00
|
|
|
check_broken_sdks
|
2019-01-21 19:23:31 +00:00
|
|
|
].freeze
|
|
|
|
end
|
2018-04-07 20:28:56 +01:00
|
|
|
|
2020-09-11 12:05:22 +01:00
|
|
|
def fatal_setup_build_environment_checks
|
|
|
|
%w[
|
2021-09-17 00:03:42 +01:00
|
|
|
check_xcode_minimum_version
|
2021-08-17 18:36:27 +01:00
|
|
|
check_clt_minimum_version
|
2020-09-11 12:05:22 +01:00
|
|
|
check_if_supported_sdk_available
|
|
|
|
].freeze
|
|
|
|
end
|
|
|
|
|
2019-01-21 12:39:44 +00:00
|
|
|
def supported_configuration_checks
|
2016-07-04 18:35:03 +01:00
|
|
|
%w[
|
2016-09-18 19:57:19 +01:00
|
|
|
check_for_unsupported_macos
|
2019-01-21 12:39:44 +00:00
|
|
|
].freeze
|
|
|
|
end
|
|
|
|
|
2019-01-21 19:23:31 +00:00
|
|
|
def build_from_source_checks
|
2019-01-21 12:39:44 +00:00
|
|
|
%w[
|
2016-07-04 18:35:03 +01:00
|
|
|
check_for_installed_developer_tools
|
2016-11-05 10:38:39 -04:00
|
|
|
check_xcode_up_to_date
|
|
|
|
check_clt_up_to_date
|
|
|
|
].freeze
|
2016-07-04 18:35:03 +01:00
|
|
|
end
|
|
|
|
|
2018-05-12 11:47:12 -05:00
|
|
|
def check_for_non_prefixed_findutils
|
|
|
|
findutils = Formula["findutils"]
|
|
|
|
return unless findutils.any_version_installed?
|
|
|
|
|
|
|
|
gnubin = %W[#{findutils.opt_libexec}/gnubin #{findutils.libexec}/gnubin]
|
|
|
|
default_names = Tab.for_name("findutils").with? "default-names"
|
|
|
|
return if !default_names && (paths & gnubin).empty?
|
|
|
|
|
|
|
|
<<~EOS
|
|
|
|
Putting non-prefixed findutils in your path can cause python builds to fail.
|
|
|
|
EOS
|
|
|
|
rescue FormulaUnavailableError
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
2020-11-12 17:06:47 +00:00
|
|
|
def check_for_unsupported_macos
|
|
|
|
return if Homebrew::EnvConfig.developer?
|
2021-09-09 16:53:52 +01:00
|
|
|
return if ENV["HOMEBREW_INTEGRATION_TEST"]
|
2020-11-06 15:11:33 +00:00
|
|
|
|
2019-04-23 23:05:28 -07:00
|
|
|
who = +"We"
|
2021-06-22 13:06:46 -04:00
|
|
|
what = if OS::Mac.version.prerelease?
|
2020-11-12 17:06:47 +00:00
|
|
|
"pre-release version"
|
2021-06-22 13:06:46 -04:00
|
|
|
elsif OS::Mac.version.outdated_release?
|
2019-04-23 23:05:28 -07:00
|
|
|
who << " (and Apple)"
|
2020-11-12 17:06:47 +00:00
|
|
|
"old version"
|
2016-04-25 17:58:50 +01:00
|
|
|
end
|
2020-11-12 17:06:47 +00:00
|
|
|
return if what.blank?
|
|
|
|
|
2019-04-23 23:05:28 -07:00
|
|
|
who.freeze
|
2016-04-25 17:58:50 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-09-18 19:57:19 +01:00
|
|
|
You are using macOS #{MacOS.version}.
|
2016-04-25 17:58:50 +01:00
|
|
|
#{who} do not provide support for this #{what}.
|
2019-01-01 15:46:57 -08:00
|
|
|
#{please_create_pull_requests(what)}
|
2016-04-25 17:58:50 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-07-16 21:03:12 +01:00
|
|
|
def check_xcode_up_to_date
|
2016-11-05 10:36:52 -04:00
|
|
|
return unless MacOS::Xcode.outdated?
|
2016-04-25 17:58:50 +01:00
|
|
|
|
2018-09-30 11:10:19 +01:00
|
|
|
# CI images are going to end up outdated so don't complain when
|
2017-02-19 15:39:52 +00:00
|
|
|
# `brew test-bot` runs `brew doctor` in the CI for the Homebrew/brew
|
2018-09-30 11:10:19 +01:00
|
|
|
# repository. This only needs to support whatever CI providers
|
2017-02-17 21:53:30 +00:00
|
|
|
# Homebrew/brew is currently using.
|
2020-08-07 09:14:07 +01:00
|
|
|
return if ENV["GITHUB_ACTIONS"]
|
2016-11-26 13:09:59 +00:00
|
|
|
|
2022-05-31 16:32:23 +01:00
|
|
|
# With fake El Capitan for Portable Ruby, we are intentionally not using Xcode 8.
|
|
|
|
# This is because we are not using the CLT and Xcode 8 has the 10.12 SDK.
|
|
|
|
return if ENV["HOMEBREW_FAKE_EL_CAPITAN"]
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
message = <<~EOS
|
2016-10-02 17:30:08 +01:00
|
|
|
Your Xcode (#{MacOS::Xcode.version}) is outdated.
|
|
|
|
Please update to Xcode #{MacOS::Xcode.latest_version} (or delete it).
|
2016-09-09 22:10:43 +01:00
|
|
|
#{MacOS::Xcode.update_instructions}
|
|
|
|
EOS
|
|
|
|
|
2021-06-22 13:06:46 -04:00
|
|
|
if OS::Mac.version.prerelease?
|
2016-09-09 22:10:43 +01:00
|
|
|
current_path = Utils.popen_read("/usr/bin/xcode-select", "-p")
|
2017-10-15 02:28:32 +02:00
|
|
|
message += <<~EOS
|
2016-08-30 03:54:24 +01:00
|
|
|
If #{MacOS::Xcode.latest_version} is installed, you may need to:
|
2016-09-09 22:10:43 +01:00
|
|
|
sudo xcode-select --switch /Applications/Xcode.app
|
|
|
|
Current developer directory is:
|
|
|
|
#{current_path}
|
2016-08-30 03:54:24 +01:00
|
|
|
EOS
|
|
|
|
end
|
2016-09-09 22:10:43 +01:00
|
|
|
message
|
2016-07-16 21:03:12 +01:00
|
|
|
end
|
2016-04-25 17:58:50 +01:00
|
|
|
|
2016-07-16 21:03:12 +01:00
|
|
|
def check_clt_up_to_date
|
2016-11-05 10:36:52 -04:00
|
|
|
return unless MacOS::CLT.outdated?
|
2016-04-25 17:58:50 +01:00
|
|
|
|
2018-09-30 11:10:19 +01:00
|
|
|
# CI images are going to end up outdated so don't complain when
|
2017-04-02 17:24:33 +01:00
|
|
|
# `brew test-bot` runs `brew doctor` in the CI for the Homebrew/brew
|
2018-09-30 11:10:19 +01:00
|
|
|
# repository. This only needs to support whatever CI providers
|
2017-04-02 17:24:33 +01:00
|
|
|
# Homebrew/brew is currently using.
|
2020-08-07 09:14:07 +01:00
|
|
|
return if ENV["GITHUB_ACTIONS"]
|
2017-04-02 17:24:33 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-07-16 21:03:12 +01:00
|
|
|
A newer Command Line Tools release is available.
|
|
|
|
#{MacOS::CLT.update_instructions}
|
|
|
|
EOS
|
2016-04-25 17:58:50 +01:00
|
|
|
end
|
|
|
|
|
2016-11-05 10:36:13 -04:00
|
|
|
def check_xcode_minimum_version
|
2016-12-18 15:31:15 -08:00
|
|
|
return unless MacOS::Xcode.below_minimum_version?
|
2019-02-19 13:12:52 +00:00
|
|
|
|
2018-11-28 14:25:36 +00:00
|
|
|
xcode = MacOS::Xcode.version.to_s
|
|
|
|
xcode += " => #{MacOS::Xcode.prefix}" unless MacOS::Xcode.default_prefix?
|
2016-11-05 10:36:13 -04:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2018-11-28 14:25:36 +00:00
|
|
|
Your Xcode (#{xcode}) is too outdated.
|
2016-11-05 10:36:13 -04:00
|
|
|
Please update to Xcode #{MacOS::Xcode.latest_version} (or delete it).
|
|
|
|
#{MacOS::Xcode.update_instructions}
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_clt_minimum_version
|
2016-12-18 15:31:15 -08:00
|
|
|
return unless MacOS::CLT.below_minimum_version?
|
2016-11-05 10:36:13 -04:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-11-05 10:36:13 -04:00
|
|
|
Your Command Line Tools are too outdated.
|
|
|
|
#{MacOS::CLT.update_instructions}
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2017-11-17 19:53:38 +00:00
|
|
|
def check_if_xcode_needs_clt_installed
|
|
|
|
return unless MacOS::Xcode.needs_clt_installed?
|
|
|
|
|
|
|
|
<<~EOS
|
|
|
|
Xcode alone is not sufficient on #{MacOS.version.pretty_name}.
|
|
|
|
#{DevelopmentTools.installation_instructions}
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-04-25 17:58:50 +01:00
|
|
|
def check_ruby_version
|
2022-10-25 10:55:05 +01:00
|
|
|
return if RUBY_VERSION == HOMEBREW_REQUIRED_RUBY_VERSION
|
|
|
|
return if RUBY_VERSION == "2.6.10" # TODO: require 2.6.10
|
2021-06-22 13:06:46 -04:00
|
|
|
return if Homebrew::EnvConfig.developer? && OS::Mac.version.prerelease?
|
2016-04-25 17:58:50 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2021-10-21 20:06:34 +08:00
|
|
|
Ruby version #{RUBY_VERSION} is unsupported on macOS #{MacOS.version}. Homebrew
|
2022-10-25 10:55:05 +01:00
|
|
|
is developed and tested on Ruby #{HOMEBREW_REQUIRED_RUBY_VERSION}, and may not work correctly
|
2016-04-25 17:58:50 +01:00
|
|
|
on other Rubies. Patches are accepted as long as they don't cause breakage
|
|
|
|
on supported Rubies.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_xcode_prefix
|
|
|
|
prefix = MacOS::Xcode.prefix
|
|
|
|
return if prefix.nil?
|
|
|
|
return unless prefix.to_s.include?(" ")
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-25 17:58:50 +01:00
|
|
|
Xcode is installed to a directory with a space in the name.
|
|
|
|
This will cause some formulae to fail to build.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_xcode_prefix_exists
|
|
|
|
prefix = MacOS::Xcode.prefix
|
|
|
|
return if prefix.nil? || prefix.exist?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-25 17:58:50 +01:00
|
|
|
The directory Xcode is reportedly installed to doesn't exist:
|
|
|
|
#{prefix}
|
|
|
|
You may need to `xcode-select` the proper path if you have moved Xcode.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_xcode_select_path
|
|
|
|
return if MacOS::CLT.installed?
|
2016-11-12 11:31:27 +00:00
|
|
|
return unless MacOS::Xcode.installed?
|
2016-04-25 17:58:50 +01:00
|
|
|
return if File.file?("#{MacOS.active_developer_dir}/usr/bin/xcodebuild")
|
|
|
|
|
|
|
|
path = MacOS::Xcode.bundle_path
|
|
|
|
path = "/Developer" if path.nil? || !path.directory?
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-25 17:58:50 +01:00
|
|
|
Your Xcode is configured with an invalid path.
|
|
|
|
You should change it to the correct path:
|
2020-12-16 21:33:20 -05:00
|
|
|
sudo xcode-select --switch #{path}
|
2016-04-25 17:58:50 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_xcode_license_approved
|
|
|
|
# If the user installs Xcode-only, they have to approve the
|
|
|
|
# license or no "xc*" tool will work.
|
2020-07-07 13:12:37 +01:00
|
|
|
return unless `/usr/bin/xcrun clang 2>&1`.include?("license")
|
|
|
|
return if $CHILD_STATUS.success?
|
2016-04-25 17:58:50 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-25 17:58:50 +01:00
|
|
|
You have not agreed to the Xcode license.
|
2019-01-21 19:23:31 +00:00
|
|
|
Agree to the license by opening Xcode.app or running:
|
2016-04-25 17:58:50 +01:00
|
|
|
sudo xcodebuild -license
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2017-05-27 13:34:59 +01:00
|
|
|
def check_filesystem_case_sensitive
|
|
|
|
dirs_to_check = [
|
|
|
|
HOMEBREW_PREFIX,
|
|
|
|
HOMEBREW_REPOSITORY,
|
|
|
|
HOMEBREW_CELLAR,
|
|
|
|
HOMEBREW_TEMP,
|
|
|
|
]
|
|
|
|
case_sensitive_dirs = dirs_to_check.select do |dir|
|
|
|
|
# We select the dir as being case-sensitive if either the UPCASED or the
|
|
|
|
# downcased variant is missing.
|
|
|
|
# Of course, on a case-insensitive fs, both exist because the os reports so.
|
|
|
|
# In the rare situation when the user has indeed a downcased and an upcased
|
|
|
|
# dir (e.g. /TMP and /tmp) this check falsely thinks it is case-insensitive
|
|
|
|
# but we don't care because: 1. there is more than one dir checked, 2. the
|
|
|
|
# check is not vital and 3. we would have to touch files otherwise.
|
|
|
|
upcased = Pathname.new(dir.to_s.upcase)
|
|
|
|
downcased = Pathname.new(dir.to_s.downcase)
|
|
|
|
dir.exist? && !(upcased.exist? && downcased.exist?)
|
|
|
|
end
|
|
|
|
return if case_sensitive_dirs.empty?
|
|
|
|
|
|
|
|
volumes = Volumes.new
|
|
|
|
case_sensitive_vols = case_sensitive_dirs.map do |case_sensitive_dir|
|
|
|
|
volumes.get_mounts(case_sensitive_dir)
|
|
|
|
end
|
|
|
|
case_sensitive_vols.uniq!
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-05-27 13:34:59 +01:00
|
|
|
The filesystem on #{case_sensitive_vols.join(",")} appears to be case-sensitive.
|
|
|
|
The default macOS filesystem is case-insensitive. Please report any apparent problems.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2018-05-12 11:47:12 -05:00
|
|
|
def check_for_gettext
|
|
|
|
find_relative_paths("lib/libgettextlib.dylib",
|
|
|
|
"lib/libintl.dylib",
|
|
|
|
"include/libintl.h")
|
|
|
|
return if @found.empty?
|
|
|
|
|
|
|
|
# Our gettext formula will be caught by check_linked_keg_only_brews
|
|
|
|
gettext = begin
|
|
|
|
Formulary.factory("gettext")
|
|
|
|
rescue
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
if gettext&.linked_keg&.directory?
|
2021-06-15 11:51:29 +01:00
|
|
|
allowlist = ["#{HOMEBREW_CELLAR}/gettext"]
|
|
|
|
if Hardware::CPU.physical_cpu_arm64?
|
|
|
|
allowlist += %W[
|
|
|
|
#{HOMEBREW_MACOS_ARM_DEFAULT_PREFIX}/Cellar/gettext
|
|
|
|
#{HOMEBREW_DEFAULT_PREFIX}/Cellar/gettext
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
return if @found.all? do |path|
|
|
|
|
realpath = Pathname.new(path).realpath.to_s
|
|
|
|
allowlist.any? { |rack| realpath.start_with?(rack) }
|
2018-05-12 11:47:12 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
inject_file_list @found, <<~EOS
|
|
|
|
gettext files detected at a system prefix.
|
|
|
|
These files can cause compilation and link failures, especially if they
|
|
|
|
are compiled with improper architectures. Consider removing these files:
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_iconv
|
|
|
|
find_relative_paths("lib/libiconv.dylib", "include/iconv.h")
|
|
|
|
return if @found.empty?
|
|
|
|
|
|
|
|
libiconv = begin
|
|
|
|
Formulary.factory("libiconv")
|
|
|
|
rescue
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
if libiconv&.linked_keg&.directory?
|
|
|
|
unless libiconv.keg_only?
|
|
|
|
<<~EOS
|
|
|
|
A libiconv formula is installed and linked.
|
|
|
|
This will break stuff. For serious. Unlink it.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
else
|
|
|
|
inject_file_list @found, <<~EOS
|
|
|
|
libiconv files detected at a system prefix other than /usr.
|
|
|
|
Homebrew doesn't provide a libiconv formula, and expects to link against
|
|
|
|
the system version in /usr. libiconv in other prefixes can cause
|
|
|
|
compile or link failure, especially if compiled with improper
|
|
|
|
architectures. macOS itself never installs anything to /usr/local so
|
|
|
|
it was either installed by a user or some other third party software.
|
|
|
|
|
|
|
|
tl;dr: delete these files:
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_multiple_volumes
|
|
|
|
return unless HOMEBREW_CELLAR.exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2018-05-12 11:47:12 -05:00
|
|
|
volumes = Volumes.new
|
|
|
|
|
|
|
|
# Find the volumes for the TMP folder & HOMEBREW_CELLAR
|
|
|
|
real_cellar = HOMEBREW_CELLAR.realpath
|
|
|
|
where_cellar = volumes.which real_cellar
|
|
|
|
|
|
|
|
begin
|
|
|
|
tmp = Pathname.new(Dir.mktmpdir("doctor", HOMEBREW_TEMP))
|
|
|
|
begin
|
|
|
|
real_tmp = tmp.realpath.parent
|
|
|
|
where_tmp = volumes.which real_tmp
|
|
|
|
ensure
|
|
|
|
Dir.delete tmp
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
return if where_cellar == where_tmp
|
|
|
|
|
|
|
|
<<~EOS
|
|
|
|
Your Cellar and TEMP directories are on different volumes.
|
|
|
|
macOS won't move relative symlinks across volumes unless the target file already
|
|
|
|
exists. Brews known to be affected by this are Git and Narwhal.
|
|
|
|
|
2019-04-08 12:47:15 -04:00
|
|
|
You should set the "HOMEBREW_TEMP" environment variable to a suitable
|
2018-05-12 11:47:12 -05:00
|
|
|
directory on the same volume as your Cellar.
|
|
|
|
EOS
|
|
|
|
end
|
2020-05-08 09:18:55 +01:00
|
|
|
|
|
|
|
def check_deprecated_caskroom_taps
|
2020-05-20 10:05:23 +01:00
|
|
|
tapped_caskroom_taps = Tap.select { |t| t.user == "caskroom" || t.name == "phinze/cask" }
|
|
|
|
.map(&:name)
|
2020-05-08 09:18:55 +01:00
|
|
|
return if tapped_caskroom_taps.empty?
|
|
|
|
|
|
|
|
<<~EOS
|
|
|
|
You have the following deprecated, cask taps tapped:
|
2020-05-20 10:05:23 +01:00
|
|
|
#{tapped_caskroom_taps.join("\n ")}
|
2020-05-08 09:18:55 +01:00
|
|
|
Untap them with `brew untap`.
|
|
|
|
EOS
|
|
|
|
end
|
2020-07-01 16:02:29 +01:00
|
|
|
|
|
|
|
def check_if_supported_sdk_available
|
2021-02-05 12:26:28 +00:00
|
|
|
return unless DevelopmentTools.installed?
|
2020-07-01 16:02:29 +01:00
|
|
|
return unless MacOS.sdk_root_needed?
|
|
|
|
return if MacOS.sdk
|
|
|
|
|
|
|
|
locator = MacOS.sdk_locator
|
|
|
|
|
|
|
|
source = if locator.source == :clt
|
2021-03-30 04:23:25 +01:00
|
|
|
return if MacOS::CLT.below_minimum_version? # Handled by other diagnostics.
|
|
|
|
|
2020-11-20 13:30:00 +00:00
|
|
|
update_instructions = MacOS::CLT.update_instructions
|
2021-02-07 04:21:59 +00:00
|
|
|
"Command Line Tools (CLT)"
|
2020-07-01 16:02:29 +01:00
|
|
|
else
|
2021-03-30 04:23:25 +01:00
|
|
|
return if MacOS::Xcode.below_minimum_version? # Handled by other diagnostics.
|
|
|
|
|
2020-11-20 13:30:00 +00:00
|
|
|
update_instructions = MacOS::Xcode.update_instructions
|
2020-07-01 16:02:29 +01:00
|
|
|
"Xcode"
|
|
|
|
end
|
|
|
|
|
|
|
|
<<~EOS
|
2020-07-28 16:56:55 +01:00
|
|
|
Your #{source} does not support macOS #{MacOS.version}.
|
|
|
|
It is either outdated or was modified.
|
|
|
|
Please update your #{source} or delete it if no updates are available.
|
2020-11-20 13:30:00 +00:00
|
|
|
#{update_instructions}
|
2020-07-01 16:02:29 +01:00
|
|
|
EOS
|
|
|
|
end
|
2021-02-07 04:21:59 +00:00
|
|
|
|
|
|
|
# The CLT 10.x -> 11.x upgrade process on 10.14 contained a bug which broke the SDKs.
|
|
|
|
# Notably, MacOSX10.14.sdk would indirectly symlink to MacOSX10.15.sdk.
|
|
|
|
# This diagnostic was introduced to check for this and recommend a full reinstall.
|
|
|
|
def check_broken_sdks
|
|
|
|
locator = MacOS.sdk_locator
|
|
|
|
|
|
|
|
return if locator.all_sdks.all? do |sdk|
|
|
|
|
path_version = sdk.path.basename.to_s[MacOS::SDK::VERSIONED_SDK_REGEX, 1]
|
|
|
|
next true if path_version.blank?
|
|
|
|
|
|
|
|
sdk.version == MacOS::Version.new(path_version).strip_patch
|
|
|
|
end
|
|
|
|
|
|
|
|
if locator.source == :clt
|
|
|
|
source = "Command Line Tools (CLT)"
|
|
|
|
path_to_remove = MacOS::CLT::PKG_PATH
|
|
|
|
installation_instructions = MacOS::CLT.installation_instructions
|
|
|
|
else
|
|
|
|
source = "Xcode"
|
|
|
|
path_to_remove = MacOS::Xcode.bundle_path
|
|
|
|
installation_instructions = MacOS::Xcode.installation_instructions
|
|
|
|
end
|
|
|
|
|
|
|
|
<<~EOS
|
|
|
|
The contents of the SDKs in your #{source} installation do not match the SDK folder names.
|
|
|
|
A clean reinstall of #{source} should fix this.
|
|
|
|
|
|
|
|
Remove the broken installation before reinstalling:
|
|
|
|
sudo rm -rf #{path_to_remove}
|
|
|
|
|
|
|
|
#{installation_instructions}
|
|
|
|
EOS
|
|
|
|
end
|
2016-04-25 17:58:50 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|