mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
130 lines
3.3 KiB
Ruby
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
|