1# C++14 feature support detection 2 3include(CheckCXXSourceCompiles) 4include(CheckCXXCompilerFlag) 5 6if (NOT CMAKE_CXX_STANDARD) 7 set(CMAKE_CXX_STANDARD 11) 8endif() 9message(STATUS "CXX_STANDARD: ${CMAKE_CXX_STANDARD}") 10 11if (CMAKE_CXX_STANDARD EQUAL 20) 12 check_cxx_compiler_flag(-std=c++20 has_std_20_flag) 13 check_cxx_compiler_flag(-std=c++2a has_std_2a_flag) 14 15 if (has_std_20_flag) 16 set(CXX_STANDARD_FLAG -std=c++20) 17 elseif (has_std_2a_flag) 18 set(CXX_STANDARD_FLAG -std=c++2a) 19 endif () 20elseif (CMAKE_CXX_STANDARD EQUAL 17) 21 check_cxx_compiler_flag(-std=c++17 has_std_17_flag) 22 check_cxx_compiler_flag(-std=c++1z has_std_1z_flag) 23 24 if (has_std_17_flag) 25 set(CXX_STANDARD_FLAG -std=c++17) 26 elseif (has_std_1z_flag) 27 set(CXX_STANDARD_FLAG -std=c++1z) 28 endif () 29elseif (CMAKE_CXX_STANDARD EQUAL 14) 30 check_cxx_compiler_flag(-std=c++14 has_std_14_flag) 31 check_cxx_compiler_flag(-std=c++1y has_std_1y_flag) 32 33 if (has_std_14_flag) 34 set(CXX_STANDARD_FLAG -std=c++14) 35 elseif (has_std_1y_flag) 36 set(CXX_STANDARD_FLAG -std=c++1y) 37 endif () 38elseif (CMAKE_CXX_STANDARD EQUAL 11) 39 check_cxx_compiler_flag(-std=c++11 has_std_11_flag) 40 check_cxx_compiler_flag(-std=c++0x has_std_0x_flag) 41 42 if (has_std_11_flag) 43 set(CXX_STANDARD_FLAG -std=c++11) 44 elseif (has_std_0x_flag) 45 set(CXX_STANDARD_FLAG -std=c++0x) 46 endif () 47endif () 48 49set(CMAKE_REQUIRED_FLAGS ${CXX_STANDARD_FLAG}) 50 51# Check if variadic templates are working and not affected by GCC bug 39653: 52# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39653 53# Can be removed once gcc 4.4 support is dropped. 54check_cxx_source_compiles(" 55 template <class T, class ...Types> 56 struct S { typedef typename S<Types...>::type type; }; 57 int main() {}" SUPPORTS_VARIADIC_TEMPLATES) 58if (NOT SUPPORTS_VARIADIC_TEMPLATES) 59 set (SUPPORTS_VARIADIC_TEMPLATES OFF) 60endif () 61 62# Check if user-defined literals are available 63check_cxx_source_compiles(" 64 void operator\"\" _udl(long double); 65 int main() {}" 66 SUPPORTS_USER_DEFINED_LITERALS) 67if (NOT SUPPORTS_USER_DEFINED_LITERALS) 68 set (SUPPORTS_USER_DEFINED_LITERALS OFF) 69endif () 70 71# Check if <variant> is available 72set(CMAKE_REQUIRED_FLAGS -std=c++1z) 73check_cxx_source_compiles(" 74 #include <variant> 75 int main() {}" 76 FMT_HAS_VARIANT) 77if (NOT FMT_HAS_VARIANT) 78 set (FMT_HAS_VARIANT OFF) 79endif () 80 81set(CMAKE_REQUIRED_FLAGS ) 82