diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index 9b501d4b33..6c8d60a147 100755 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -115,7 +115,11 @@ def install f end if f.fails_with? ENV.compiler - ENV.send CompilerSelector.new(f, ENV.compiler).compiler + begin + ENV.send CompilerSelector.new(f, ENV.compiler).compiler + rescue CompilerSelectionError => e + raise e.message + end end f.brew do diff --git a/Library/Homebrew/compilers.rb b/Library/Homebrew/compilers.rb index b871e1aeb8..37ce6cdb24 100644 --- a/Library/Homebrew/compilers.rb +++ b/Library/Homebrew/compilers.rb @@ -53,11 +53,18 @@ class CompilerSelector end end + # Attempts to select an appropriate alternate compiler, but + # if none can be found raises CompilerError instead def compiler begin cc = @compilers.pop end while @f.fails_with?(cc) - cc.nil? ? @old_compiler : cc.name + + if cc.nil? + raise CompilerSelectionError + else + cc.name + end end private diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 4f1fafdcee..0dbdb8b1d3 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -160,6 +160,26 @@ class BuildError < Homebrew::InstallationError end end +# raised by CompilerSelector if the formula fails with all of +# the compilers available on the user's system +class CompilerSelectionError < StandardError + def message + if MacOS.version > :tiger then <<-EOS.undent + This formula cannot be built with any available compilers. + To install this formula, you may need to: + brew tap homebrew/dupes + brew install apple-gcc42 + EOS + # tigerbrew has a separate apple-gcc42 for Xcode 2.5 + else <<-EOS.undent + This formula cannot be built with any available compilers. + To install this formula, you need to: + brew install apple-gcc42 + EOS + end + end +end + # raised in CurlDownloadStrategy.fetch class CurlDownloadStrategyError < RuntimeError end diff --git a/Library/Homebrew/test/test_compiler_selector.rb b/Library/Homebrew/test/test_compiler_selector.rb index 6e3a36366a..4ce682c96c 100644 --- a/Library/Homebrew/test/test_compiler_selector.rb +++ b/Library/Homebrew/test/test_compiler_selector.rb @@ -31,7 +31,7 @@ class CompilerSelectorTests < Test::Unit::TestCase def test_all_compiler_failures @f << :clang << :llvm << :gcc - assert_equal @cc, actual_cc + assert_raise(CompilerSelectionError) { actual_cc } end def test_no_compiler_failures @@ -77,13 +77,13 @@ class CompilerSelectorTests < Test::Unit::TestCase def test_missing_gcc MacOS.stubs(:gcc_build_version).returns(nil) @f << :clang << :llvm - assert_equal @cc, actual_cc + assert_raise(CompilerSelectionError) { actual_cc } end def test_missing_llvm_and_gcc MacOS.stubs(:gcc_build_version).returns(nil) MacOS.stubs(:llvm_build_version).returns(nil) @f << :clang - assert_equal @cc, actual_cc + assert_raise(CompilerSelectionError) { actual_cc } end end