Selaa lähdekoodia

Merge topic 'memorize_c_compilers_with_full_standard_support'

983533a4b8 Record when C compilers have gained full support for 90,99,11
f92ccbc306 CompileFeatures: memoize C compilers with full language level support

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3146
Brad King 6 vuotta sitten
vanhempi
sitoutus
afa2614eea

+ 3 - 0
Modules/Compiler/AppleClang-C.cmake

@@ -4,12 +4,15 @@ __compiler_clang(C)
 if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c90")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu90")
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
 
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+  set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
 endif()
 
 __compiler_check_default_language_standard(C 4.0 99)

+ 18 - 3
Modules/Compiler/CMakeCommonCompilerMacros.cmake

@@ -65,13 +65,28 @@ endmacro()
 macro(cmake_record_c_compile_features)
   set(_result 0)
   if(_result EQUAL 0 AND DEFINED CMAKE_C11_STANDARD_COMPILE_OPTION)
-    _record_compiler_features_c(11)
+    if(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT)
+      _has_compiler_features_c(11)
+    else()
+      _record_compiler_features_c(11)
+    endif()
+    unset(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT)
   endif()
   if(_result EQUAL 0 AND DEFINED CMAKE_C99_STANDARD_COMPILE_OPTION)
-    _record_compiler_features_c(99)
+    if(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT)
+      _has_compiler_features_c(99)
+    else()
+      _record_compiler_features_c(99)
+    endif()
+    unset(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT)
   endif()
   if(_result EQUAL 0 AND DEFINED CMAKE_C90_STANDARD_COMPILE_OPTION)
-    _record_compiler_features_c(90)
+    if(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT)
+      _has_compiler_features_c(90)
+    else()
+      _record_compiler_features_c(90)
+    endif()
+    unset(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT)
   endif()
 endmacro()
 

+ 3 - 0
Modules/Compiler/Clang-C.cmake

@@ -10,12 +10,15 @@ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
   if(NOT "x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC")
     set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c90")
     set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu90")
+    set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
 
     set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
     set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+    set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   else()
     # clang-cl doesn't have any of these
     set(CMAKE_C90_STANDARD_COMPILE_OPTION "")

+ 3 - 0
Modules/Compiler/Cray-C.cmake

@@ -10,11 +10,14 @@ string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -DNDEBUG")
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION  -h noc99,conform)
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION -h noc99,gnu)
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION  -h c99,conform)
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION -h c99,gnu)
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.5)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION  -h std=c11,conform)
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION -h std=c11,gnu)
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif ()
 endif ()
 

+ 3 - 0
Modules/Compiler/GNU-C.cmake

@@ -10,13 +10,16 @@ elseif (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
 endif()
 
 if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 endif()
 
 if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+  set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
 elseif (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.6)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c1x")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu1x")

+ 6 - 0
Modules/Compiler/Intel-C.cmake

@@ -12,13 +12,16 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC")
   if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 16.0.0)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-Qstd=c11")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-Qstd=c11")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 
   if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 12.0)
     set(CMAKE_C90_STANDARD_COMPILE_OPTION "-Qstd=c89")
     set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-Qstd=c89")
+    set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_C99_STANDARD_COMPILE_OPTION "-Qstd=c99")
     set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-Qstd=c99")
+    set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 
 else()
@@ -26,13 +29,16 @@ else()
   if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0.0)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 
   if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 12.0)
     set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c89")
     set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu89")
+    set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
     set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+    set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 
 endif()

+ 3 - 0
Modules/Compiler/PGI-C.cmake

@@ -6,11 +6,14 @@ string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -DNDEBUG")
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.10)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION -c89)
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION -c89)
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION -c99)
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION -c99)
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15.3)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION -c11)
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION -c11)
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif ()
 endif ()
 

+ 3 - 0
Modules/Compiler/SunPro-C.cmake

@@ -39,10 +39,13 @@ set(CMAKE_C_LINKER_WRAPPER_FLAG_SEP ",")
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 5.13)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c89")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=c89")
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=c99")
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=c11")
+  set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
 elseif (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 5.11)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "")

+ 3 - 0
Modules/Compiler/XL-C.cmake

@@ -9,11 +9,14 @@ string(APPEND CMAKE_C_FLAGS_INIT " -qthreaded")
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "-qlanglvl=stdc89")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-qlanglvl=extc89")
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "-qlanglvl=stdc99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-qlanglvl=extc99")
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.1)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-qlanglvl=extc1x")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif ()
 endif()
 

+ 3 - 0
Modules/Compiler/XLClang-C.cmake

@@ -4,13 +4,16 @@ __compiler_xlclang(C)
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION  "-std=c89")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu89")
+  set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION  "-std=c99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+  set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-qlanglvl=extc1x")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-std=c11")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif ()
 endif()
 

+ 11 - 0
Modules/Internal/FeatureTesting.cmake

@@ -88,3 +88,14 @@ macro(_record_compiler_features_cxx std)
   endif()
   unset(lang_level_has_features)
 endmacro()
+
+macro(_has_compiler_features lang level compile_flags feature_list)
+  # presume all known features are supported
+  get_property(known_features GLOBAL PROPERTY CMAKE_${lang}${level}_KNOWN_FEATURES)
+  list(APPEND ${feature_list} ${known_features})
+endmacro()
+
+macro(_has_compiler_features_c std)
+  list(APPEND CMAKE_C${std}_COMPILE_FEATURES c_std_${std})
+  _has_compiler_features(C ${std} "${CMAKE_C${std}_STANDARD_COMPILE_OPTION}" CMAKE_C${std}_COMPILE_FEATURES)
+endmacro()