aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/brew.h.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/brew.h.rb')
-rw-r--r--Library/Homebrew/brew.h.rb238
1 files changed, 238 insertions, 0 deletions
diff --git a/Library/Homebrew/brew.h.rb b/Library/Homebrew/brew.h.rb
new file mode 100644
index 000000000..3dee3ec2d
--- /dev/null
+++ b/Library/Homebrew/brew.h.rb
@@ -0,0 +1,238 @@
+# Copyright 2009 Max Howell <max@methylblue.com>
+#
+# This file is part of Homebrew.
+#
+# Homebrew is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Homebrew is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Homebrew. If not, see <http://www.gnu.org/licenses/>.
+
+def make url
+ require 'formula'
+
+ path=Pathname.new url
+
+ /(.*?)[-_.]?#{path.version}/.match path.basename
+ raise "Couldn't parse name from #{url}" if $1.nil? or $1.empty?
+
+ path=Formula.path $1
+ raise "#{path} already exists" if path.exist?
+
+ template=<<-EOS
+ require 'brewkit'
+
+ class #{Formula.class $1} <Formula
+ @url='#{url}'
+ @homepage=''
+ @md5=''
+
+ cmake def deps
+ cmake BinaryDep.new 'cmake'
+ cmake end
+ cmake
+ def install
+ autotools system "./configure --prefix='\#{prefix}' --disable-debug --disable-dependency-tracking"
+ cmake system "cmake . \#{cmake_std_parameters}"
+ system "make install"
+ end
+ end
+ EOS
+
+ mode=nil
+ if ARGV.include? '--cmake'
+ mode= :cmake
+ elsif ARGV.include? '--autotools'
+ mode= :autotools
+ end
+
+ f=File.new path, 'w'
+ template.each_line do |s|
+ if s.strip.empty?
+ f.puts
+ next
+ end
+ cmd=s[0..11].strip
+ if cmd.empty?
+ cmd=nil
+ else
+ cmd=cmd.to_sym
+ end
+ out=s[12..-1] || ''
+
+ if mode.nil?
+ # we show both but comment out cmake as it is less common
+ # the implication being the pacakger should remove whichever is not needed
+ if cmd == :cmake and not out.empty?
+ f.print '#'
+ out = out[1..-1]
+ end
+ elsif cmd != mode and not cmd.nil?
+ next
+ end
+ f.puts out
+ end
+ f.close
+
+ return path
+end
+
+
+def info name
+ require 'formula'
+
+ history="http://github.com/mxcl/homebrew/commits/masterbrew/Library/Formula/#{Formula.path(name).basename}"
+ exec 'open', history if ARGV.flag? '--github'
+
+ f=Formula.factory name
+ puts "#{f.name} #{f.version}"
+ puts f.homepage
+
+ if f.prefix.parent.directory?
+ kids=f.prefix.parent.children
+ kids.each do |keg|
+ print "#{keg} (#{keg.abv})"
+ print " *" if f.prefix == keg and kids.length > 1
+ puts
+ end
+ else
+ puts "Not installed"
+ end
+
+ if f.caveats
+ puts
+ puts f.caveats
+ puts
+ end
+
+ puts history
+
+rescue FormulaUnavailableError
+ # check for DIY installation
+ d=HOMEBREW_PREFIX+name
+ if d.directory?
+ ohai "DIY Installation"
+ d.children.each {|keg| puts "#{keg} (#{keg.abv})"}
+ else
+ raise "No such formula or keg"
+ end
+end
+
+
+def clean f
+ Cleaner.new f
+ # remove empty directories TODO Rubyize!
+ `perl -MFile::Find -e"finddepth(sub{rmdir},'#{f.prefix}')"`
+end
+
+
+def install f
+ 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}"
+ interactive_shell
+ elsif ARGV.include? '--help'
+ system './configure --help'
+ exit $?
+ else
+ f.prefix.mkpath
+ f.install
+ %w[README ChangeLog COPYING LICENSE COPYRIGHT AUTHORS].each do |file|
+ f.prefix.install file if File.file? file
+ end
+ end
+ end
+end
+
+
+def prune
+ $n=0
+ $d=0
+
+ dirs=Array.new
+ paths=%w[bin etc lib include share].collect {|d| HOMEBREW_PREFIX+d}
+
+ paths.each do |path|
+ path.find do |path|
+ path.extend ObserverPathnameExtension
+ if path.symlink?
+ path.unlink unless path.resolved_path_exists?
+ elsif path.directory?
+ dirs<<path
+ end
+ end
+ end
+
+ dirs.sort.reverse_each {|d| d.rmdir_if_possible}
+
+ if $n == 0 and $d == 0
+ puts "Nothing pruned" if ARGV.verbose?
+ else
+ # always showing symlinks text is deliberate
+ print "Pruned #{$n} symbolic links "
+ print "and #{$n} directories " if $d > 0
+ puts "from #{HOMEBREW_PREFIX}"
+ end
+end
+
+
+################################################################ class Cleaner
+class Cleaner
+ def initialize f
+ @f=f
+ [f.bin, f.lib].each {|d| clean_dir d}
+ end
+
+private
+ def strip path, args=''
+ return if @f.skip_clean? path
+ puts "strip #{path}" if ARGV.verbose?
+ path.chmod 0644 # so we can strip
+ unless path.stat.nlink > 1
+ `strip #{args} #{path}`
+ else
+ # strip unlinks the file and recreates it, thus breaking hard links!
+ # is this expected behaviour? patch does it too… still,mktm this fixes it
+ tmp=`mktemp -t #{path.basename}`.strip
+ `strip #{args} -o #{tmp} #{path}`
+ `cat #{tmp} > #{path}`
+ File.unlink tmp
+ end
+ end
+
+ def clean_file path
+ perms=0444
+ case `file -h #{path}`
+ when /Mach-O dynamically linked shared library/
+ strip path, '-SxX'
+ when /Mach-O [^ ]* ?executable/
+ strip path
+ perms=0544
+ when /script text executable/
+ perms=0544
+ end
+ path.chmod perms
+ end
+
+ def clean_dir d
+ d.find do |path|
+ if not path.file?
+ next
+ elsif path.extname == '.la' and not @f.skip_clean? path
+ # *.la files are stupid
+ path.unlink
+ else
+ clean_file path
+ end
+ end
+ end
+end