From 22f804e0ec1f827a11396394206e2cd5834e5522 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 28 Oct 2021 12:10:33 -0400 Subject: 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. --- Modules/Compiler/MSVC-C.cmake | 64 +++++++++++++++++++++++-------------------- 1 file 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") -- cgit v0.12 From 6561b032bc995a248bc065690f0af6d98288ecea Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 28 Oct 2021 12:18:42 -0400 Subject: MSVC: Tolerate c_std_17 and c_std_23 features on older compiler versions MSVC `cl` versions prior to 19.27 had no `-std:c*` flags for C standards. List the `c_std_{17,23}` features anyway. This allows projects to at least attempt compilation with these compilers since they do not have any modes. --- Modules/Compiler/MSVC-C.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/Compiler/MSVC-C.cmake b/Modules/Compiler/MSVC-C.cmake index aca7995..8da0ced 100644 --- a/Modules/Compiler/MSVC-C.cmake +++ b/Modules/Compiler/MSVC-C.cmake @@ -49,6 +49,8 @@ else() c_std_90 c_std_99 c_std_11 + c_std_17 + c_std_23 c_function_prototypes ) list(APPEND CMAKE_C90_COMPILE_FEATURES c_std_90 c_function_prototypes) -- cgit v0.12 From c5cc4ddac4dfc376844a210b4cd25a01565b024d Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 28 Oct 2021 12:21:13 -0400 Subject: MSVC: Add support for C17 C17 support has been available in MSVC since VS 16.8. Fixes: #22816 --- Modules/Compiler/MSVC-C.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/Compiler/MSVC-C.cmake b/Modules/Compiler/MSVC-C.cmake index 8da0ced..a53df46 100644 --- a/Modules/Compiler/MSVC-C.cmake +++ b/Modules/Compiler/MSVC-C.cmake @@ -15,6 +15,8 @@ if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON) set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON) set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON) + set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std:c17") + set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std:c17") else() # Special case for 19.27 (VS 16.7): C11 has partial support. macro(cmake_record_c_compile_features) -- cgit v0.12