diff --git a/Library/Homebrew/extend/ENV/shared.rb b/Library/Homebrew/extend/ENV/shared.rb index 924ac77cab83..2964fbd16018 100644 --- a/Library/Homebrew/extend/ENV/shared.rb +++ b/Library/Homebrew/extend/ENV/shared.rb @@ -185,11 +185,29 @@ def ld64 append "LDFLAGS", "-B#{ld64.bin}/" end + def gcc_version_formula(version) + gcc_formula = Formulary.factory("gcc") + return gcc_formula if gcc_formula.version.to_s.include?(version) + + gcc_name = 'gcc' + version.delete('.') + Formulary.factory(gcc_name) + end + def warn_about_non_apple_gcc(gcc) + gcc_name = 'gcc' + gcc.delete('.') + begin - gcc_name = 'gcc' + gcc.delete('.') - gcc = Formulary.factory(gcc_name) - if !gcc.opt_prefix.exist? + gcc_formula = gcc_version_formula(gcc) + if gcc_formula.name == "gcc" + return if gcc_formula.opt_prefix.exist? + raise <<-EOS.undent + The Homebrew GCC was not installed. + You must: + brew install gcc + EOS + end + + if !gcc_formula.opt_prefix.exist? raise <<-EOS.undent The requested Homebrew GCC, #{gcc_name}, was not installed. You must: diff --git a/Library/Homebrew/extend/ENV/std.rb b/Library/Homebrew/extend/ENV/std.rb index c8beee949a62..bbf5d3b03bc8 100644 --- a/Library/Homebrew/extend/ENV/std.rb +++ b/Library/Homebrew/extend/ENV/std.rb @@ -73,9 +73,8 @@ def setup_build_environment(formula=nil) if cc =~ GNU_GCC_REGEXP warn_about_non_apple_gcc($1) - gcc_name = 'gcc' + $1.delete('.') - gcc = Formulary.factory(gcc_name) - self.append_path('PATH', gcc.opt_prefix/'bin') + gcc_formula = gcc_version_formula($1) + self.append_path('PATH', gcc_formula.opt_prefix/'bin') end # Add lib and include etc. from the current macosxsdk to compiler flags: diff --git a/Library/Homebrew/extend/ENV/super.rb b/Library/Homebrew/extend/ENV/super.rb index 14253ff88c21..1387417572aa 100644 --- a/Library/Homebrew/extend/ENV/super.rb +++ b/Library/Homebrew/extend/ENV/super.rb @@ -135,9 +135,8 @@ def determine_path end if self['HOMEBREW_CC'] =~ GNU_GCC_REGEXP - gcc_name = 'gcc' + $1.delete('.') - gcc = Formulary.factory(gcc_name) - paths << gcc.opt_prefix/'bin' + gcc_formula = gcc_version_formula($1) + paths << gcc_formula.opt_prefix/'bin' end paths.to_path_s diff --git a/Library/Homebrew/os/mac.rb b/Library/Homebrew/os/mac.rb index a643294843ea..2d06fe7e020c 100644 --- a/Library/Homebrew/os/mac.rb +++ b/Library/Homebrew/os/mac.rb @@ -131,8 +131,9 @@ def gcc_40_build_version def gcc_42_build_version @gcc_42_build_version ||= begin - gcc = MacOS.locate('gcc-4.2') || Formula.factory('apple-gcc42').opt_prefix/'bin/gcc-4.2' - raise unless gcc.exist? + gcc = MacOS.locate('gcc-4.2') + gcc ||= Formula.factory('apple-gcc42').opt_prefix/'bin/gcc-4.2' rescue nil + raise if gcc.nil? || !gcc.exist? rescue gcc = nil end @@ -167,13 +168,16 @@ def clang_build_version end def non_apple_gcc_version(cc) - return unless path = locate(cc) + path = Formula.factory("gcc").opt_prefix/"bin/#{cc}" + path = nil unless path.exist? + + return unless path ||= locate(cc) ivar = "@#{cc.gsub(/(-|\.)/, '')}_version" return instance_variable_get(ivar) if instance_variable_defined?(ivar) - `#{path} --version` =~ /gcc-\d.\d \(GCC\) (\d\.\d\.\d)/ - instance_variable_set(ivar, $1) + `#{path} --version` =~ /gcc(-\d\.\d \(GCC\))? (\d\.\d\.\d)/ + instance_variable_set(ivar, $2) end # See these issues for some history: diff --git a/Library/Homebrew/test/test_stdlib.rb b/Library/Homebrew/test/test_stdlib.rb index 9ccfc215335b..7bc0c03d65c1 100644 --- a/Library/Homebrew/test/test_stdlib.rb +++ b/Library/Homebrew/test/test_stdlib.rb @@ -23,6 +23,7 @@ def test_apple_libstdcxx_intercompatibility end def test_compatibility_same_compilers_and_type + assert @gcc.compatible_with?(@gcc) assert @gcc48.compatible_with?(@gcc48) assert @clang.compatible_with?(@clang) end @@ -33,8 +34,8 @@ def test_apple_gnu_libstdcxx_incompatibility end def test_gnu_cross_version_incompatibility - assert !@clang.compatible_with?(@gcc48) - assert !@gcc48.compatible_with?(@clang) + assert !@gcc48.compatible_with?(@gcc49) + assert !@gcc49.compatible_with?(@gcc48) end def test_libstdcxx_libcxx_incompatibility