brew/Library/Homebrew/install.rb

215 lines
6.4 KiB
Ruby
Raw Normal View History

#!/usr/bin/ruby
require 'global'
def text_for_keg_only_formula f
if f.keg_only? == :provided_by_osx
2010-10-30 21:44:54 -07:00
rationale = "Mac OS X already provides this program and installing another version in\nparallel can cause all kinds of trouble."
elsif f.keg_only?.kind_of? String
2009-09-30 17:18:40 +01:00
rationale = "The formula provides the following rationale:\n\n#{f.keg_only?.chomp}"
else
rationale = "The formula didn't provide any rationale for this."
end
<<-EOS
2010-11-09 13:00:33 +00:00
This formula is keg-only. This means it is not symlinked into #{HOMEBREW_PREFIX}.
2010-10-30 21:44:54 -07:00
#{rationale}
2010-10-30 21:44:54 -07:00
Generally there are no consequences of this for you, however if you build
your own software and it requires this formula, you may want to run this
command to link it into the Homebrew prefix:
$ brew link #{f.name}
EOS
end
# I like this little at all, but see no alternative seeing as the formula
# rb file has to be the running script to allow it to use __END__ and DATA
at_exit do
begin
raise $! if $! # an exception was already thrown when parsing the formula
require 'extend/ENV'
require 'fileutils'
require 'hardware'
require 'keg'
require 'compatibility'
ENV.extend(HomebrewEnvExtension)
ENV.setup_build_environment
install(Formula.factory($0))
rescue Exception => e
if ENV['HOMEBREW_ERROR_PIPE']
pipe = IO.new(ENV['HOMEBREW_ERROR_PIPE'].to_i, 'w')
Marshal.dump(e, pipe)
pipe.close
exit! 1
else
onoe e
puts e.backtrace
exit! 2
end
end
end
2011-02-13 13:50:44 +00:00
ORIGINAL_PATHS = ENV['PATH'].split(':').map{ |p| File.expand_path p }
HOMEBREW_BIN = (HOMEBREW_PREFIX+'bin').to_s
def install f
show_summary_heading = false
2011-02-13 13:50:44 +00:00
# we must do this or tools like pkg-config won't get found by configure scripts etc.
ENV.prepend 'PATH', HOMEBREW_BIN, ':' unless ORIGINAL_PATHS.include? HOMEBREW_BIN
f.deps.uniq.each do |dep|
dep = Formula.factory dep
if dep.keg_only?
ENV.prepend 'LDFLAGS', "-L#{dep.lib}"
ENV.prepend 'CPPFLAGS', "-I#{dep.include}"
ENV.prepend 'PATH', "#{dep.bin}", ':'
ENV.prepend 'PKG_CONFIG_PATH', dep.lib+'pkgconfig', ':'
end
end
if ARGV.verbose?
ohai "Build Environment"
dump_build_env ENV
end
build_time = nil
begin
f.brew do
if ARGV.flag? '--interactive'
ohai "Entering interactive mode"
puts "Type `exit' to return and finalize the installation"
puts "Install to this prefix: #{f.prefix}"
if ARGV.flag? '--git'
system "git init"
system "git add -A"
puts "This folder is now a git repo. Make your changes and then use:"
puts " git diff | pbcopy"
puts "to copy the diff to the clipboard."
end
interactive_shell f
nil
elsif ARGV.include? '--help'
system './configure --help'
exit $?
else
f.prefix.mkpath
beginning=Time.now
f.install
2010-08-21 11:45:08 -07:00
FORMULA_META_FILES.each do |filename|
next if File.directory? filename
target_file = filename
target_file = "#{filename}.txt" if File.exists? "#{filename}.txt"
# Some software symlinks these files (see help2man.rb)
target_file = Pathname.new(target_file).resolved_path
f.prefix.install target_file => filename rescue nil
(f.prefix+file).chmod 0644 rescue nil
end
build_time = Time.now-beginning
end
end
rescue Exception
if f.prefix.directory?
f.prefix.rmtree
f.prefix.parent.rmdir_if_possible
end
raise
end
if f.caveats
ohai "Caveats", f.caveats
show_summary_heading = true
end
ohai 'Finishing up' if ARGV.verbose?
keg = Keg.new f.prefix
begin
keg.fix_install_names
rescue Exception => e
onoe "Failed to fix install names"
puts "The formula built, but you may encounter issues using it or linking other"
puts "formula against it."
ohai e, e.backtrace if ARGV.debug?
show_summary_heading = true
end
begin
require 'cleaner'
Cleaner.new f
rescue Exception => e
opoo "The cleaning step did not complete successfully"
puts "Still, the installation was successful, so we will link it into your prefix"
ohai e, e.backtrace if ARGV.debug?
show_summary_heading = true
end
raise "Nothing was installed to #{f.prefix}" unless f.installed?
if f.keg_only?
ohai 'Caveats', text_for_keg_only_formula(f)
show_summary_heading = true
else
2010-05-02 18:12:48 -07:00
# warn the user if stuff was installed outside of their PATH
[f.bin, f.sbin].each do |bin|
if bin.directory?
bin = File.expand_path bin
2011-02-13 13:50:44 +00:00
unless ORIGINAL_PATHS.include? HOMEBREW_BIN
opoo "#{HOMEBREW_BIN} is not in your PATH"
2010-05-02 18:12:48 -07:00
puts "You can amend this by altering your ~/.bashrc file"
show_summary_heading = true
end
end
end
# Check for man pages that aren't in share/man
2010-11-09 13:00:33 +00:00
if (f.prefix/:man).exist?
opoo 'A top-level "man" folder was found.'
puts "Homebrew requires that man pages live under share."
2010-07-20 20:52:01 -07:00
puts 'This can often be fixed by passing "--mandir=#{man}" to configure.'
end
2010-10-03 20:23:51 -07:00
# Check for info pages that aren't in share/info
if (f.prefix+'info').exist?
opoo 'A top-level "info" folder was found.'
puts "Homebrew suggests that info pages live under share."
puts 'This can often be fixed by passing "--infodir=#{info}" to configure.'
end
# Check for Jars in lib
2010-08-21 14:11:55 -07:00
if File.exist?(f.lib)
unless f.lib.children.select{|g| g.to_s =~ /\.jar$/}.empty?
opoo 'JARs were installed to "lib".'
puts "Installing JARs to \"lib\" can cause conflicts between packages."
puts "For Java software, it is typically better for the formula to"
puts "install to \"libexec\" and then symlink or wrap binaries into \"bin\"."
puts "See \"activemq\", \"jruby\", etc. for examples."
end
end
2010-05-02 18:12:48 -07:00
# link from Cellar to Prefix
begin
keg.link
rescue Exception => e
onoe "The linking step did not complete successfully"
puts "The formula built, but is not symlinked into #{HOMEBREW_PREFIX}"
puts "You can try again using `brew link #{f.name}'"
if ARGV.debug?
ohai e, e.backtrace
else
onoe e
end
show_summary_heading = true
end
end
ohai "Summary" if ARGV.verbose? or show_summary_heading
print "#{f.prefix}: #{f.prefix.abv}"
print ", built in #{pretty_duration build_time}" if build_time
puts
end