aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/build.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/build.rb')
-rwxr-xr-xLibrary/Homebrew/build.rb92
1 files changed, 92 insertions, 0 deletions
diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb
new file mode 100755
index 000000000..9844ef401
--- /dev/null
+++ b/Library/Homebrew/build.rb
@@ -0,0 +1,92 @@
+#!/usr/bin/ruby
+
+# This script is called by formula_installer as a separate instance.
+# Rationale: Formula can use __END__, Formula can change ENV
+# Thrown exceptions are propogated back to the parent process over a pipe
+
+ORIGINAL_PATHS = ENV['PATH'].split(':').map{ |p| File.expand_path p }
+
+require 'global'
+
+at_exit do
+ # the whole of everything must be run in at_exit because the formula has to
+ # be the run script as __END__ must work for *that* formula.
+
+ begin
+ raise $! if $! # an exception was already thrown when parsing the formula
+
+ require 'extend/ENV'
+ require 'hardware'
+ require 'keg'
+
+ ENV.extend(HomebrewEnvExtension)
+ ENV.setup_build_environment
+ # we must do this or tools like pkg-config won't get found by configure scripts etc.
+ ENV.prepend 'PATH', "#{HOMEBREW_PREFIX}/bin", ':' unless ORIGINAL_PATHS.include? "#{HOMEBREW_PREFIX}/bin"
+
+ 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
+
+def install f
+ 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
+
+ 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
+ f.install
+ 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
+ end
+ end
+rescue Exception
+ if f.prefix.directory?
+ f.prefix.rmtree
+ f.prefix.parent.rmdir_if_possible
+ end
+ raise
+end