Skip to content
Snippets Groups Projects
Commit 91e598cf authored by William Woodruff's avatar William Woodruff Committed by Misty De Meo
Browse files

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
parent 76dcad7c
No related branches found
No related tags found
No related merge requests found
...@@ -38,6 +38,14 @@ module Homebrew ...@@ -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 ...@@ -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 ...@@ -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" ...@@ -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" ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment