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