# C++11 feature support detection if (NOT FMT_USE_CPP11) return() endif () include(CheckCXXCompilerFlag) if (FMT_USE_CPP11) check_cxx_compiler_flag(-std=c++11 HAVE_STD_CPP11_FLAG) if (HAVE_STD_CPP11_FLAG) # Check if including cmath works with -std=c++11 and -O3. # It may not in MinGW due to bug http://ehc.ac/p/mingw/bugs/2250/. set(CMAKE_REQUIRED_FLAGS "-std=c++11 -O3") check_cxx_source_compiles(" #include int main() {}" FMT_CPP11_CMATH) # Check if including works with -std=c++11. # It may not in MinGW due to bug http://sourceforge.net/p/mingw/bugs/2024/. check_cxx_source_compiles(" #include int main() {}" FMT_CPP11_UNISTD_H) if (FMT_CPP11_CMATH AND FMT_CPP11_UNISTD_H) set(CPP11_FLAG -std=c++11) else () check_cxx_compiler_flag(-std=gnu++11 HAVE_STD_GNUPP11_FLAG) if (HAVE_STD_CPP11_FLAG) set(CPP11_FLAG -std=gnu++11) endif () endif () set(CMAKE_REQUIRED_FLAGS ) else () check_cxx_compiler_flag(-std=c++0x HAVE_STD_CPP0X_FLAG) if (HAVE_STD_CPP0X_FLAG) set(CPP11_FLAG -std=c++0x) endif () endif () endif () set(CMAKE_REQUIRED_FLAGS ${CPP11_FLAG}) # Check if variadic templates are working and not affected by GCC bug 39653: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39653 check_cxx_source_compiles(" template struct S { typedef typename S::type type; }; int main() {}" SUPPORTS_VARIADIC_TEMPLATES) # Check if initializer lists are supported. check_cxx_source_compiles(" #include int main() {}" SUPPORTS_INITIALIZER_LIST) # Check if enum bases are available check_cxx_source_compiles(" enum C : char {A}; int main() {}" SUPPORTS_ENUM_BASE) # Check if type traits are available check_cxx_source_compiles(" #include class C { void operator=(const C&); }; int main() { static_assert(!std::is_copy_assignable::value, \"\"); }" SUPPORTS_TYPE_TRAITS) # Check if user-defined literals are available check_cxx_source_compiles(" void operator\"\" _udl(long double); int main() {}" SUPPORTS_USER_DEFINED_LITERALS) set(CMAKE_REQUIRED_FLAGS )