aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorMax Howell2009-06-04 19:21:19 +0100
committerMax Howell2009-06-04 19:36:58 +0100
commitcc50131728fc20016e9cdb8383c8faf723448f51 (patch)
tree0e7eaa43b3dabfdd3473ccbbe235e46bad550a21 /Library
parent84ad47bc3c8029847e5c41ab4646a6b9455b370a (diff)
downloadbrew-cc50131728fc20016e9cdb8383c8faf723448f51.tar.bz2
Created /Library moved brew tool to /bin
Moved Forumla and Cellar/homebrew into Library. This way the homebrew core files are more sensibly placed, Cellar is more internally consistent and only generated. And Homebrew is ready for use straight out of the tarball.
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/brewkit.rb359
-rw-r--r--Library/Homebrew/env.rb22
-rwxr-xr-xLibrary/Homebrew/unittest.rb72
3 files changed, 453 insertions, 0 deletions
diff --git a/Library/Homebrew/brewkit.rb b/Library/Homebrew/brewkit.rb
new file mode 100644
index 000000000..8ca71d332
--- /dev/null
+++ b/Library/Homebrew/brewkit.rb
@@ -0,0 +1,359 @@
+# 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/>.
+
+require 'pathname'
+require 'osx/cocoa' # to get number of cores
+require "#{File.dirname __FILE__}/env"
+
+HOMEBREW_VERSION='0.1'
+
+# optimise all the way to eleven, references:
+# http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel
+# http://forums.mozillazine.org/viewtopic.php?f=12&t=577299
+# http://gcc.gnu.org/onlinedocs/gcc-4.0.1/gcc/i386-and-x86_002d64-Options.html
+ENV['MACOSX_DEPLOYMENT_TARGET']='10.5'
+ENV['CFLAGS']=ENV['CXXFLAGS']='-O3 -w -pipe -fomit-frame-pointer -march=prescott'
+
+# lets use gcc 4.2, it is newer and "better", at least I believe so, mail me
+# if I'm wrong
+ENV['CC']='gcc-4.2'
+ENV['CXX']='g++-4.2'
+ENV['MAKEFLAGS']="-j#{OSX::NSProcessInfo.processInfo.processorCount}"
+
+unless $root.to_s == '/usr/local'
+ ENV['CPPFLAGS']='-I'+$root+'include'
+ ENV['LDFLAGS']='-L'+$root+'lib'
+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 appsupport
+ appsupport = File.expand_path "~/Library/Application Support/Homebrew"
+ FileUtils.mkpath appsupport unless File.exist? appsupport
+ return appsupport
+end
+
+
+# make our code neater
+class Pathname
+ def mv dst
+ FileUtils.mv to_s, dst
+ end
+ def cp dst
+ if file?
+ FileUtils.cp to_s, dst
+ else
+ FileUtils.cp_r to_s, dst
+ end
+ end
+end
+
+
+class Formula
+ require 'find'
+ require 'fileutils'
+
+ # fuck knows, ruby is weird
+ 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 initialize
+ # 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
+
+ # pls improve this version extraction crap
+ filename=File.basename @url
+ i=filename.index /[-_]\d/
+ unless i.nil?
+ /^((\d+[._])*(\d+-)?\d+[abc]?)/.match filename[i+1,1000] #1000 because rubysucks
+ @version=$1
+ # if there are no dots replace underscores, boost do this, the bastards!
+ @version.gsub!('_', '.') unless @version.include? '.'
+ else
+ # no divisor or a '.' divisor, eg. dmd.1.11.zip
+ /^[a-zA-Z._-]*((\d+\.)*\d+)/.match filename
+ @version = $1
+ end
+ end
+
+private
+ def maybe_mkpath path
+ path.mkpath unless path.exist?
+ return path
+ end
+
+public
+ def prefix
+ raise "@name.nil!" if @name.nil?
+ raise "@version.nil?" if @version.nil?
+ $cellar+@name+@version
+ end
+ def bin
+ maybe_mkpath prefix+'bin'
+ end
+ def doc
+ maybe_mkpath prefix+'share'+'doc'+name
+ end
+ def man
+ maybe_mkpath prefix+'share'+'man'
+ end
+ def lib
+ maybe_mkpath prefix+'lib'
+ end
+ def include
+ maybe_mkpath prefix+'include'
+ end
+
+ def name=name
+ raise "Name assigned twice, I'm not letting you do that!" if @name
+ @name=name
+ end
+
+protected
+ def caveats
+ nil
+ end
+
+public
+ #yields a Pathname object for the installation prefix
+ def brew
+ # disabled until the regexp makes sense :P
+ #raise "@name does not validate to our regexp" unless /^\w+$/ =~ @name
+
+ ohai "Downloading #{@url}"
+
+ Dir.chdir appsupport do
+ 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=nil
+ begin
+ tmp=`mktemp -dt #{File.basename @url}`.strip
+ Dir.chdir tmp do
+ Dir.chdir uncompress(tgz) do
+ yield self
+ if caveats
+ ohai "Caveats"
+ puts caveats
+ end
+ #TODO copy changelog or CHANGES file to pkg root,
+ #TODO maybe README, etc. to versioned root
+ 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
+ FileUtils.rm_rf prefix
+ raise
+ end
+ ensure
+ FileUtils.rm_rf tmp if tmp
+ FileUtils.rm tgz if tgz and not self.cache?
+ end
+ end
+ end
+
+ def clean
+ prefix.find do |path|
+ if path==prefix #rubysucks
+ next
+ elsif path.file?
+ if path.extname == '.la'
+ path.unlink
+ else
+ fo=`file -h #{path}`
+ args=nil
+ args='-SxX' if fo =~ /Mach-O dynamically linked shared library/
+ args='' if fo =~ /Mach-O executable/ #defaults strip everything
+ if args
+ puts "Stripping: #{path}" if ARGV.include? '--verbose'
+ `strip #{args} #{path}`
+ end
+ end
+ elsif path.directory? and path!=prefix+'bin' and path!=prefix+'lib'
+ Find.prune
+ end
+ end
+ end
+
+ def version
+ @version
+ end
+ def name
+ @name
+ end
+
+protected
+ 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 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
+
+ def cache?
+ true
+ end
+
+private
+ def method_added(method)
+ raise 'You cannot override Formula.brew' if method == 'brew'
+ end
+end
+
+# see ack.rb for an example usage
+class UncompressedScriptFormula <Formula
+ def uncompress path
+ path.dirname
+ end
+ def cache?
+ false
+ end
+ def install
+ FileUtils.cp name, bin
+ (bin+name).chmod 0544
+ end
+end
+
+class GithubGistFormula <Formula
+ def initialize(url, md5)
+ @url=url
+ @name=File.basename url
+ @version=File.basename(File.dirname(url))[0,6]
+ @md5=md5
+
+ brew do |prefix|
+ bin=prefix+'bin'
+ bin.mkpath
+ FileUtils.cp @name, bin
+ (bin+@name).chmod 0544
+ nil
+ end
+ end
+
+ def uncompress path
+ path.dirname
+ end
+end
+
+def inreplace(path, before, after)
+ before=before.to_s.gsub('"', '\"').gsub('/', '\/')
+ after=after.to_s.gsub('"', '\"').gsub('/', '\/')
+
+ # we're not using Ruby because the perl script is more concise
+ #TODO the above escapes are worse, use a proper ruby script :P
+ #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
+ `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
+ out+=s
+ puts s if ARGV.include? '--verbose'
+ end
+ end
+
+ unless $? == 0
+ puts out unless ARGV.include? '--verbose' #already did that above
+ raise "Failure during: #{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
diff --git a/Library/Homebrew/env.rb b/Library/Homebrew/env.rb
new file mode 100644
index 000000000..e1beac1c1
--- /dev/null
+++ b/Library/Homebrew/env.rb
@@ -0,0 +1,22 @@
+# 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/>.
+
+require 'pathname'
+
+$root=Pathname.new(__FILE__).dirname.parent.parent.realpath
+$formula=$root+'Library'+'Formula'
+$cellar=$root+'Cellar' \ No newline at end of file
diff --git a/Library/Homebrew/unittest.rb b/Library/Homebrew/unittest.rb
new file mode 100755
index 000000000..5ec8f0e5d
--- /dev/null
+++ b/Library/Homebrew/unittest.rb
@@ -0,0 +1,72 @@
+#!/usr/bin/ruby
+require 'test/unit'
+require "#{__FILE__}/../brewkit"
+
+class TestFormula <Formula
+ def initialize url, md5
+ @url=url
+ @md5=md5
+ @name='test'
+ super()
+ end
+end
+
+
+class BeerTasting <Test::Unit::TestCase
+ def test_version_all_dots
+ r=TestFormula.new "http://example.com/foo.bar.la.1.14.zip", 'nomd5'
+ assert_equal '1.14', r.version
+ end
+
+ def test_version_underscore_separator
+ r=TestFormula.new "http://example.com/grc_1.1.tar.gz", 'nomd5'
+ assert_equal '1.1', r.version
+ end
+
+ def test_version_underscores_all_the_way
+ r=TestFormula.new "http://example.com/boost_1_39_0.tar.bz2", 'nomd5'
+ assert_equal '1.39.0', r.version
+ end
+
+ def test_version_internal_dash
+ r=TestFormula.new "http://example.com/foo-arse-1.1-2.tar.gz", 'nomd5'
+ assert_equal '1.1-2', r.version
+ end
+
+ def test_version_single_digit
+ r=TestFormula.new "http://example.com/foo_bar.45.tar.gz", 'nomd5'
+ assert_equal '45', r.version
+ end
+
+ def test_noseparator_single_digit
+ r=TestFormula.new "http://example.com/foo_bar45.tar.gz", 'nomd5'
+ assert_equal '45', r.version
+ end
+
+ def test_version_developer_that_hates_us_format
+ r=TestFormula.new "http://example.com/foo-bar-la.1.2.3.tar.gz", 'nomd5'
+ assert_equal '1.2.3', r.version
+ end
+
+ def test_version_regular
+ r=TestFormula.new "http://example.com/foo_bar-1.21.tar.gz", 'nomd5'
+ assert_equal '1.21', r.version
+ end
+
+ def test_yet_another_version
+ r=TestFormula.new "http://example.com/mad-0.15.1b.tar.gz", 'nomd5'
+ assert_equal '0.15.1b', r.version
+ end
+
+ def test_prefix
+ url='http://www.methylblue.com/test-0.1.tar.gz'
+ md5='d496ea538a21dc4bb8524a8888baf88c'
+
+ TestFormula.new(url, md5).brew do |f|
+ prefix=f.prefix
+ # we test for +/unittest/0.1 because we derive @name from $0
+ assert_equal File.expand_path(prefix), ($cellar+'test'+'0.1').to_s
+ assert_kind_of Pathname, prefix
+ end
+ end
+end \ No newline at end of file