From 14364bbaee7de213b51abef5ac1f75b9100982f5 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Thu, 5 Jul 2018 20:15:57 +0100 Subject: [PATCH] extend/ENV: support CX11 for LLVM Clang. Fix some checks for `:clang` which should match for either `:clang` or `:llvm_clang`. Note that's not every check. --- Library/Homebrew/extend/ENV/shared.rb | 19 +++++++++++++------ Library/Homebrew/extend/ENV/std.rb | 4 ++-- Library/Homebrew/extend/ENV/super.rb | 4 ++-- Library/Homebrew/test/ENV_spec.rb | 12 ++++++++++++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Library/Homebrew/extend/ENV/shared.rb b/Library/Homebrew/extend/ENV/shared.rb index 9ba3a244a4..6be8f51cdd 100644 --- a/Library/Homebrew/extend/ENV/shared.rb +++ b/Library/Homebrew/extend/ENV/shared.rb @@ -147,7 +147,7 @@ module SharedEnvExtension # Outputs the current compiler. # @return [Symbol] - #
# Do something only for clang
+  # 
# Do something only for the system clang
   # if ENV.compiler == :clang
   #   # modify CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS in one go:
   #   ENV.append_to_cflags "-I ./missing/includes"
@@ -301,6 +301,18 @@ module SharedEnvExtension
   # A no-op until we enable this by default again (which we may never do).
   def permit_weak_imports; end
 
+  # @private
+  def compiler_any_clang?(cc = compiler)
+    %w[clang llvm_clang].include?(cc.to_s)
+  end
+
+  # @private
+  def compiler_with_cxx11_support?(cc)
+    return if compiler_any_clang?(cc)
+    version = cc[/^gcc-(\d+(?:\.\d+)?)$/, 1]
+    version && Version.create(version) >= Version.create("4.8")
+  end
+
   private
 
   def cc=(val)
@@ -330,11 +342,6 @@ module SharedEnvExtension
     return unless homebrew_cc =~ GNU_GCC_REGEXP
     raise "Non-Apple GCC can't build universal binaries"
   end
-
-  def gcc_with_cxx11_support?(cc)
-    version = cc[/^gcc-(\d+(?:\.\d+)?)$/, 1]
-    version && Version.create(version) >= Version.create("4.8")
-  end
 end
 
 require "extend/os/extend/ENV/shared"
diff --git a/Library/Homebrew/extend/ENV/std.rb b/Library/Homebrew/extend/ENV/std.rb
index 17e0fd67a0..5a152f0d55 100644
--- a/Library/Homebrew/extend/ENV/std.rb
+++ b/Library/Homebrew/extend/ENV/std.rb
@@ -157,7 +157,7 @@ module Stdenv
     append_to_cflags Hardware::CPU.universal_archs.as_arch_flags
     append "LDFLAGS", Hardware::CPU.universal_archs.as_arch_flags
 
-    return if compiler == :clang
+    return if compiler_any_clang?
     return unless Hardware.is_32_bit?
     # Can't mix "-march" for a 32-bit CPU  with "-arch x86_64"
     replace_in_cflags(/-march=\S*/, "-Xarch_#{Hardware::CPU.arch_32_bit} \\0")
@@ -167,7 +167,7 @@ module Stdenv
     if compiler == :clang
       append "CXX", "-std=c++11"
       append "CXX", "-stdlib=libc++"
-    elsif gcc_with_cxx11_support?(compiler)
+    elsif compiler_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 3a23dfd7f4..aa12aa71c5 100644
--- a/Library/Homebrew/extend/ENV/super.rb
+++ b/Library/Homebrew/extend/ENV/super.rb
@@ -276,7 +276,7 @@ module Superenv
     self["HOMEBREW_ARCHFLAGS"] = Hardware::CPU.universal_archs.as_arch_flags
 
     # GCC doesn't accept "-march" for a 32-bit CPU with "-arch x86_64"
-    return if compiler == :clang
+    return if compiler_any_clang?
     return unless Hardware::CPU.is_32_bit?
     self["HOMEBREW_OPTFLAGS"] = self["HOMEBREW_OPTFLAGS"].sub(
       /-march=\S*/,
@@ -300,7 +300,7 @@ module Superenv
     if homebrew_cc == "clang"
       append "HOMEBREW_CCCFG", "x", ""
       append "HOMEBREW_CCCFG", "g", ""
-    elsif gcc_with_cxx11_support?(homebrew_cc)
+    elsif compiler_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/ENV_spec.rb b/Library/Homebrew/test/ENV_spec.rb
index b39ae374c7..aed0608e00 100644
--- a/Library/Homebrew/test/ENV_spec.rb
+++ b/Library/Homebrew/test/ENV_spec.rb
@@ -156,6 +156,18 @@ shared_examples EnvActivation do
       expect(subject["FOO"]).to eq "bar"
     end
   end
+
+  describe "#compiler_any_clang?" do
+    it "returns true for llvm_clang" do
+      expect(subject.compiler_any_clang?(:llvm_clang)).to be true
+    end
+  end
+
+  describe "#compiler_with_cxx11_support?" do
+    it "returns true for gcc-4.9" do
+      expect(subject.compiler_with_cxx11_support?("gcc-4.9")).to be true
+    end
+  end
 end
 
 describe Stdenv do