1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4include(Compiler/CMakeCommonCompilerMacros)
5
6set(CMAKE_CXX_CLANG_TIDY_DRIVER_MODE "cl")
7set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE_DRIVER_MODE "cl")
8
9if ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0.24215.1 AND
10     CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.10) OR
11   CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.10.25017)
12
13  # VS 2015 Update 3 and above support language standard level flags,
14  # with the default and minimum level being C++14.
15  set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
16  set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
17  set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
18  set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "")
19  set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "")
20  set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std:c++14")
21  set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std:c++14")
22
23  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.11.25505)
24    set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
25    set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
26    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++17")
27    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++17")
28  else()
29    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++latest")
30    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++latest")
31  endif()
32
33  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29.30129)
34    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++20")
35    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++20")
36    set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-std:c++latest")
37    set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-std:c++latest")
38  elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.12.25835)
39    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
40    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
41  endif()
42
43  __compiler_check_default_language_standard(CXX 19.0 14)
44
45elseif (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0)
46  # MSVC has no specific options to set language standards, but set them as
47  # empty strings anyways so the feature test infrastructure can at least check
48  # to see if they are defined.
49  set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
50  set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
51  set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "")
52  set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "")
53  set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "")
54  set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "")
55  set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "")
56  set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "")
57  set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "")
58  set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "")
59
60  # There is no meaningful default for this
61  set(CMAKE_CXX_STANDARD_DEFAULT "")
62
63  # There are no compiler modes so we only need to test features once.
64  # Override the default macro for this special case.  Pretend that
65  # all language standards are available so that at least compilation
66  # can be attempted.
67  macro(cmake_record_cxx_compile_features)
68    list(APPEND CMAKE_CXX_COMPILE_FEATURES
69      cxx_std_98
70      cxx_std_11
71      cxx_std_14
72      cxx_std_17
73      cxx_std_20
74      cxx_std_23
75      )
76    _record_compiler_features(CXX "" CMAKE_CXX_COMPILE_FEATURES)
77  endmacro()
78endif()
79
80# /JMC "Just My Code" is only supported by MSVC 19.05 onward.
81if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.05)
82  set(CMAKE_CXX_COMPILE_OPTIONS_JMC "-JMC")
83endif()
84
85# The `/external:I` flag was made non-experimental in 19.29.30036.3.
86if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29.30036.3)
87  set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-external:I ")
88  set(_CMAKE_INCLUDE_SYSTEM_FLAG_CXX_WARNING "-external:W0 ")
89endif ()
90