aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/extend
diff options
context:
space:
mode:
authorMax Howell2009-10-15 12:36:09 +0100
committerMax Howell2009-10-15 16:51:53 +0100
commit543a113712635b64bcfe0804acea0d8079b8bd44 (patch)
tree404789c8e1a0d62d5e72d0e3c763018c73d51762 /Library/Homebrew/extend
parent6ad2907000d927e055cacf389228ebdc01fcc0d7 (diff)
downloadbrew-543a113712635b64bcfe0804acea0d8079b8bd44.tar.bz2
Some subdirs and renames to aid homebrew n00bs
The classes better reflect their contents. I'm sure this change may be contentious, but I am a sucker for trying to create source bases that are easy to get to grips with and easy to navigate. brewkit.rb is now a deprecated file.
Diffstat (limited to 'Library/Homebrew/extend')
-rw-r--r--Library/Homebrew/extend/ARGV.rb116
-rw-r--r--Library/Homebrew/extend/ENV.rb207
-rw-r--r--Library/Homebrew/extend/pathname.rb196
3 files changed, 519 insertions, 0 deletions
diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb
new file mode 100644
index 000000000..b8ccbda53
--- /dev/null
+++ b/Library/Homebrew/extend/ARGV.rb
@@ -0,0 +1,116 @@
+# Copyright 2009 Max Howell and other contributors.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+module HomebrewArgvExtension
+ def named
+ raise UsageError if _named.empty?
+ _named
+ end
+ def named_empty?
+ _named.empty?
+ end
+ def options
+ select {|arg| arg[0..0] == '-'}
+ end
+ def formulae
+ require 'formula'
+ @formulae ||= named.collect {|name| Formula.factory name}
+ end
+ def kegs
+ require 'keg'
+ @kegs ||= named.collect do |name|
+ d=HOMEBREW_CELLAR+name
+ raise "#{name} is not installed" if not d.directory? or d.children.length == 0
+ raise "#{name} has multiple installed versions" if d.children.length > 1
+ Keg.new d.children[0]
+ end
+ end
+
+ # self documenting perhaps?
+ def include? arg
+ @n=index arg
+ end
+ def next
+ at @n+1
+ end
+
+ def force?
+ flag? '--force'
+ end
+ def verbose?
+ flag? '--verbose' or ENV['HOMEBREW_VERBOSE']
+ end
+ def debug?
+ flag? '--debug' or ENV['HOMEBREW_DEBUG']
+ end
+ def quieter?
+ flag? '--quieter'
+ end
+ def interactive?
+ flag? '--interactive'
+ end
+
+ def flag? flag
+ options.each do |arg|
+ return true if arg == flag
+ next if arg[1..1] == '-'
+ return true if arg.include? flag[2..2]
+ end
+ return false
+ end
+
+ def usage
+ <<-EOS
+Usage: brew command [formula] ...
+Usage: brew [--prefix] [--cache] [--version|-v]
+Usage: brew [--verbose|-v]
+
+Commands:
+ install formula ... [--debug|-d] [--interactive|-i] [--ignore-dependencies]
+ remove formula ...
+ search [/regex/] [substring]
+ list [--brewed] [--unbrewed] [formula] ...
+ link formula ...
+ unlink formula ...
+ home formula ...
+ info [formula] [--github]
+ prune
+ update
+
+Commands useful when contributing:
+ log formula
+ create URL
+ edit [formula]
+
+To visit the Homebrew homepage type:
+ brew home
+ EOS
+ end
+
+private
+ def _named
+ @named ||= reject{|arg| arg[0..0] == '-'}.collect{|arg| arg.downcase}.uniq
+ end
+end
+
+class UsageError <RuntimeError; end
diff --git a/Library/Homebrew/extend/ENV.rb b/Library/Homebrew/extend/ENV.rb
new file mode 100644
index 000000000..d87825dbe
--- /dev/null
+++ b/Library/Homebrew/extend/ENV.rb
@@ -0,0 +1,207 @@
+# Copyright 2009 Max Howell and other contributors.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+module HomebrewEnvExtension
+ # -w: keep signal to noise high
+ # -fomit-frame-pointer: we are not debugging this software, we are using it
+ SAFE_CFLAGS_FLAGS = "-w -pipe -fomit-frame-pointer -mmacosx-version-min=#{MACOS_VERSION}"
+
+ def setup_build_environment
+ # Clear CDPATH to avoid make issues that depend on changing directories
+ ENV.delete('CDPATH')
+
+ ENV['MACOSX_DEPLOYMENT_TARGET']=MACOS_VERSION.to_s
+ ENV['MAKEFLAGS']="-j#{Hardware.processor_count}"
+
+ unless HOMEBREW_PREFIX.to_s == '/usr/local'
+ # /usr/local is always in the build system path so only add other paths
+ ENV['CPPFLAGS'] = "-I#{HOMEBREW_PREFIX}/include"
+ ENV['LDFLAGS'] = "-L#{HOMEBREW_PREFIX}/lib"
+ else
+ # ignore existing build vars, thus we should have less bugs to deal with
+ ENV['CPPFLAGS'] = ''
+ ENV['LDFLAGS'] = ''
+ end
+
+ if MACOS_VERSION >= 10.6 or ENV['HOMEBREW_USE_LLVM']
+ # you can install Xcode wherever you like you know.
+ prefix = `/usr/bin/xcode-select -print-path`.chomp
+ prefix = "/Developer" if prefix.to_s.empty?
+
+ ENV['CC'] = "#{prefix}/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2"
+ ENV['CXX'] = "#{prefix}/usr/llvm-gcc-4.2/bin/llvm-g++-4.2"
+ cflags = ['-O4'] # O4 baby!
+ else
+ ENV['CC']="gcc-4.2"
+ ENV['CXX']="g++-4.2"
+ cflags = ['-O3']
+ end
+ # in rare cases this may break your builds, as the tool for some reason wants
+ # to use a specific linker, however doing this in general causes formula to
+ # build more successfully because we are changing CC and many build systems
+ # don't react properly to that
+ ENV['LD']=ENV['CC']
+
+ # 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.2.1/gcc/i386-and-x86_002d64-Options.html
+ if MACOS_VERSION >= 10.6
+ case Hardware.intel_family
+ when :penryn, :core2
+ # no need to add -mfpmath it happens automatically with 64 bit compiles
+ cflags << "-march=core2"
+ when :core
+ cflags<<"-march=prescott"<<"-mfpmath=sse"
+ end
+ else
+ case Hardware.intel_family
+ when :penryn, :core2
+ cflags<<"-march=nocona"
+ when :core
+ cflags<<"-march=prescott"
+ end
+ cflags<<"-mfpmath=sse"
+ end
+ cflags<<"-mmmx"
+ case Hardware.intel_family
+ when :nehalem
+ cflags<<"-msse4.2"
+ when :penryn
+ cflags<<"-msse4.1"
+ when :core2, :core
+ cflags<<"-msse3"
+ end
+
+ ENV['CFLAGS']=ENV['CXXFLAGS']="#{cflags*' '} #{SAFE_CFLAGS_FLAGS}"
+ end
+
+ def deparallelize
+ remove 'MAKEFLAGS', /-j\d+/
+ end
+ alias_method :j1, :deparallelize
+ def gcc_4_0_1
+ case MACOS_VERSION
+ when 10.5
+ self['CC']=nil
+ self['CXX']=nil
+ self['LD']=nil
+ when 10.6..11.0
+ self['CC']='gcc-4.0'
+ self['CXX']='g++-4.0'
+ self['LD']=self['CC']
+ remove_from_cflags '-march=core2'
+ self.O3
+ end
+ remove_from_cflags '-msse4.1'
+ remove_from_cflags '-msse4.2'
+ end
+ def O3
+ # Sometimes O4 just takes fucking forever
+ remove_from_cflags '-O4'
+ append_to_cflags '-O3'
+ end
+ def O2
+ # Sometimes O3 doesn't work or produces bad binaries
+ remove_from_cflags '-O4'
+ remove_from_cflags '-O3'
+ append_to_cflags '-O2'
+ end
+ def gcc_4_2
+ # Sometimes you want to downgrade from LLVM to GCC 4.2
+ self['CC']="gcc-4.2"
+ self['CXX']="g++-4.2"
+ self['LD']=self['CC']
+ self.O3
+ end
+ def osx_10_4
+ self['MACOSX_DEPLOYMENT_TARGET']=nil
+ remove_from_cflags(/ ?-mmacosx-version-min=10\.\d/)
+ end
+ def minimal_optimization
+ self['CFLAGS']=self['CXXFLAGS']="-Os #{SAFE_CFLAGS_FLAGS}"
+ end
+ def no_optimization
+ self['CFLAGS']=self['CXXFLAGS'] = SAFE_CFLAGS_FLAGS
+ end
+ def libxml2
+ append_to_cflags ' -I/usr/include/libxml2'
+ end
+ def x11
+ # CPPFLAGS are the C-PreProcessor flags, *not* C++!
+ append 'CPPFLAGS', '-I/usr/X11R6/include'
+ append 'LDFLAGS', '-L/usr/X11R6/lib'
+ end
+ alias_method :libpng, :x11
+ # we've seen some packages fail to build when warnings are disabled!
+ def enable_warnings
+ remove_from_cflags '-w'
+ end
+ # Snow Leopard defines an NCURSES value the opposite of most distros
+ # See: http://bugs.python.org/issue6848
+ def ncurses_define
+ append 'CPPFLAGS', "-DNCURSES_OPAQUE=0"
+ end
+ # returns the compiler we're using
+ def cc
+ ENV['CC'] or "gcc"
+ end
+ def cxx
+ ENV['cxx'] or "g++"
+ end
+ # in case you need it
+ def m64
+ append_to_cflags '-m64'
+ ENV['LDFLAGS'] += '-arch x86_64'
+ end
+
+ def prepend key, value, separator = ' '
+ unless self[key].to_s.empty?
+ self[key] = value + separator + self[key]
+ else
+ self[key] = value
+ end
+ end
+ def append key, value
+ ref=self[key]
+ if ref.nil? or ref.empty?
+ self[key]=value
+ else
+ self[key]=ref+' '+value
+ end
+ end
+ def append_to_cflags f
+ append 'CFLAGS', f
+ append 'CXXFLAGS', f
+ end
+ def remove key, value
+ return if self[key].nil?
+ self[key]=self[key].sub value, '' # can't use sub! on ENV
+ self[key]=nil if self[key].empty? # keep things clean
+ end
+ def remove_from_cflags f
+ remove 'CFLAGS', f
+ remove 'CXXFLAGS', f
+ end
+end
diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb
new file mode 100644
index 000000000..bfbba61bf
--- /dev/null
+++ b/Library/Homebrew/extend/pathname.rb
@@ -0,0 +1,196 @@
+# Copyright 2009 Max Howell and other contributors.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+require 'pathname'
+
+# we enhance pathname to make our code more readable
+class Pathname
+ def install src
+ if src.is_a? Array
+ src.collect {|src| install src }
+ else
+ raise "#{src} does not exist" unless File.exist? src
+ mkpath
+ if File.symlink? src
+ # we use the BSD mv command because FileUtils copies the target and
+ # not the link! I'm beginning to wish I'd used Python quite honestly!
+ raise unless Kernel.system 'mv', src, to_s and $? == 0
+ 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
+ src=Pathname.new src
+ return self+src.basename
+ end
+ end
+
+ # we assume this pathname object is a file obviously
+ def write content
+ raise "Will not overwrite #{to_s}" if exist? and not ARGV.force?
+ dirname.mkpath
+ File.open(self, 'w') {|f| f.write content }
+ end
+
+ def cp dst
+ if file?
+ FileUtils.cp to_s, dst
+ else
+ FileUtils.cp_r to_s, dst
+ end
+ return dst
+ end
+
+ # extended to support the double extensions .tar.gz and .tar.bz2
+ def extname
+ /(\.tar\.(gz|bz2))$/.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
+
+ # I don't trust the children.length == 0 check particularly, not to mention
+ # it is slow to enumerate the whole directory just to see if it is empty,
+ # instead rely on good ol' libc and the filesystem
+ def rmdir_if_possible
+ rmdir
+ true
+ rescue SystemCallError => e
+ raise unless e.errno == Errno::ENOTEMPTY::Errno or e.errno == Errno::EACCES::Errno
+ false
+ end
+
+ def chmod_R perms
+ require 'fileutils'
+ FileUtils.chmod_R perms, to_s
+ end
+
+ def abv
+ out=''
+ n=`find #{to_s} -type f | wc -l`.to_i
+ out<<"#{n} files, " if n > 1
+ out<<`du -hd0 #{to_s} | cut -d"\t" -f1`.strip
+ end
+
+ # attempts to retrieve the version component of this path, so generally
+ # you'll call it on tarballs or extracted tarball directories, if you add
+ # to this please provide amend the unittest
+ def version
+ if directory?
+ # directories don't have extnames
+ stem=basename.to_s
+ else
+ stem=self.stem
+ end
+
+ # github tarballs are special
+ # we only support numbered tagged downloads
+ %r[github.com/.*/tarball/((\d\.)+\d)$].match to_s
+ return $1 if $1
+
+ # eg. boost_1_39_0
+ /((\d+_)+\d+)$/.match stem
+ return $1.gsub('_', '.') if $1
+
+ # eg. foobar-4.5.1-1
+ # eg. ruby-1.9.1-p243
+ /-((\d+\.)*\d\.\d+-(p|rc)?\d+)$/.match stem
+ return $1 if $1
+
+ # eg. lame-398-1
+ /-((\d)+-\d)/.match stem
+ return $1 if $1
+
+ # eg. foobar-4.5.1
+ /-((\d+\.)*\d+)$/.match stem
+ return $1 if $1
+
+ # eg. foobar-4.5.1b
+ /-((\d+\.)*\d+([abc]|rc\d))$/.match stem
+ return $1 if $1
+
+ # eg foobar-4.5.0-beta1
+ /-((\d+\.)*\d+-beta\d+)$/.match stem
+ return $1 if $1
+
+ # eg. foobar4.5.1
+ /((\d+\.)*\d+)$/.match stem
+ return $1 if $1
+
+ # eg foobar-4.5.0-bin
+ /-((\d+\.)+\d+[abc]?)[-.](bin|src|sources)$/.match stem
+ return $1 if $1
+
+ # eg. otp_src_R13B (this is erlang's style)
+ # eg. astyle_1.23_macosx.tar.gz
+ stem.scan /_([^_]+)/ do |match|
+ return match.first if /\d/.match $1
+ end
+
+ nil
+ end
+
+ if '1.9' <= RUBY_VERSION
+ alias_method :to_str, :to_s
+ end
+end
+
+# sets $n and $d so you can observe creation of stuff
+module ObserverPathnameExtension
+ def unlink
+ super
+ puts "rm #{to_s}" if ARGV.verbose?
+ $n+=1
+ end
+ def rmdir
+ super
+ puts "rmdir #{to_s}" if ARGV.verbose?
+ $d+=1
+ end
+ def resolved_path_exists?
+ (dirname+readlink).exist?
+ end
+ def mkpath
+ super
+ puts "mkpath #{to_s}" if ARGV.verbose?
+ $d+=1
+ end
+ def make_relative_symlink src
+ dirname.mkpath
+ Dir.chdir dirname do
+ # TODO use Ruby function so we get exceptions
+ # NOTE Ruby functions may work, but I had a lot of problems
+ rv=system 'ln', '-sf', src.relative_path_from(dirname)
+ raise "Could not create symlink #{to_s}" unless rv and $? == 0
+ puts "ln #{to_s}" if ARGV.verbose?
+ $n+=1
+ end
+ end
+end
+
+$n=0
+$d=0