diff options
| author | Max Howell | 2009-10-15 12:36:09 +0100 |
|---|---|---|
| committer | Max Howell | 2009-10-15 16:51:53 +0100 |
| commit | 543a113712635b64bcfe0804acea0d8079b8bd44 (patch) | |
| tree | 404789c8e1a0d62d5e72d0e3c763018c73d51762 /Library/Homebrew/extend | |
| parent | 6ad2907000d927e055cacf389228ebdc01fcc0d7 (diff) | |
| download | brew-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.rb | 116 | ||||
| -rw-r--r-- | Library/Homebrew/extend/ENV.rb | 207 | ||||
| -rw-r--r-- | Library/Homebrew/extend/pathname.rb | 196 |
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 |
