brew/Library/Homebrew/formula_support.rb
2012-03-05 21:14:48 -08:00

130 lines
3.3 KiB
Ruby

require 'download_strategy'
# Defines a URL and download method for a stable or HEAD build
class SoftwareSpecification
attr_reader :url, :specs, :using
VCS_SYMBOLS = {
:bzr => BazaarDownloadStrategy,
:curl => CurlDownloadStrategy,
:cvs => CVSDownloadStrategy,
:git => GitDownloadStrategy,
:hg => MercurialDownloadStrategy,
:nounzip => NoUnzipCurlDownloadStrategy,
:post => CurlPostDownloadStrategy,
:svn => SubversionDownloadStrategy,
}
def initialize url, specs=nil
raise "No url provided" if url.nil?
@url = url
unless specs.nil?
# Get download strategy hint, if any
@using = specs.delete :using
# The rest of the specs are for source control
@specs = specs
end
end
# Returns a suitable DownloadStrategy class that can be
# used to retreive this software package.
def download_strategy
return detect_download_strategy(@url) if @using.nil?
# If a class is passed, assume it is a download strategy
return @using if @using.kind_of? Class
detected = VCS_SYMBOLS[@using]
raise "Unknown strategy #{@using} was requested." unless detected
return detected
end
def detect_version
Pathname.new(@url).version
end
end
# Used to annotate formulae that duplicate OS X provided software
# or cause conflicts when linked in.
class KegOnlyReason
attr_reader :reason, :explanation
def initialize reason, explanation=nil
@reason = reason
@explanation = explanation
end
def to_s
if @reason == :provided_by_osx
<<-EOS.strip
Mac OS X already provides this program and installing another version in
parallel can cause all kinds of trouble.
#{@explanation}
EOS
else
@reason.strip
end
end
end
# Used to annotate formulae that won't build correctly with LLVM.
class FailsWithLLVM
attr_reader :msg, :data, :build
def initialize msg=nil, data=nil
if msg.nil? or msg.kind_of? Hash
@msg = "(No specific reason was given)"
data = msg
else
@msg = msg
end
@data = data
@build = data.delete :build rescue nil
end
def reason
s = @msg
s += "Tested with LLVM build #{@build}" unless @build == nil
s += "\n"
return s
end
def handle_failure
return unless ENV.compiler == :llvm
# version 2336 is the latest version as of Xcode 4.2, so it is the
# latest version we have tested against so we will switch to GCC and
# bump this integer when Xcode 4.3 is released. TODO do that!
if build.to_i >= 2336
if MacOS.xcode_version < "4.2"
opoo "Formula will not build with LLVM, using GCC"
ENV.gcc
else
opoo "Formula will not build with LLVM, trying Clang"
ENV.clang
end
return
end
opoo "Building with LLVM, but this formula is reported to not work with LLVM:"
puts
puts reason
puts
puts <<-EOS.undent
We are continuing anyway so if the build succeeds, please open a ticket with
the following information: #{MacOS.llvm_build_version}-#{MACOS_VERSION}. So
that we can update the formula accordingly. Thanks!
EOS
puts
if MacOS.xcode_version < "4.2"
puts "If it doesn't work you can: brew install --use-gcc"
else
puts "If it doesn't work you can try: brew install --use-clang"
end
puts
end
end