| 
									
										
										
										
											2014-06-16 13:36:17 -05:00
										 |  |  | require "blacklist" | 
					
						
							|  |  |  | require "cmd/doctor" | 
					
						
							|  |  |  | require "cmd/search" | 
					
						
							|  |  |  | require "cmd/tap" | 
					
						
							|  |  |  | require "formula_installer" | 
					
						
							|  |  |  | require "hardware" | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 22:41:47 -05:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   def install | 
					
						
							| 
									
										
										
										
											2012-02-04 00:01:29 -06:00
										 |  |  |     raise FormulaUnspecifiedError if ARGV.named.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 21:25:26 -08:00
										 |  |  |     if ARGV.include? '--head' | 
					
						
							|  |  |  |       raise "Specify `--HEAD` in uppercase to build from trunk." | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-14 03:52:59 +00:00
										 |  |  |     ARGV.named.each do |name| | 
					
						
							| 
									
										
										
										
											2012-08-06 14:18:03 -04:00
										 |  |  |       # if a formula has been tapped ignore the blacklisting | 
					
						
							| 
									
										
										
										
											2014-02-28 16:51:15 -06:00
										 |  |  |       unless Formula.path(name).file? | 
					
						
							| 
									
										
										
										
											2012-08-06 14:18:03 -04:00
										 |  |  |         msg = blacklisted? name | 
					
						
							|  |  |  |         raise "No available formula for #{name}\n#{msg}" if msg | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-10-22 11:58:33 +01:00
										 |  |  |       if not File.exist? name and name =~ HOMEBREW_TAP_FORMULA_REGEX then | 
					
						
							| 
									
										
										
										
											2014-01-03 21:51:42 +00:00
										 |  |  |         install_tap $1, $2 | 
					
						
							| 
									
										
										
										
											2013-10-21 04:25:24 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |     end unless ARGV.force? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-21 15:46:57 +01:00
										 |  |  |     begin | 
					
						
							|  |  |  |       ARGV.formulae.each do |f| | 
					
						
							|  |  |  |         # Building head-only without --HEAD is an error | 
					
						
							|  |  |  |         if not ARGV.build_head? and f.stable.nil? | 
					
						
							|  |  |  |           raise CannotInstallFormulaError, <<-EOS.undent
 | 
					
						
							|  |  |  |           #{f} is a head-only formula | 
					
						
							|  |  |  |           Install with `brew install --HEAD #{f.name}` | 
					
						
							|  |  |  |           EOS | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-06-16 13:38:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-21 15:46:57 +01:00
										 |  |  |         # Building stable-only with --HEAD is an error | 
					
						
							|  |  |  |         if ARGV.build_head? and f.head.nil? | 
					
						
							|  |  |  |           raise CannotInstallFormulaError, "No head is defined for #{f.name}" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-06-16 13:38:14 -05:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-21 15:46:57 +01:00
										 |  |  |       perform_preinstall_checks | 
					
						
							| 
									
										
										
										
											2014-03-15 10:40:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       ARGV.formulae.each { |f| install_formula(f) } | 
					
						
							| 
									
										
										
										
											2013-10-30 12:33:20 -07:00
										 |  |  |     rescue FormulaUnavailableError => e | 
					
						
							|  |  |  |       ofail e.message | 
					
						
							|  |  |  |       puts 'Searching taps...' | 
					
						
							|  |  |  |       puts_columns(search_taps(query_regexp(e.name))) | 
					
						
							| 
									
										
										
										
											2013-09-05 12:24:21 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |   def check_ppc | 
					
						
							| 
									
										
										
										
											2013-06-13 12:04:58 -05:00
										 |  |  |     case Hardware::CPU.type when :ppc, :dunno | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |       abort <<-EOS.undent
 | 
					
						
							|  |  |  |         Sorry, Homebrew does not support your computer's CPU architecture. | 
					
						
							| 
									
										
										
										
											2012-12-27 21:54:54 -04:00
										 |  |  |         For PPC support, see: https://github.com/mistydemeo/tigerbrew | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |         EOS | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |   def check_writable_install_location | 
					
						
							| 
									
										
										
										
											2012-07-28 11:36:08 -07:00
										 |  |  |     raise "Cannot write to #{HOMEBREW_CELLAR}" if HOMEBREW_CELLAR.exist? and not HOMEBREW_CELLAR.writable_real? | 
					
						
							|  |  |  |     raise "Cannot write to #{HOMEBREW_PREFIX}" unless HOMEBREW_PREFIX.writable_real? or HOMEBREW_PREFIX.to_s == '/usr/local' | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-19 11:26:39 -05:00
										 |  |  |   def check_xcode | 
					
						
							| 
									
										
										
										
											2012-08-31 10:20:20 -04:00
										 |  |  |     checks = Checks.new | 
					
						
							| 
									
										
										
										
											2014-05-12 14:46:50 -05:00
										 |  |  |     %w[
 | 
					
						
							|  |  |  |       check_for_installed_developer_tools | 
					
						
							|  |  |  |       check_xcode_license_approved | 
					
						
							|  |  |  |       check_for_osx_gcc_installer | 
					
						
							| 
									
										
										
										
											2014-06-03 22:49:51 -07:00
										 |  |  |       check_for_bad_install_name_tool | 
					
						
							| 
									
										
										
										
											2014-05-12 14:46:50 -05:00
										 |  |  |     ].each do |check| | 
					
						
							| 
									
										
										
										
											2012-08-31 10:20:20 -04:00
										 |  |  |       out = checks.send(check) | 
					
						
							|  |  |  |       opoo out unless out.nil? | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |   def check_macports | 
					
						
							| 
									
										
										
										
											2012-12-17 17:05:53 -06:00
										 |  |  |     unless MacOS.macports_or_fink.empty? | 
					
						
							| 
									
										
										
										
											2011-09-01 10:14:26 -07:00
										 |  |  |       opoo "It appears you have MacPorts or Fink installed." | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |       puts "Software installed with other package managers causes known problems for" | 
					
						
							| 
									
										
										
										
											2011-09-01 10:14:26 -07:00
										 |  |  |       puts "Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again." | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 10:57:03 +01:00
										 |  |  |   def check_cellar | 
					
						
							|  |  |  |     FileUtils.mkdir_p HOMEBREW_CELLAR if not File.exist? HOMEBREW_CELLAR | 
					
						
							|  |  |  |   rescue | 
					
						
							|  |  |  |     raise <<-EOS.undent
 | 
					
						
							|  |  |  |       Could not create #{HOMEBREW_CELLAR} | 
					
						
							|  |  |  |       Check you have permission to write to #{HOMEBREW_CELLAR.parent} | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-23 23:30:52 +01:00
										 |  |  |   def perform_preinstall_checks | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  |     check_ppc | 
					
						
							|  |  |  |     check_writable_install_location | 
					
						
							| 
									
										
										
										
											2012-03-19 11:26:39 -05:00
										 |  |  |     check_xcode | 
					
						
							| 
									
										
										
										
											2011-09-15 10:57:03 +01:00
										 |  |  |     check_cellar | 
					
						
							| 
									
										
										
										
											2011-08-23 23:30:52 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-11-09 12:57:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-08 19:54:32 -06:00
										 |  |  |   def install_formula f | 
					
						
							|  |  |  |     fi = FormulaInstaller.new(f) | 
					
						
							| 
									
										
										
										
											2014-03-13 10:11:00 -05:00
										 |  |  |     fi.options             = f.build.used_options | 
					
						
							| 
									
										
										
										
											2014-08-30 15:02:38 -05:00
										 |  |  |     fi.ignore_deps         = ARGV.ignore_deps? | 
					
						
							| 
									
										
										
										
											2014-03-13 10:11:00 -05:00
										 |  |  |     fi.only_deps           = ARGV.only_deps? | 
					
						
							|  |  |  |     fi.build_bottle        = ARGV.build_bottle? | 
					
						
							|  |  |  |     fi.build_from_source   = ARGV.build_from_source? | 
					
						
							|  |  |  |     fi.force_bottle        = ARGV.force_bottle? | 
					
						
							|  |  |  |     fi.interactive         = ARGV.interactive? | 
					
						
							|  |  |  |     fi.interactive       &&= :git if ARGV.flag? "--git" | 
					
						
							|  |  |  |     fi.verbose             = ARGV.verbose? | 
					
						
							|  |  |  |     fi.verbose           &&= :quieter if ARGV.quieter? | 
					
						
							|  |  |  |     fi.debug               = ARGV.debug? | 
					
						
							| 
									
										
										
										
											2014-03-04 14:06:25 -06:00
										 |  |  |     fi.prelude | 
					
						
							| 
									
										
										
										
											2013-01-08 19:54:32 -06:00
										 |  |  |     fi.install | 
					
						
							|  |  |  |     fi.caveats | 
					
						
							|  |  |  |     fi.finish | 
					
						
							|  |  |  |   rescue FormulaInstallationAlreadyAttemptedError | 
					
						
							|  |  |  |     # We already attempted to install f as part of the dependency tree of | 
					
						
							|  |  |  |     # another formula. In that case, don't generate an error, just move on. | 
					
						
							| 
									
										
										
										
											2013-04-03 18:26:40 -05:00
										 |  |  |   rescue FormulaAlreadyInstalledError => e | 
					
						
							|  |  |  |     opoo e.message | 
					
						
							| 
									
										
										
										
											2014-03-15 10:40:18 -05:00
										 |  |  |   rescue CannotInstallFormulaError => e | 
					
						
							|  |  |  |     ofail e.message | 
					
						
							| 
									
										
										
										
											2014-04-25 14:22:41 -04:00
										 |  |  |     check_macports | 
					
						
							| 
									
										
										
										
											2013-01-08 19:54:32 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | end |