Merge pull request #3422 from MikeMcQuaid/null-versions

mac/xcode: compare with existing Version class.
This commit is contained in:
Mike McQuaid 2017-11-05 19:11:50 +00:00 committed by GitHub
commit ffe523a7a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 69 additions and 55 deletions

View File

@ -1,5 +1,10 @@
require "development_tools" require "development_tools"
if OS.mac?
MACOS_FULL_VERSION = OS::Mac.full_version.to_s.freeze
MACOS_VERSION = OS::Mac.version.to_s.freeze
end
module OS module OS
module Mac module Mac
module_function module_function

View File

@ -50,7 +50,6 @@ module Homebrew
end end
def check_xcode_up_to_date def check_xcode_up_to_date
return unless MacOS::Xcode.installed?
return unless MacOS::Xcode.outdated? return unless MacOS::Xcode.outdated?
# Travis CI images are going to end up outdated so don't complain when # Travis CI images are going to end up outdated so don't complain when
@ -78,7 +77,6 @@ module Homebrew
end end
def check_clt_up_to_date def check_clt_up_to_date
return unless MacOS::CLT.installed?
return unless MacOS::CLT.outdated? return unless MacOS::CLT.outdated?
# Travis CI images are going to end up outdated so don't complain when # Travis CI images are going to end up outdated so don't complain when
@ -108,7 +106,6 @@ module Homebrew
end end
def check_xcode_minimum_version def check_xcode_minimum_version
return unless MacOS::Xcode.installed?
return unless MacOS::Xcode.below_minimum_version? return unless MacOS::Xcode.below_minimum_version?
<<~EOS <<~EOS
@ -119,7 +116,6 @@ module Homebrew
end end
def check_clt_minimum_version def check_clt_minimum_version
return unless MacOS::CLT.installed?
return unless MacOS::CLT.below_minimum_version? return unless MacOS::CLT.below_minimum_version?
<<~EOS <<~EOS
@ -281,13 +277,8 @@ module Homebrew
EOS EOS
end end
def check_for_latest_xquartz def check_xquartz_up_to_date
return unless MacOS::XQuartz.version return unless MacOS::XQuartz.outdated?
return if MacOS::XQuartz.provided_by_apple?
installed_version = Version.create(MacOS::XQuartz.version)
latest_version = Version.create(MacOS::XQuartz.latest_version)
return if installed_version >= latest_version
<<~EOS <<~EOS
Your XQuartz (#{installed_version}) is outdated. Your XQuartz (#{installed_version}) is outdated.
@ -298,8 +289,7 @@ module Homebrew
end end
def check_for_beta_xquartz def check_for_beta_xquartz
return unless MacOS::XQuartz.version return unless MacOS::XQuartz.version.to_s.include?("beta")
return unless MacOS::XQuartz.version.include? "beta"
<<~EOS <<~EOS
The following beta release of XQuartz is installed: #{MacOS::XQuartz.version} The following beta release of XQuartz is installed: #{MacOS::XQuartz.version}

View File

@ -91,18 +91,18 @@ module Superenv
generic_setup_build_environment(formula) generic_setup_build_environment(formula)
self["HOMEBREW_SDKROOT"] = effective_sysroot self["HOMEBREW_SDKROOT"] = effective_sysroot
if MacOS::Xcode.without_clt? || (MacOS::Xcode.installed? && MacOS::Xcode.version.to_i >= 7) if MacOS::Xcode.without_clt? || MacOS::Xcode.version.to_i >= 7
self["MACOSX_DEPLOYMENT_TARGET"] = MacOS.version.to_s self["MACOSX_DEPLOYMENT_TARGET"] = MacOS.version.to_s
self["SDKROOT"] = MacOS.sdk_path self["SDKROOT"] = MacOS.sdk_path
end end
# Filter out symbols known not to be defined since GNU Autotools can't # Filter out symbols known not to be defined since GNU Autotools can't
# reliably figure this out with Xcode 8 and above. # reliably figure this out with Xcode 8 and above.
if MacOS.version == "10.12" && MacOS::Xcode.installed? && MacOS::Xcode.version >= "9.0" if MacOS.version == "10.12" && MacOS::Xcode.version >= "9.0"
%w[fmemopen futimens open_memstream utimensat].each do |s| %w[fmemopen futimens open_memstream utimensat].each do |s|
ENV["ac_cv_func_#{s}"] = "no" ENV["ac_cv_func_#{s}"] = "no"
end end
elsif MacOS.version == "10.11" && MacOS::Xcode.installed? && MacOS::Xcode.version >= "8.0" elsif MacOS.version == "10.11" && MacOS::Xcode.version >= "8.0"
%w[basename_r clock_getres clock_gettime clock_settime dirname_r %w[basename_r clock_getres clock_gettime clock_settime dirname_r
getentropy mkostemp mkostemps timingsafe_bcmp].each do |s| getentropy mkostemp mkostemps timingsafe_bcmp].each do |s|
ENV["ac_cv_func_#{s}"] = "no" ENV["ac_cv_func_#{s}"] = "no"

View File

@ -4,7 +4,7 @@ class SystemConfig
if instance_variable_defined?(:@xcode) if instance_variable_defined?(:@xcode)
@xcode @xcode
elsif MacOS::Xcode.installed? elsif MacOS::Xcode.installed?
@xcode = MacOS::Xcode.version @xcode = MacOS::Xcode.version.to_s
@xcode += " => #{MacOS::Xcode.prefix}" unless MacOS::Xcode.default_prefix? @xcode += " => #{MacOS::Xcode.prefix}" unless MacOS::Xcode.default_prefix?
@xcode @xcode
end end

View File

@ -20,9 +20,6 @@ module OS
ISSUES_URL = "https://docs.brew.sh/Troubleshooting.html".freeze ISSUES_URL = "https://docs.brew.sh/Troubleshooting.html".freeze
end end
PATH_OPEN = "/usr/bin/open".freeze PATH_OPEN = "/usr/bin/open".freeze
# compatibility
::MACOS_FULL_VERSION = OS::Mac.full_version.to_s.freeze
::MACOS_VERSION = OS::Mac.version.to_s.freeze
elsif OS.linux? elsif OS.linux?
ISSUES_URL = "https://github.com/Linuxbrew/brew/wiki/troubleshooting".freeze ISSUES_URL = "https://github.com/Linuxbrew/brew/wiki/troubleshooting".freeze
PATH_OPEN = "xdg-open".freeze PATH_OPEN = "xdg-open".freeze

View File

@ -36,15 +36,17 @@ module OS
end end
def below_minimum_version? def below_minimum_version?
return false unless installed?
version < minimum_version version < minimum_version
end end
def outdated? def outdated?
Version.new(version) < latest_version return false unless installed?
version < latest_version
end end
def without_clt? def without_clt?
installed? && Version.new(version) >= "4.3" && !MacOS::CLT.installed? version >= "4.3" && !MacOS::CLT.installed?
end end
# Returns a Pathname object corresponding to Xcode.app's Developer # Returns a Pathname object corresponding to Xcode.app's Developer
@ -65,8 +67,7 @@ module OS
end end
def toolchain_path def toolchain_path
return unless installed? return if version < "4.3"
return if Version.new(version) < "4.3"
Pathname.new("#{prefix}/Toolchains/XcodeDefault.xctoolchain") Pathname.new("#{prefix}/Toolchains/XcodeDefault.xctoolchain")
end end
@ -101,16 +102,17 @@ module OS
# may return a version string # may return a version string
# that is guessed based on the compiler, so do not # that is guessed based on the compiler, so do not
# use it in order to check if Xcode is installed. # use it in order to check if Xcode is installed.
@version ||= uncached_version if @version ||= detect_version
::Version.new @version
else
::Version::NULL
end
end end
def uncached_version def detect_version
# This is a separate function as you can't cache the value out of a block # This is a separate function as you can't cache the value out of a block
# if return is used in the middle, which we do many times in here. # if return is used in the middle, which we do many times in here.
return if !MacOS::Xcode.installed? && !MacOS::CLT.installed?
return "0" unless OS.mac?
return nil if !MacOS::Xcode.installed? && !MacOS::CLT.installed?
%W[ %W[
#{prefix}/usr/bin/xcodebuild #{prefix}/usr/bin/xcodebuild
@ -160,26 +162,20 @@ module OS
end end
def provides_gcc? def provides_gcc?
installed? && Version.new(version) < "4.3" version < "4.3"
end end
def provides_cvs? def provides_cvs?
installed? && Version.new(version) < "5.0" version < "5.0"
end end
def default_prefix? def default_prefix?
if Version.new(version) < "4.3" if version < "4.3"
prefix.to_s.start_with? "/Developer" prefix.to_s.start_with? "/Developer"
else else
prefix.to_s == "/Applications/Xcode.app/Contents/Developer" prefix.to_s == "/Applications/Xcode.app/Contents/Developer"
end end
end end
class Version < ::Version
def <=>(other)
super(Version.new(other))
end
end
end end
module CLT module CLT
@ -194,7 +190,7 @@ module OS
# Returns true even if outdated tools are installed, e.g. # Returns true even if outdated tools are installed, e.g.
# tools from Xcode 4.x on 10.9 # tools from Xcode 4.x on 10.9
def installed? def installed?
!detect_version.nil? !version.null?
end end
def update_instructions def update_instructions
@ -238,43 +234,55 @@ module OS
def below_minimum_version? def below_minimum_version?
# Lion was the first version of OS X to ship with a CLT # Lion was the first version of OS X to ship with a CLT
return false if MacOS.version < :lion return false if MacOS.version < :lion
return false unless installed?
version < minimum_version version < minimum_version
end end
def outdated? def outdated?
# Lion was the first version of OS X to ship with a CLT clang_version = detect_clang_version
return false if MacOS.version < :lion return false unless clang_version
::Version.new(clang_version) < latest_version
if MacOS.version >= :mavericks
version = Utils.popen_read("#{PKG_PATH}/usr/bin/clang --version")
else
version = Utils.popen_read("/usr/bin/clang --version")
end end
version = version[/clang-(\d+\.\d+\.\d+(\.\d+)?)/, 1] || "0"
Xcode::Version.new(version) < latest_version def detect_clang_version
# Lion was the first version of OS X to ship with a CLT
return if MacOS.version < :lion
path = if MacOS.version >= :mavericks
"#{PKG_PATH}/usr/bin/clang"
else
"/usr/bin/clang"
end
version_output = Utils.popen_read("#{path} --version")
version_output[/clang-(\d+\.\d+\.\d+(\.\d+)?)/, 1]
end end
# Version string (a pretty long one) of the CLT package. # Version string (a pretty long one) of the CLT package.
# Note, that different ways to install the CLTs lead to different # Note, that different ways to install the CLTs lead to different
# version numbers. # version numbers.
def version def version
@version ||= detect_version if @version ||= detect_version
::Version.new @version
else
::Version::NULL
end
end end
def detect_version def detect_version
# CLT isn't a distinct entity pre-4.3, and pkgutil doesn't exist # CLT isn't a distinct entity pre-4.3, and pkgutil doesn't exist
# at all on Tiger, so just count it as installed if Xcode is installed # at all on Tiger, so just count it as installed if Xcode is installed
if MacOS::Xcode.installed? && Xcode::Version.new(MacOS::Xcode.version) < "3.0" return MacOS::Xcode.version if MacOS::Xcode.version < "3.0"
return MacOS::Xcode.version
end
[MAVERICKS_PKG_ID, MAVERICKS_NEW_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID].find do |id| version = nil
[MAVERICKS_PKG_ID, MAVERICKS_NEW_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID].each do |id|
if MacOS.version >= :mavericks if MacOS.version >= :mavericks
next unless File.exist?("#{PKG_PATH}/usr/bin/clang") next unless File.exist?("#{PKG_PATH}/usr/bin/clang")
end end
version = MacOS.pkgutil_info(id)[/version: (.+)$/, 1] version = MacOS.pkgutil_info(id)[/version: (.+)$/, 1]
return version if version break if version
end end
version
end end
end end
end end

View File

@ -34,7 +34,11 @@ module OS
# The X11.app distributed by Apple is also XQuartz, and therefore covered # The X11.app distributed by Apple is also XQuartz, and therefore covered
# by this method. # by this method.
def version def version
@version ||= detect_version if @version ||= detect_version
::Version.new @version
else
::Version::NULL
end
end end
def detect_version def detect_version
@ -115,7 +119,13 @@ module OS
end end
def installed? def installed?
!version.nil? && !prefix.nil? !version.null? && !prefix.nil?
end
def outdated?
return false unless installed?
return false if provided_by_apple?
version < latest_version
end end
# If XQuartz and/or the CLT are installed, headers will be found under # If XQuartz and/or the CLT are installed, headers will be found under

View File

@ -431,6 +431,10 @@ class Version
version.to_f version.to_f
end end
def to_i
version.to_i
end
def to_s def to_s
version.dup version.dup
end end