Install: add BuildToolsError and BuildFlagsError
Add these new errors, and guards in formula installation and
cmd/{,un,re}install to match, move can_build? to the MacOS module,
flatten conditions, remove redundant can_build? check
reinstate removed (doctor) check
This commit is contained in:
parent
76dcad7c82
commit
91e598cf3f
@ -38,6 +38,14 @@ module Homebrew
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# if the user's flags will prevent bottle only-installations when no
|
||||||
|
# developer tools are available, we need to stop them early on
|
||||||
|
if !MacOS.can_build?
|
||||||
|
bf = ARGV.collect_build_flags
|
||||||
|
|
||||||
|
raise BuildFlagsError.new(bf) if !bf.empty?
|
||||||
|
end
|
||||||
|
|
||||||
ARGV.formulae.each do |f|
|
ARGV.formulae.each do |f|
|
||||||
# head-only without --HEAD is an error
|
# head-only without --HEAD is an error
|
||||||
if !ARGV.build_head? && f.stable.nil? && f.devel.nil?
|
if !ARGV.build_head? && f.stable.nil? && f.devel.nil?
|
||||||
@ -129,6 +137,9 @@ module Homebrew
|
|||||||
# when one is no longer required
|
# when one is no longer required
|
||||||
checks = Checks.new
|
checks = Checks.new
|
||||||
%w[
|
%w[
|
||||||
|
check_for_unsupported_osx
|
||||||
|
check_for_bad_install_name_tool
|
||||||
|
check_for_installed_developer_tools
|
||||||
check_xcode_license_approved
|
check_xcode_license_approved
|
||||||
check_for_osx_gcc_installer
|
check_for_osx_gcc_installer
|
||||||
].each do |check|
|
].each do |check|
|
||||||
@ -157,12 +168,7 @@ module Homebrew
|
|||||||
def perform_preinstall_checks
|
def perform_preinstall_checks
|
||||||
check_ppc
|
check_ppc
|
||||||
check_writable_install_location
|
check_writable_install_location
|
||||||
if MacOS::Xcode.installed?
|
check_xcode if MacOS::Xcode.installed?
|
||||||
check_xcode
|
|
||||||
else
|
|
||||||
opoo "You have not installed Xcode."
|
|
||||||
puts "Bottles may install correctly, but builds will fail!"
|
|
||||||
end
|
|
||||||
check_cellar
|
check_cellar
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,14 @@ require "formula_installer"
|
|||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
def reinstall
|
def reinstall
|
||||||
|
if !MacOS.can_build?
|
||||||
|
bf = ARGV.collect_build_flags
|
||||||
|
|
||||||
|
if !bf.empty?
|
||||||
|
raise BuildFlagsError.new(bf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
ARGV.resolved_formulae.each { |f| reinstall_formula(f) }
|
ARGV.resolved_formulae.each { |f| reinstall_formula(f) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,14 @@ require "cmd/outdated"
|
|||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
def upgrade
|
def upgrade
|
||||||
|
if !MacOS.can_build?
|
||||||
|
bf = ARGV.collect_build_flags
|
||||||
|
|
||||||
|
if !bf.empty?
|
||||||
|
raise BuildFlagsError.new(bf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Homebrew.perform_preinstall_checks
|
Homebrew.perform_preinstall_checks
|
||||||
|
|
||||||
if ARGV.named.empty?
|
if ARGV.named.empty?
|
||||||
|
|||||||
@ -226,6 +226,100 @@ class BuildError < RuntimeError
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# raised by FormulaInstaller.check_dependencies_bottled and
|
||||||
|
# FormulaInstaller.install if the formula or its dependencies are not bottled
|
||||||
|
# and are being installed on a system without necessary build tools
|
||||||
|
class BuildToolsError < RuntimeError
|
||||||
|
def initialize(formulae)
|
||||||
|
if formulae.length > 1
|
||||||
|
formula_text = "formulae"
|
||||||
|
package_text = "binary packages"
|
||||||
|
else
|
||||||
|
formula_text = "formula"
|
||||||
|
package_text = "a binary package"
|
||||||
|
end
|
||||||
|
|
||||||
|
if MacOS.version >= "10.10"
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
To continue, you must install Xcode from the App Store,
|
||||||
|
or the CLT by running:
|
||||||
|
xcode-select --install
|
||||||
|
EOS
|
||||||
|
elsif MacOS.version == "10.9"
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
To continue, you must install Xcode from:
|
||||||
|
https://developer.apple.com/downloads/
|
||||||
|
or the CLT by running:
|
||||||
|
xcode-select --install
|
||||||
|
EOS
|
||||||
|
elsif MacOS.version >= "10.7"
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
To continue, you must install Xcode or the CLT from:
|
||||||
|
https://developer.apple.com/downloads/
|
||||||
|
EOS
|
||||||
|
else
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
To continue, you must install Xcode from:
|
||||||
|
https://developer.apple.com/downloads/
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
|
||||||
|
super <<-EOS.undent
|
||||||
|
The following #{formula_text}:
|
||||||
|
#{formulae.join(', ')}
|
||||||
|
cannot be installed as a #{package_text} and must be built from source.
|
||||||
|
#{xcode_text}
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# raised by Homebrew.install, Homebrew.reinstall, and Homebrew.upgrade
|
||||||
|
# if the user passes any flags/environment that would case a bottle-only
|
||||||
|
# installation on a system without build tools to fail
|
||||||
|
class BuildFlagsError < RuntimeError
|
||||||
|
def initialize(flags)
|
||||||
|
if flags.length > 1
|
||||||
|
flag_text = "flags"
|
||||||
|
require_text = "require"
|
||||||
|
else
|
||||||
|
flag_text = "flag"
|
||||||
|
require_text = "requires"
|
||||||
|
end
|
||||||
|
|
||||||
|
if MacOS.version >= "10.10"
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
or install Xcode from the App Store, or the CLT by running:
|
||||||
|
xcode-select --install
|
||||||
|
EOS
|
||||||
|
elsif MacOS.version == "10.9"
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
or install Xcode from:
|
||||||
|
https://developer.apple.com/downloads/
|
||||||
|
or the CLT by running:
|
||||||
|
xcode-select --install
|
||||||
|
EOS
|
||||||
|
elsif MacOS.version >= "10.7"
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
or install Xcode or the CLT from:
|
||||||
|
https://developer.apple.com/downloads/
|
||||||
|
EOS
|
||||||
|
else
|
||||||
|
xcode_text = <<-EOS.undent
|
||||||
|
or install Xcode from:
|
||||||
|
https://developer.apple.com/downloads/
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
|
||||||
|
super <<-EOS.undent
|
||||||
|
The following #{flag_text}:
|
||||||
|
#{flags.join(', ')}
|
||||||
|
#{require_text} building tools, but none are installed.
|
||||||
|
Either remove the #{flag_text} to attempt bottle installation,
|
||||||
|
#{xcode_text}
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# raised by CompilerSelector if the formula fails with all of
|
# raised by CompilerSelector if the formula fails with all of
|
||||||
# the compilers available on the user's system
|
# the compilers available on the user's system
|
||||||
class CompilerSelectionError < RuntimeError
|
class CompilerSelectionError < RuntimeError
|
||||||
|
|||||||
@ -200,6 +200,19 @@ module HomebrewArgvExtension
|
|||||||
value "env"
|
value "env"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# collect any supplied build flags into an array for reporting
|
||||||
|
def collect_build_flags
|
||||||
|
build_flags = []
|
||||||
|
|
||||||
|
build_flags << '--HEAD' if build_head?
|
||||||
|
build_flags << '--universal' if build_universal?
|
||||||
|
build_flags << '--32-bit' if build_32_bit?
|
||||||
|
build_flags << '--build-bottle' if build_bottle?
|
||||||
|
build_flags << '--build-from-source' if build_from_source?
|
||||||
|
|
||||||
|
build_flags
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def spec(default = :stable)
|
def spec(default = :stable)
|
||||||
|
|||||||
@ -147,6 +147,10 @@ class FormulaInstaller
|
|||||||
|
|
||||||
check_conflicts
|
check_conflicts
|
||||||
|
|
||||||
|
if !pour_bottle? && !MacOS.can_build?
|
||||||
|
raise BuildToolsError.new([formula])
|
||||||
|
end
|
||||||
|
|
||||||
if !ignore_deps?
|
if !ignore_deps?
|
||||||
deps = compute_dependencies
|
deps = compute_dependencies
|
||||||
check_dependencies_bottled(deps) if pour_bottle?
|
check_dependencies_bottled(deps) if pour_bottle?
|
||||||
|
|||||||
@ -52,6 +52,10 @@ module OS
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def can_build?
|
||||||
|
Xcode.installed? || CLT.installed?
|
||||||
|
end
|
||||||
|
|
||||||
def active_developer_dir
|
def active_developer_dir
|
||||||
@active_developer_dir ||= Utils.popen_read("/usr/bin/xcode-select", "-print-path").strip
|
@active_developer_dir ||= Utils.popen_read("/usr/bin/xcode-select", "-print-path").strip
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user