a08e597f87841420810cdefa0a9b426b29bc5a38
[platform/upstream/cmake.git] / Modules / CMakeDetermineCompileFeatures.cmake
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
5 function(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
227 endfunction()