1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4 5function(cmake_determine_compile_features lang) 6 7 if("x${lang}" STREQUAL "xC" AND COMMAND cmake_record_c_compile_features) 8 message(CHECK_START "Detecting ${lang} compile features") 9 10 set(CMAKE_C90_COMPILE_FEATURES) 11 set(CMAKE_C99_COMPILE_FEATURES) 12 set(CMAKE_C11_COMPILE_FEATURES) 13 set(CMAKE_C17_COMPILE_FEATURES) 14 set(CMAKE_C23_COMPILE_FEATURES) 15 16 include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") 17 18 cmake_record_c_compile_features() 19 20 if(NOT _result EQUAL 0) 21 message(CHECK_FAIL "failed") 22 return() 23 endif() 24 25 if (CMAKE_C17_COMPILE_FEATURES AND CMAKE_C23_COMPILE_FEATURES) 26 list(REMOVE_ITEM CMAKE_C23_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES}) 27 endif() 28 if (CMAKE_C11_COMPILE_FEATURES AND CMAKE_C17_COMPILE_FEATURES) 29 list(REMOVE_ITEM CMAKE_C17_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES}) 30 endif() 31 if (CMAKE_C99_COMPILE_FEATURES AND CMAKE_C11_COMPILE_FEATURES) 32 list(REMOVE_ITEM CMAKE_C11_COMPILE_FEATURES ${CMAKE_C99_COMPILE_FEATURES}) 33 endif() 34 if (CMAKE_C90_COMPILE_FEATURES AND CMAKE_C99_COMPILE_FEATURES) 35 list(REMOVE_ITEM CMAKE_C99_COMPILE_FEATURES ${CMAKE_C90_COMPILE_FEATURES}) 36 endif() 37 38 if(NOT CMAKE_C_COMPILE_FEATURES) 39 set(CMAKE_C_COMPILE_FEATURES 40 ${CMAKE_C90_COMPILE_FEATURES} 41 ${CMAKE_C99_COMPILE_FEATURES} 42 ${CMAKE_C11_COMPILE_FEATURES} 43 ${CMAKE_C17_COMPILE_FEATURES} 44 ${CMAKE_C23_COMPILE_FEATURES} 45 ) 46 endif() 47 48 set(CMAKE_C_COMPILE_FEATURES ${CMAKE_C_COMPILE_FEATURES} PARENT_SCOPE) 49 set(CMAKE_C90_COMPILE_FEATURES ${CMAKE_C90_COMPILE_FEATURES} PARENT_SCOPE) 50 set(CMAKE_C99_COMPILE_FEATURES ${CMAKE_C99_COMPILE_FEATURES} PARENT_SCOPE) 51 set(CMAKE_C11_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES} PARENT_SCOPE) 52 set(CMAKE_C17_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES} PARENT_SCOPE) 53 set(CMAKE_C23_COMPILE_FEATURES ${CMAKE_C23_COMPILE_FEATURES} PARENT_SCOPE) 54 55 message(CHECK_PASS "done") 56 57 elseif("x${lang}" STREQUAL "xCXX" AND COMMAND cmake_record_cxx_compile_features) 58 message(CHECK_START "Detecting ${lang} compile features") 59 60 set(CMAKE_CXX98_COMPILE_FEATURES) 61 set(CMAKE_CXX11_COMPILE_FEATURES) 62 set(CMAKE_CXX14_COMPILE_FEATURES) 63 set(CMAKE_CXX17_COMPILE_FEATURES) 64 set(CMAKE_CXX20_COMPILE_FEATURES) 65 set(CMAKE_CXX23_COMPILE_FEATURES) 66 67 include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") 68 69 cmake_record_cxx_compile_features() 70 71 if(NOT _result EQUAL 0) 72 message(CHECK_FAIL "failed") 73 return() 74 endif() 75 76 if (CMAKE_CXX20_COMPILE_FEATURES AND CMAKE_CXX23_COMPILE_FEATURES) 77 list(REMOVE_ITEM CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES}) 78 endif() 79 if (CMAKE_CXX17_COMPILE_FEATURES AND CMAKE_CXX20_COMPILE_FEATURES) 80 list(REMOVE_ITEM CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES}) 81 endif() 82 if (CMAKE_CXX14_COMPILE_FEATURES AND CMAKE_CXX17_COMPILE_FEATURES) 83 list(REMOVE_ITEM CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES}) 84 endif() 85 if (CMAKE_CXX11_COMPILE_FEATURES AND CMAKE_CXX14_COMPILE_FEATURES) 86 list(REMOVE_ITEM CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES}) 87 endif() 88 if (CMAKE_CXX98_COMPILE_FEATURES AND CMAKE_CXX11_COMPILE_FEATURES) 89 list(REMOVE_ITEM CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES}) 90 endif() 91 92 if(NOT CMAKE_CXX_COMPILE_FEATURES) 93 set(CMAKE_CXX_COMPILE_FEATURES 94 ${CMAKE_CXX98_COMPILE_FEATURES} 95 ${CMAKE_CXX11_COMPILE_FEATURES} 96 ${CMAKE_CXX14_COMPILE_FEATURES} 97 ${CMAKE_CXX17_COMPILE_FEATURES} 98 ${CMAKE_CXX20_COMPILE_FEATURES} 99 ${CMAKE_CXX23_COMPILE_FEATURES} 100 ) 101 endif() 102 103 set(CMAKE_CXX_COMPILE_FEATURES ${CMAKE_CXX_COMPILE_FEATURES} PARENT_SCOPE) 104 set(CMAKE_CXX98_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES} PARENT_SCOPE) 105 set(CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES} PARENT_SCOPE) 106 set(CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES} PARENT_SCOPE) 107 set(CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES} PARENT_SCOPE) 108 set(CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES} PARENT_SCOPE) 109 set(CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX23_COMPILE_FEATURES} PARENT_SCOPE) 110 111 message(CHECK_PASS "done") 112 113 elseif("x${lang}" STREQUAL "xCUDA" AND COMMAND cmake_record_cuda_compile_features) 114 message(CHECK_START "Detecting ${lang} compile features") 115 116 set(CMAKE_CUDA03_COMPILE_FEATURES) 117 set(CMAKE_CUDA11_COMPILE_FEATURES) 118 set(CMAKE_CUDA14_COMPILE_FEATURES) 119 set(CMAKE_CUDA17_COMPILE_FEATURES) 120 set(CMAKE_CUDA20_COMPILE_FEATURES) 121 set(CMAKE_CUDA23_COMPILE_FEATURES) 122 123 include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") 124 125 cmake_record_cuda_compile_features() 126 127 if(NOT _result EQUAL 0) 128 message(CHECK_FAIL "failed") 129 return() 130 endif() 131 132 if (CMAKE_CUDA20_COMPILE_FEATURES AND CMAKE_CUDA23_COMPILE_FEATURES) 133 list(REMOVE_ITEM CMAKE_CUDA23_COMPILE_FEATURES ${CMAKE_CUDA20_COMPILE_FEATURES}) 134 endif() 135 if (CMAKE_CUDA17_COMPILE_FEATURES AND CMAKE_CUDA20_COMPILE_FEATURES) 136 list(REMOVE_ITEM CMAKE_CUDA20_COMPILE_FEATURES ${CMAKE_CUDA17_COMPILE_FEATURES}) 137 endif() 138 if (CMAKE_CUDA14_COMPILE_FEATURES AND CMAKE_CUDA17_COMPILE_FEATURES) 139 list(REMOVE_ITEM CMAKE_CUDA17_COMPILE_FEATURES ${CMAKE_CUDA14_COMPILE_FEATURES}) 140 endif() 141 if (CMAKE_CUDA11_COMPILE_FEATURES AND CMAKE_CUDA14_COMPILE_FEATURES) 142 list(REMOVE_ITEM CMAKE_CUDA14_COMPILE_FEATURES ${CMAKE_CUDA11_COMPILE_FEATURES}) 143 endif() 144 if (CMAKE_CUDA03_COMPILE_FEATURES AND CMAKE_CUDA11_COMPILE_FEATURES) 145 list(REMOVE_ITEM CMAKE_CUDA11_COMPILE_FEATURES ${CMAKE_CUDA03_COMPILE_FEATURES}) 146 endif() 147 148 if(NOT CMAKE_CUDA_COMPILE_FEATURES) 149 set(CMAKE_CUDA_COMPILE_FEATURES 150 ${CMAKE_CUDA03_COMPILE_FEATURES} 151 ${CMAKE_CUDA11_COMPILE_FEATURES} 152 ${CMAKE_CUDA14_COMPILE_FEATURES} 153 ${CMAKE_CUDA17_COMPILE_FEATURES} 154 ${CMAKE_CUDA20_COMPILE_FEATURES} 155 ${CMAKE_CUDA23_COMPILE_FEATURES} 156 ) 157 endif() 158 159 set(CMAKE_CUDA_COMPILE_FEATURES ${CMAKE_CUDA_COMPILE_FEATURES} PARENT_SCOPE) 160 set(CMAKE_CUDA03_COMPILE_FEATURES ${CMAKE_CUDA03_COMPILE_FEATURES} PARENT_SCOPE) 161 set(CMAKE_CUDA11_COMPILE_FEATURES ${CMAKE_CUDA11_COMPILE_FEATURES} PARENT_SCOPE) 162 set(CMAKE_CUDA14_COMPILE_FEATURES ${CMAKE_CUDA14_COMPILE_FEATURES} PARENT_SCOPE) 163 set(CMAKE_CUDA17_COMPILE_FEATURES ${CMAKE_CUDA17_COMPILE_FEATURES} PARENT_SCOPE) 164 set(CMAKE_CUDA20_COMPILE_FEATURES ${CMAKE_CUDA20_COMPILE_FEATURES} PARENT_SCOPE) 165 set(CMAKE_CUDA23_COMPILE_FEATURES ${CMAKE_CUDA23_COMPILE_FEATURES} PARENT_SCOPE) 166 167 message(CHECK_PASS "done") 168 169 elseif(lang STREQUAL HIP AND COMMAND cmake_record_hip_compile_features) 170 message(CHECK_START "Detecting ${lang} compile features") 171 172 set(CMAKE_HIP98_COMPILE_FEATURES) 173 set(CMAKE_HIP11_COMPILE_FEATURES) 174 set(CMAKE_HIP14_COMPILE_FEATURES) 175 set(CMAKE_HIP17_COMPILE_FEATURES) 176 set(CMAKE_HIP20_COMPILE_FEATURES) 177 set(CMAKE_HIP23_COMPILE_FEATURES) 178 179 include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") 180 181 cmake_record_hip_compile_features() 182 183 if(NOT _result EQUAL 0) 184 message(CHECK_FAIL "failed") 185 return() 186 endif() 187 188 if (CMAKE_HIP20_COMPILE_FEATURES AND CMAKE_HIP23_COMPILE_FEATURES) 189 list(REMOVE_ITEM CMAKE_HIP23_COMPILE_FEATURES ${CMAKE_HIP20_COMPILE_FEATURES}) 190 endif() 191 if (CMAKE_HIP17_COMPILE_FEATURES AND CMAKE_HIP20_COMPILE_FEATURES) 192 list(REMOVE_ITEM CMAKE_HIP20_COMPILE_FEATURES ${CMAKE_HIP17_COMPILE_FEATURES}) 193 endif() 194 if (CMAKE_HIP14_COMPILE_FEATURES AND CMAKE_HIP17_COMPILE_FEATURES) 195 list(REMOVE_ITEM CMAKE_HIP17_COMPILE_FEATURES ${CMAKE_HIP14_COMPILE_FEATURES}) 196 endif() 197 if (CMAKE_HIP11_COMPILE_FEATURES AND CMAKE_HIP14_COMPILE_FEATURES) 198 list(REMOVE_ITEM CMAKE_HIP14_COMPILE_FEATURES ${CMAKE_HIP11_COMPILE_FEATURES}) 199 endif() 200 if (CMAKE_HIP98_COMPILE_FEATURES AND CMAKE_HIP11_COMPILE_FEATURES) 201 list(REMOVE_ITEM CMAKE_HIP11_COMPILE_FEATURES ${CMAKE_HIP98_COMPILE_FEATURES}) 202 endif() 203 204 if(NOT CMAKE_HIP_COMPILE_FEATURES) 205 set(CMAKE_HIP_COMPILE_FEATURES 206 ${CMAKE_HIP98_COMPILE_FEATURES} 207 ${CMAKE_HIP11_COMPILE_FEATURES} 208 ${CMAKE_HIP14_COMPILE_FEATURES} 209 ${CMAKE_HIP17_COMPILE_FEATURES} 210 ${CMAKE_HIP20_COMPILE_FEATURES} 211 ${CMAKE_HIP23_COMPILE_FEATURES} 212 ) 213 endif() 214 215 set(CMAKE_HIP_COMPILE_FEATURES ${CMAKE_HIP_COMPILE_FEATURES} PARENT_SCOPE) 216 set(CMAKE_HIP98_COMPILE_FEATURES ${CMAKE_HIP98_COMPILE_FEATURES} PARENT_SCOPE) 217 set(CMAKE_HIP11_COMPILE_FEATURES ${CMAKE_HIP11_COMPILE_FEATURES} PARENT_SCOPE) 218 set(CMAKE_HIP14_COMPILE_FEATURES ${CMAKE_HIP14_COMPILE_FEATURES} PARENT_SCOPE) 219 set(CMAKE_HIP17_COMPILE_FEATURES ${CMAKE_HIP17_COMPILE_FEATURES} PARENT_SCOPE) 220 set(CMAKE_HIP20_COMPILE_FEATURES ${CMAKE_HIP20_COMPILE_FEATURES} PARENT_SCOPE) 221 set(CMAKE_HIP23_COMPILE_FEATURES ${CMAKE_HIP23_COMPILE_FEATURES} PARENT_SCOPE) 222 223 message(CHECK_PASS "done") 224 225 endif() 226 227endfunction() 228