Просмотр исходного кода

Merge topic 'clang-cl-std'

3f82c5904d Clang: Add standard flags support when simulating MSVC
8381bc12ad Clang: Avoid extra C++ feature detection when simulating MSVC
6cddf7ba32 Clang: Refactor standard flags logic when simulating MSVC

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1906
Brad King 7 лет назад
Родитель
Сommit
77705a2c28
1 измененных файлов с 42 добавлено и 5 удалено
  1. 42 5
      Modules/Compiler/Clang-CXX.cmake

+ 42 - 5
Modules/Compiler/Clang-CXX.cmake

@@ -51,8 +51,33 @@ if(NOT "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
   endif()
 
   unset(_clang_version_std17)
+
+  __compiler_check_default_language_standard(CXX 2.1 98)
+elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 3.9
+    AND CMAKE_CXX_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.0)
+  # This version of clang-cl and the MSVC version it simulates have
+  # support for -std: flags.
+  set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std:c++14")
+  set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std:c++14")
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)
+    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++17")
+    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++17")
+    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
+    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
+  else()
+    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++latest")
+    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++latest")
+  endif()
+
+  __compiler_check_default_language_standard(CXX 3.9 14)
 else()
-  # clang-cl does not know these options because it behaves like cl.exe
+  # This version of clang-cl, or the MSVC version it simulates, does not have
+  # language standards.  Set these options as empty strings so the feature
+  # test infrastructure can at least check to see if they are defined.
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
   set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
   set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "")
@@ -63,10 +88,22 @@ else()
   set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "")
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "")
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "")
-endif()
 
-if(NOT "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
-  __compiler_check_default_language_standard(CXX 2.1 98)
-else()
+  # There is no meaningful default for this
   set(CMAKE_CXX_STANDARD_DEFAULT "")
+
+  # There are no compiler modes so we only need to test features once.
+  # Override the default macro for this special case.  Pretend that
+  # all language standards are available so that at least compilation
+  # can be attempted.
+  macro(cmake_record_cxx_compile_features)
+    list(APPEND CMAKE_CXX_COMPILE_FEATURES
+      cxx_std_98
+      cxx_std_11
+      cxx_std_14
+      cxx_std_17
+      cxx_std_20
+      )
+    _record_compiler_features(CXX "" CMAKE_CXX_COMPILE_FEATURES)
+  endmacro()
 endif()