Merge pull request #3422 from MikeMcQuaid/null-versions
mac/xcode: compare with existing Version class.
This commit is contained in:
commit
ffe523a7a8
@ -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
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user