From 01e8e180a89a761ba6ce9bacf0a54a478b9dcf65 Mon Sep 17 00:00:00 2001 From: msbit Date: Thu, 16 Jun 2016 22:15:28 +1000 Subject: [PATCH] ENV: mark gcc-6 as supporting C++11 (#349) Add SharedEnvExtension#gcc_with_cxx11_support? to centralise the logic for checking whether a compiler is known to support C++11. Update logic to accept GCC 4.8 and above (including 6). Thereby also address oversight in #163 where support for GCC 6 was added without updating the C++11 compiler whitelist. Add tests for Superenv#cxx11. Closes #346. --- Library/Homebrew/extend/ENV/shared.rb | 5 +++++ Library/Homebrew/extend/ENV/std.rb | 2 +- Library/Homebrew/extend/ENV/super.rb | 5 ++--- Library/Homebrew/test/test_ENV.rb | 29 +++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/extend/ENV/shared.rb b/Library/Homebrew/extend/ENV/shared.rb index eeba5bbf9b..2debbae580 100644 --- a/Library/Homebrew/extend/ENV/shared.rb +++ b/Library/Homebrew/extend/ENV/shared.rb @@ -322,4 +322,9 @@ module SharedEnvExtension raise "Non-Apple GCC can't build universal binaries" end end + + def gcc_with_cxx11_support?(cc) + version = cc[/^gcc-(\d+(?:\.\d+)?)$/, 1] + version && Version.new(version) >= Version.new("4.8") + end end diff --git a/Library/Homebrew/extend/ENV/std.rb b/Library/Homebrew/extend/ENV/std.rb index 87eebb753d..8be0b48cec 100644 --- a/Library/Homebrew/extend/ENV/std.rb +++ b/Library/Homebrew/extend/ENV/std.rb @@ -287,7 +287,7 @@ module Stdenv if compiler == :clang append "CXX", "-std=c++11" append "CXX", "-stdlib=libc++" - elsif compiler =~ /gcc-(4\.(8|9)|5)/ + elsif gcc_with_cxx11_support?(compiler) append "CXX", "-std=c++11" else raise "The selected compiler doesn't support C++11: #{compiler}" diff --git a/Library/Homebrew/extend/ENV/super.rb b/Library/Homebrew/extend/ENV/super.rb index 7f335acb2d..1ef5c465df 100644 --- a/Library/Homebrew/extend/ENV/super.rb +++ b/Library/Homebrew/extend/ENV/super.rb @@ -303,11 +303,10 @@ module Superenv end def cxx11 - case homebrew_cc - when "clang" + if homebrew_cc == "clang" append "HOMEBREW_CCCFG", "x", "" append "HOMEBREW_CCCFG", "g", "" - when /gcc-(4\.(8|9)|5)/ + elsif gcc_with_cxx11_support?(homebrew_cc) append "HOMEBREW_CCCFG", "x", "" else raise "The selected compiler doesn't support C++11: #{homebrew_cc}" diff --git a/Library/Homebrew/test/test_ENV.rb b/Library/Homebrew/test/test_ENV.rb index 74d1cff794..665e344e63 100644 --- a/Library/Homebrew/test/test_ENV.rb +++ b/Library/Homebrew/test/test_ENV.rb @@ -141,4 +141,33 @@ class SuperenvTests < Homebrew::TestCase assert_equal [], @env.deps assert_equal [], @env.keg_only_deps end + + def test_unsupported_cxx11 + %w[gcc gcc-4.7].each do |compiler| + @env["HOMEBREW_CC"] = compiler + assert_raises do + @env.cxx11 + end + refute_match "x", @env["HOMEBREW_CCCFG"] + end + end + + def test_supported_cxx11_gcc_5 + @env["HOMEBREW_CC"] = "gcc-5" + @env.cxx11 + assert_match "x", @env["HOMEBREW_CCCFG"] + end + + def test_supported_cxx11_gcc_6 + @env["HOMEBREW_CC"] = "gcc-6" + @env.cxx11 + assert_match "x", @env["HOMEBREW_CCCFG"] + end + + def test_supported_cxx11_clang + @env["HOMEBREW_CC"] = "clang" + @env.cxx11 + assert_match "x", @env["HOMEBREW_CCCFG"] + assert_match "g", @env["HOMEBREW_CCCFG"] + end end