aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/compilers.rb
diff options
context:
space:
mode:
authorJack Nagel2014-09-18 15:50:54 -0500
committerJack Nagel2014-09-18 15:50:54 -0500
commit8b902c764cb39aaad41baeb229ce5f1d0a9a9bfc (patch)
tree612ada20bba6b78642810a5fcee9e45b74b29420 /Library/Homebrew/compilers.rb
parentd8245b6d58a642df5550d4d0c4b5ee46306919c0 (diff)
downloadhomebrew-8b902c764cb39aaad41baeb229ce5f1d0a9a9bfc.tar.bz2
Replace CompilerQueue with predetermined priority lists
Diffstat (limited to 'Library/Homebrew/compilers.rb')
-rw-r--r--Library/Homebrew/compilers.rb87
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