aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/brewkit.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/brewkit.rb')
-rw-r--r--Library/Homebrew/brewkit.rb371
1 files changed, 3 insertions, 368 deletions
diff --git a/Library/Homebrew/brewkit.rb b/Library/Homebrew/brewkit.rb
index a32f015d5..f5d819f1b 100644
--- a/Library/Homebrew/brewkit.rb
+++ b/Library/Homebrew/brewkit.rb
@@ -15,9 +15,8 @@
# You should have received a copy of the GNU General Public License
# along with Homebrew. If not, see <http://www.gnu.org/licenses/>.
-require 'pathname'
require 'osx/cocoa' # to get number of cores
-require 'env'
+require 'formula'
# optimise all the way to eleven, references:
# http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel
@@ -38,343 +37,7 @@ unless $root.to_s == '/usr/local'
end
-def ohai title
- n=`tput cols`.strip.to_i-4
- puts "\033[0;34m==>\033[0;0;1m #{title[0,n]}\033[0;0m"
-end
-
-def cache
- cache=File.expand_path "~/Library/Caches/Homebrew"
- FileUtils.mkpath cache
- return cache
-end
-
-class BuildError <RuntimeError
- def initialize cmd
- super "Build failed during: #{cmd}"
- end
-end
-
-# pass in the basename of the filename _without_ any file extension
-def extract_version basename
- # eg. boost_1_39_0
- /((\d+_)+\d+)$/.match basename
- return $1.gsub('_', '.') if $1
-
- # eg. foobar-4.5.1-1
- /-((\d+\.)*\d+-\d+)$/.match basename
- return $1 if $1
-
- # eg. foobar-4.5.1
- /-((\d+\.)*\d+)$/.match basename
- return $1 if $1
-
- # eg. foobar-4.5.1b
- /-((\d+\.)*\d+([abc]|rc\d))$/.match basename
- return $1 if $1
-
- # eg foobar-4.5.0-beta1
- /-((\d+\.)*\d+-beta\d+)$/.match basename
- return $1 if $1
-
- # eg. foobar4.5.1
- /((\d+\.)*\d+)$/.match basename
- return $1 if $1
-
- # eg. otp_src_R13B (this is erlang's style)
- # eg. astyle_1.23_macosx.tar.gz
- basename.scan /_([^_]+)/ do |match|
- return match.first if /\d/.match $1
- end
-end
-
-
-# make our code neater
-class Pathname
- def mv dst
- FileUtils.mv to_s, dst
- end
-
- def rename dst
- dst=Pathname.new dst
- dst.unlink if dst.exist?
- mv dst
- end
-
- def install src
- if src.is_a? Array
- src.each {|src| install src }
- elsif File.exist? src
- mkpath
- if File.symlink? src
- # we cp symlinks because FileUtils.mv is shit and won't mv a symlink
- # if its final destination has an invalid target! FFS. Ruby is shit.
- FileUtils.cp src, to_s
- else
- # we mv when possible as it is faster and you should only be using
- # this function when installing from the temporary build directory
- FileUtils.mv src, to_s
- end
- end
- end
-
- def cp dst
- if file?
- FileUtils.cp to_s, dst
- else
- FileUtils.cp_r to_s, dst
- end
- end
-
- # for filetypes we support
- def extname
- /\.(zip|tar\.(gz|bz2)|tgz)$/.match to_s
- return ".#{$1}" if $1
- return File.extname(to_s)
- end
-
- # for filetypes we support, basename without extension
- def stem
- return File.basename(to_s, extname)
- end
-end
-
-
-# the base class variety of formula, you don't get a prefix, so it's not really
-# useful. See the derived classes for fun and games.
-class AbstractFormula
- require 'find'
- require 'fileutils'
-
- # fuck knows, ruby is weird
- # TODO please fix!
- def self.url
- @url
- end
- def url
- self.class.url
- end
- def self.md5
- @md5
- end
- def md5
- self.class.md5
- end
- def self.homepage
- @homepage
- end
- def homepage
- self.class.homepage
- end
- # end ruby is weird section
-
- def version
- @version
- end
- def name
- @name
- end
-
- def initialize name=nil
- @name=name
- # fuck knows, ruby is weird
- @url=url if @url.nil?
- raise "@url.nil?" if @url.nil?
- @md5=md5 if @md5.nil?
- # end ruby is weird section
- end
-
-public
- def prefix
- raise "@name.nil!" if @name.nil?
- raise "@version.nil?" if @version.nil?
- $cellar+@name+@version
- end
- def bin
- prefix+'bin'
- end
- def doc
- prefix+'share'+'doc'+name
- end
- def man
- prefix+'share'+'man'
- end
- def man1
- prefix+'share'+'man'+'man1'
- end
- def lib
- prefix+'lib'
- end
- def include
- prefix+'include'
- end
-
- def caveats
- nil
- end
-
- # yields self with current working directory set to the uncompressed tarball
- def brew
- ohai "Downloading #{@url}"
- Dir.chdir cache do
- tmp=tgz=nil
- begin
- tgz=Pathname.new(fetch()).realpath
- md5=`md5 -q "#{tgz}"`.strip
- raise "MD5 mismatch: #{md5}" unless @md5 and md5 == @md5.downcase
-
- # we make an additional subdirectory so know exactly what we are
- # recursively deleting later
- # we use mktemp rather than appsupport/blah because some build scripts
- # can't handle being built in a directory with spaces in it :P
- tmp=`mktemp -dt #{File.basename @url}`.strip
- Dir.chdir tmp do
- Dir.chdir uncompress(tgz) do
- yield self
- end
- end
- rescue Interrupt, RuntimeError
- if ARGV.include? '--debug'
- # debug mode allows the packager to intercept a failed build and
- # investigate the problems
- puts "Rescued build at: #{tmp}"
- exit! 1
- else
- raise
- end
- ensure
- FileUtils.rm_rf tmp if tmp
- end
- end
- end
-
- def clean
- #TODO strip libexec too
- [bin,lib].each {|path| path.find do |path|
- if not path.file?
- next
- elsif path.extname == '.la'
- # .la files are stupid
- path.unlink
- else
- fo=`file -h #{path}`
- args=nil
- perms=0444
- if fo =~ /Mach-O dynamically linked shared library/
- args='-SxX'
- elsif fo =~ /Mach-O executable/ # defaults strip everything
- args='' # still do the strip
- perms=0544
- elsif fo =~ /script text executable/
- perms=0544
- end
- if args
- puts "Stripping: #{path}" if ARGV.include? '--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 -o #{tmp} #{path}`
- `cat #{tmp} > #{path}`
- File.unlink tmp
- end
- end
- path.chmod perms
- end
- end}
-
- # remove empty directories
- `perl -MFile::Find -e"finddepth(sub{rmdir},'#{prefix}')"`
- end
-
-protected
- def uncompress path
- path.dirname
- end
-
-private
- def fetch
- %r[http://(www.)?github.com/.*/(zip|tar)ball/].match @url
- if $2
- # curl doesn't do the redirect magic that we would like, so we get a
- # stupidly named file, this is why wget would be beter, but oh well
- tgz="#{@name}-#{@version}.#{$2=='tar' ? 'tgz' : $2}"
- oarg="-o #{tgz}"
- else
- oarg='-O' #use the filename that curl gets
- tgz=File.expand_path File.basename(@url)
- end
-
- agent="Homebrew #{HOMEBREW_VERSION} (Ruby #{VERSION}; Mac OS X 10.5 Leopard)"
-
- unless File.exists? tgz
- `curl -#LA "#{agent}" #{oarg} "#{@url}"`
- raise "Download failed" unless $? == 0
- else
- puts "File already downloaded and cached"
- end
- return tgz
- end
-
- def method_added method
- raise 'You cannot override Formula.brew' if method == 'brew'
- end
-end
-
-# somewhat useful, it'll raise if you call prefix, but it'll unpack a tar/zip
-# for you, check the md5, and allow you to yield from brew
-class UnidentifiedFormula <AbstractFormula
- def initialize name=nil
- super name
- end
-
-private
- def uncompress(path)
- if path.extname == '.zip'
- `unzip -qq "#{path}"`
- else
- `tar xf "#{path}"`
- end
-
- raise "Compression tool failed" if $? != 0
-
- entries=Dir['*']
- if entries.nil? or entries.length == 0
- raise "Empty tarball!"
- elsif entries.length == 1
- # if one dir enter it as that will be where the build is
- entries.first
- else
- # if there's more than one dir, then this is the build directory already
- Dir.pwd
- end
- end
-end
-
-# this is what you will mostly use, reimplement install, prefix won't raise
-class Formula <UnidentifiedFormula
- def initialize name
- super name
- @version=extract_version Pathname.new(File.basename(@url)).stem unless @version
- end
-end
-
-# see ack.rb for an example usage
-class ScriptFileFormula <AbstractFormula
- def install
- bin.install name
- end
-end
-
-class GithubGistFormula <ScriptFileFormula
- def initialize
- super File.basename(url)
- @version=File.basename(File.dirname(url))[0,6]
- end
-end
+######################################################################## utils
def inreplace(path, before, after)
before=before.to_s.gsub('"', '\"').gsub('/', '\/')
@@ -385,34 +48,6 @@ def inreplace(path, before, after)
#TODO optimise it by taking before and after as arrays
#Bah, just make the script writers do it themselves with a standard collect block
#TODO use ed -- less to escape
+ #TODO the above doesn't escape all regexp symbols!
`perl -pi -e "s/#{before}/#{after}/g" "#{path}"`
end
-
-def system cmd
- ohai cmd
-
- out=''
- IO.popen("#{cmd} 2>&1") do |f|
- until f.eof?
- s=f.gets
- if ARGV.include? '--verbose'
- puts s
- else
- out+=s
- end
- end
- end
-
- unless $? == 0
- puts out unless ARGV.include? '--verbose' #already did that above
- raise BuildError.new(cmd)
- end
-end
-
-####################################################################### script
-if $0 == __FILE__
- d=$cellar.parent+'bin'
- d.mkpath unless d.exist?
- Dir.chdir d
- Pathname.new('brew').make_symlink Pathname.new('../Cellar')+'homebrew'+'brew'
-end \ No newline at end of file