diff options
| author | Jack Nagel | 2014-09-18 15:50:54 -0500 | 
|---|---|---|
| committer | Jack Nagel | 2014-09-18 15:50:54 -0500 | 
| commit | 04dae13ae7f014acf3a3300536546c7e12845884 (patch) | |
| tree | 92a807e7a0c8d8e8d1ce47afbcb2500afc47be34 /Library/Homebrew/compilers.rb | |
| parent | 288c7974dc6710738d9e92e1b0fb04e632e36d1b (diff) | |
| download | brew-04dae13ae7f014acf3a3300536546c7e12845884.tar.bz2 | |
Replace CompilerQueue with predetermined priority lists
Diffstat (limited to 'Library/Homebrew/compilers.rb')
| -rw-r--r-- | Library/Homebrew/compilers.rb | 87 | 
1 files changed, 39 insertions, 48 deletions
| diff --git a/Library/Homebrew/compilers.rb b/Library/Homebrew/compilers.rb index ba1300def..d841e18d0 100644 --- a/Library/Homebrew/compilers.rb +++ b/Library/Homebrew/compilers.rb @@ -68,74 +68,65 @@ class CompilerFailure    }  end -class CompilerQueue -  def initialize -    @array = [] -  end +class CompilerSelector +  include CompilerConstants -  def <<(o) -    @array << o -    self -  end +  Compiler = Struct.new(:name, :version) -  def pop -    @array.delete(@array.max { |a, b| a.priority <=> b.priority }) -  end +  COMPILER_PRIORITY = { +    :clang   => [:clang, :gcc, :llvm, :gnu, :gcc_4_0], +    :gcc     => [:gcc, :llvm, :gnu, :clang, :gcc_4_0], +    :llvm    => [:llvm, :gcc, :gnu, :clang, :gcc_4_0], +    :gcc_4_0 => [:gcc_4_0, :gcc, :llvm, :gnu, :clang], +  } -  def empty? -    @array.empty? +  def self.select_for(formula) +    compilers = COMPILER_PRIORITY.fetch(MacOS.default_compiler) +    new(formula, MacOS, compilers).compiler    end -end - -class CompilerSelector -  Compiler = Struct.new(:name, :version, :priority) -  attr_reader :formula +  attr_reader :formula, :failures, :versions, :compilers -  def initialize(formula, versions=MacOS) +  def initialize(formula, versions, compilers)      @formula = formula      @failures = formula.compiler_failures      @versions = versions -    @compilers = CompilerQueue.new -    %w{clang llvm gcc gcc_4_0}.map(&:to_sym).each do |cc| -      version = @versions.send("#{cc}_build_version") -      unless version.nil? -        @compilers << Compiler.new(cc, version, priority_for(cc)) -      end -    end - -    # non-Apple GCC 4.x -    CompilerConstants::GNU_GCC_VERSIONS.each do |v| -      name = "gcc-4.#{v}" -      version = @versions.non_apple_gcc_version(name) -      unless version.nil? -        # priority is based on version, with newest preferred first -        @compilers << Compiler.new(name, version, 1.0 + v/10.0) -      end -    end +    @compilers = compilers    end -  # Attempts to select an appropriate alternate compiler, but -  # if none can be found raises CompilerError instead    def compiler -    while cc = @compilers.pop -      return cc.name unless fails_with?(cc) -    end +    find_compiler { |c| return c.name unless fails_with?(c) }      raise CompilerSelectionError.new(formula)    end    private +  def find_compiler +    compilers.each do |compiler| +      case compiler +      when :gnu +        GNU_GCC_VERSIONS.reverse_each do |v| +          name = "gcc-4.#{v}" +          version = compiler_version(name) +          yield Compiler.new(name, version) if version +        end +      else +        version = compiler_version(compiler) +        yield Compiler.new(compiler, version) if version +      end +    end +  end +    def fails_with?(compiler) -    @failures.any? { |failure| failure === compiler } +    failures.any? { |failure| failure === compiler }    end -  def priority_for(cc) -    case cc -    when :clang   then @versions.clang_build_version >= 318 ? 3 : 0.5 -    when :gcc     then 2.5 -    when :llvm    then 2 -    when :gcc_4_0 then 0.25 +  def compiler_version(name) +    case name +    when GNU_GCC_REGEXP +      versions.non_apple_gcc_version(name) +    else +      versions.send("#{name}_build_version")      end    end  end | 
