mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-11 16:32:14 -06:00
MSVC: Add flags for C++ language standards
Visual Studio 2015 Update 3 introduced the notion of language standard levels to MSVC. The language standard level is defined in `_MSVC_LANG` instead of `__cplusplus`. It also added support for the `-std:c++14` and `-std:c++latest` flags, although the compiler defaults to its C++14 mode anyway. Visual Studio 2017 Update 3 will introduce support for the `-std:c++17` flag. Fixes: #16482
This commit is contained in:
@@ -27,12 +27,18 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
|
||||
@CMAKE_CXX_COMPILER_ID_PLATFORM_CONTENT@
|
||||
@CMAKE_CXX_COMPILER_ID_ERROR_FOR_TEST@
|
||||
|
||||
#if defined(_MSC_VER) && defined(_MSVC_LANG)
|
||||
#define CXX_STD _MSVC_LANG
|
||||
#else
|
||||
#define CXX_STD __cplusplus
|
||||
#endif
|
||||
|
||||
const char* info_language_dialect_default = "INFO" ":" "dialect_default["
|
||||
#if __cplusplus > 201402L
|
||||
#if CXX_STD > 201402L
|
||||
"17"
|
||||
#elif __cplusplus >= 201402L
|
||||
#elif CXX_STD >= 201402L
|
||||
"14"
|
||||
#elif __cplusplus >= 201103L
|
||||
#elif CXX_STD >= 201103L
|
||||
"11"
|
||||
#else
|
||||
"98"
|
||||
|
||||
@@ -3,7 +3,25 @@
|
||||
|
||||
include(Compiler/CMakeCommonCompilerMacros)
|
||||
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0)
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.10.25017)
|
||||
# VS 2015 Update 3 and above support language standard level flags,
|
||||
# with the default and minimum level being C++14.
|
||||
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 19.11.25505)
|
||||
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++17")
|
||||
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++17")
|
||||
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 19.0 14)
|
||||
elseif (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0)
|
||||
# MSVC has no specific options to set language standards, but set them as
|
||||
# empty strings anyways so the feature test infrastructure can at least check
|
||||
# to see if they are defined.
|
||||
|
||||
@@ -2,25 +2,30 @@
|
||||
template <long l>
|
||||
struct Outputter;
|
||||
|
||||
#if defined(_MSC_VER) && defined(_MSVC_LANG)
|
||||
#define CXX_STD _MSVC_LANG
|
||||
#else
|
||||
#define CXX_STD __cplusplus
|
||||
#endif
|
||||
|
||||
#if DEFAULT_CXX17
|
||||
#if __cplusplus <= 201402L
|
||||
Outputter<__cplusplus> o;
|
||||
#if CXX_STD <= 201402L
|
||||
Outputter<CXX_STD> o;
|
||||
#endif
|
||||
#elif DEFAULT_CXX14
|
||||
#if __cplusplus != 201402L
|
||||
Outputter<__cplusplus> o;
|
||||
#if CXX_STD != 201402L
|
||||
Outputter<CXX_STD> o;
|
||||
#endif
|
||||
#elif DEFAULT_CXX11
|
||||
#if __cplusplus != 201103L
|
||||
Outputter<__cplusplus> o;
|
||||
#if CXX_STD != 201103L
|
||||
Outputter<CXX_STD> o;
|
||||
#endif
|
||||
#else
|
||||
#if !DEFAULT_CXX98
|
||||
#error Buildsystem error
|
||||
#endif
|
||||
#if __cplusplus != 199711L && __cplusplus != 1 && \
|
||||
!defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||
Outputter<__cplusplus> o;
|
||||
#if CXX_STD != 199711L && CXX_STD != 1 && !defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||
Outputter<CXX_STD> o;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user