summaryrefslogtreecommitdiffstats
path: root/Modules/Compiler
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2021-10-28 16:10:33 (GMT)
committerBrad King <brad.king@kitware.com>2021-10-28 16:27:00 (GMT)
commit22f804e0ec1f827a11396394206e2cd5834e5522 (patch)
tree152dba5cc2b906c3753d71808bfe98c80679c87b /Modules/Compiler
parent28a033cc7de056d1a74857606397bb294ebe27ac (diff)
downloadCMake-22f804e0ec1f827a11396394206e2cd5834e5522.zip
CMake-22f804e0ec1f827a11396394206e2cd5834e5522.tar.gz
CMake-22f804e0ec1f827a11396394206e2cd5834e5522.tar.bz2
MSVC: Refactor C compile features table for C90, C99, and C11
The custom "no modes" `cmake_record_c_compile_features` implementation should only be used in `cl` versions prior to 19.27 because they had no `-std:c*` flags for C standards. For 19.27 we need a different custom implementation to account for partial C11 support. For 19.28 and above we can use the default implementation through the `*__HAS_FULL_SUPPORT` settings. We already use this pattern in the MSVC C++ compile feature table.
Diffstat (limited to 'Modules/Compiler')
-rw-r--r--Modules/Compiler/MSVC-C.cmake64
1 files changed, 35 insertions, 29 deletions
diff --git a/Modules/Compiler/MSVC-C.cmake b/Modules/Compiler/MSVC-C.cmake
index 4ba1eea..aca7995 100644
--- a/Modules/Compiler/MSVC-C.cmake
+++ b/Modules/Compiler/MSVC-C.cmake
@@ -11,6 +11,20 @@ if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27)
set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std:c11")
set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std:c11")
+ if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
+ set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
+ set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+ set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+ else()
+ # Special case for 19.27 (VS 16.7): C11 has partial support.
+ macro(cmake_record_c_compile_features)
+ _has_compiler_features_c(90)
+ _has_compiler_features_c(99)
+ list(APPEND CMAKE_C11_COMPILE_FEATURES c_std_11)
+ set(_result 0) # expected by cmake_determine_compile_features
+ endmacro()
+ endif()
+
__compiler_check_default_language_standard(C 19.27 99)
else()
# MSVC has no specific options to set C language standards, but set them as
@@ -25,41 +39,33 @@ else()
# There is no meaningful default for this
set(CMAKE_C_STANDARD_DEFAULT "")
+
+ # There are no C compiler modes so we hard-code the known compiler supported
+ # features. 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_c_compile_features)
+ list(APPEND CMAKE_C_COMPILE_FEATURES
+ c_std_90
+ c_std_99
+ c_std_11
+ c_function_prototypes
+ )
+ list(APPEND CMAKE_C90_COMPILE_FEATURES c_std_90 c_function_prototypes)
+ list(APPEND CMAKE_C99_COMPILE_FEATURES c_std_99)
+ list(APPEND CMAKE_C11_COMPILE_FEATURES c_std_11)
+ if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0)
+ list(APPEND CMAKE_C_COMPILE_FEATURES c_variadic_macros)
+ list(APPEND CMAKE_C99_COMPILE_FEATURES c_variadic_macros)
+ endif()
+ set(_result 0) # expected by cmake_determine_compile_features
+ endmacro()
endif()
set(CMAKE_C_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -TC)
set(CMAKE_C_CLANG_TIDY_DRIVER_MODE "cl")
set(CMAKE_C_INCLUDE_WHAT_YOU_USE_DRIVER_MODE "cl")
-# There are no C compiler modes so we hard-code the known compiler supported
-# features. 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_c_compile_features)
- list(APPEND CMAKE_C_COMPILE_FEATURES
- c_std_90
- c_std_99
- c_std_11
- c_function_prototypes
- )
- list(APPEND CMAKE_C90_COMPILE_FEATURES c_std_90 c_function_prototypes)
- list(APPEND CMAKE_C99_COMPILE_FEATURES c_std_99)
- list(APPEND CMAKE_C11_COMPILE_FEATURES c_std_11)
- if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0)
- list(APPEND CMAKE_C_COMPILE_FEATURES c_variadic_macros)
- list(APPEND CMAKE_C99_COMPILE_FEATURES c_variadic_macros)
- endif()
- if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27)
- list(APPEND CMAKE_C_COMPILE_FEATURES c_restrict)
- list(APPEND CMAKE_C99_COMPILE_FEATURES c_restrict)
- endif()
- if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
- list(APPEND CMAKE_C_COMPILE_FEATURES c_static_assert)
- list(APPEND CMAKE_C11_COMPILE_FEATURES c_static_assert)
- endif()
- set(_result 0) # expected by cmake_determine_compile_features
-endmacro()
-
# /JMC "Just My Code" is only supported by MSVC 19.05 onward.
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.05)
set(CMAKE_C_COMPILE_OPTIONS_JMC "-JMC")