]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | # C++14 feature support detection |
2 | ||
3 | include(CheckCXXSourceCompiles) | |
4 | include(CheckCXXCompilerFlag) | |
5 | ||
eafe8130 TL |
6 | if (CMAKE_CXX_STANDARD) |
7 | message(STATUS "CXX_STANDARD: ${CMAKE_CXX_STANDARD}") | |
8 | elseif (CMAKE_CXX_FLAGS MATCHES "-std=(c|gnu)\\+\\+") | |
9 | string(REGEX MATCH "-std=(c|gnu)\\+\\+[^ ]+" CXX_STANDARD_FLAG "${CMAKE_CXX_FLAGS}") | |
10 | message(STATUS "CXX_STANDARD_FLAG: ${CXX_STANDARD_FLAG}") | |
11 | else() | |
11fdf7f2 | 12 | set(CMAKE_CXX_STANDARD 11) |
eafe8130 | 13 | message(STATUS "CXX_STANDARD: ${CMAKE_CXX_STANDARD}") |
11fdf7f2 | 14 | endif() |
11fdf7f2 TL |
15 | |
16 | if (CMAKE_CXX_STANDARD EQUAL 20) | |
17 | check_cxx_compiler_flag(-std=c++20 has_std_20_flag) | |
18 | check_cxx_compiler_flag(-std=c++2a has_std_2a_flag) | |
19 | ||
20 | if (has_std_20_flag) | |
21 | set(CXX_STANDARD_FLAG -std=c++20) | |
22 | elseif (has_std_2a_flag) | |
23 | set(CXX_STANDARD_FLAG -std=c++2a) | |
24 | endif () | |
25 | elseif (CMAKE_CXX_STANDARD EQUAL 17) | |
26 | check_cxx_compiler_flag(-std=c++17 has_std_17_flag) | |
27 | check_cxx_compiler_flag(-std=c++1z has_std_1z_flag) | |
28 | ||
29 | if (has_std_17_flag) | |
30 | set(CXX_STANDARD_FLAG -std=c++17) | |
31 | elseif (has_std_1z_flag) | |
32 | set(CXX_STANDARD_FLAG -std=c++1z) | |
33 | endif () | |
34 | elseif (CMAKE_CXX_STANDARD EQUAL 14) | |
35 | check_cxx_compiler_flag(-std=c++14 has_std_14_flag) | |
36 | check_cxx_compiler_flag(-std=c++1y has_std_1y_flag) | |
37 | ||
38 | if (has_std_14_flag) | |
39 | set(CXX_STANDARD_FLAG -std=c++14) | |
40 | elseif (has_std_1y_flag) | |
41 | set(CXX_STANDARD_FLAG -std=c++1y) | |
42 | endif () | |
43 | elseif (CMAKE_CXX_STANDARD EQUAL 11) | |
44 | check_cxx_compiler_flag(-std=c++11 has_std_11_flag) | |
45 | check_cxx_compiler_flag(-std=c++0x has_std_0x_flag) | |
46 | ||
47 | if (has_std_11_flag) | |
48 | set(CXX_STANDARD_FLAG -std=c++11) | |
49 | elseif (has_std_0x_flag) | |
50 | set(CXX_STANDARD_FLAG -std=c++0x) | |
51 | endif () | |
52 | endif () | |
53 | ||
54 | set(CMAKE_REQUIRED_FLAGS ${CXX_STANDARD_FLAG}) | |
55 | ||
56 | # Check if variadic templates are working and not affected by GCC bug 39653: | |
57 | # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39653 | |
58 | check_cxx_source_compiles(" | |
59 | template <class T, class ...Types> | |
60 | struct S { typedef typename S<Types...>::type type; }; | |
61 | int main() {}" SUPPORTS_VARIADIC_TEMPLATES) | |
62 | if (NOT SUPPORTS_VARIADIC_TEMPLATES) | |
63 | set (SUPPORTS_VARIADIC_TEMPLATES OFF) | |
64 | endif () | |
65 | ||
66 | # Check if initializer lists are supported. | |
67 | check_cxx_source_compiles(" | |
68 | #include <initializer_list> | |
69 | int main() {}" SUPPORTS_INITIALIZER_LIST) | |
70 | if (NOT SUPPORTS_INITIALIZER_LIST) | |
71 | set (SUPPORTS_INITIALIZER_LIST OFF) | |
72 | endif () | |
73 | ||
74 | # Check if enum bases are available | |
75 | check_cxx_source_compiles(" | |
76 | enum C : char {A}; | |
77 | int main() {}" | |
78 | SUPPORTS_ENUM_BASE) | |
79 | if (NOT SUPPORTS_ENUM_BASE) | |
80 | set (SUPPORTS_ENUM_BASE OFF) | |
81 | endif () | |
82 | ||
83 | # Check if type traits are available | |
84 | check_cxx_source_compiles(" | |
85 | #include <type_traits> | |
86 | class C { void operator=(const C&); }; | |
87 | int main() { static_assert(!std::is_copy_assignable<C>::value, \"\"); }" | |
88 | SUPPORTS_TYPE_TRAITS) | |
89 | if (NOT SUPPORTS_TYPE_TRAITS) | |
90 | set (SUPPORTS_TYPE_TRAITS OFF) | |
91 | endif () | |
92 | ||
93 | # Check if user-defined literals are available | |
94 | check_cxx_source_compiles(" | |
95 | void operator\"\" _udl(long double); | |
96 | int main() {}" | |
97 | SUPPORTS_USER_DEFINED_LITERALS) | |
98 | if (NOT SUPPORTS_USER_DEFINED_LITERALS) | |
99 | set (SUPPORTS_USER_DEFINED_LITERALS OFF) | |
100 | endif () | |
101 | ||
102 | set(CMAKE_REQUIRED_FLAGS ) |