2016-03-18 15:10:06 +00:00
|
|
|
# C++11 feature support detection
|
|
|
|
|
|
|
|
if (NOT FMT_USE_CPP11)
|
|
|
|
return()
|
|
|
|
endif ()
|
|
|
|
|
2016-01-29 12:03:47 +00:00
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
|
2016-02-09 16:43:39 +00:00
|
|
|
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 <cmath>
|
|
|
|
int main() {}" FMT_CPP11_CMATH)
|
|
|
|
# Check if including <unistd.h> 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 <unistd.h>
|
|
|
|
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 )
|
2016-01-29 12:03:47 +00:00
|
|
|
else ()
|
2016-02-09 16:43:39 +00:00
|
|
|
check_cxx_compiler_flag(-std=c++0x HAVE_STD_CPP0X_FLAG)
|
|
|
|
if (HAVE_STD_CPP0X_FLAG)
|
|
|
|
set(CPP11_FLAG -std=c++0x)
|
2016-01-29 12:03:47 +00:00
|
|
|
endif ()
|
|
|
|
endif ()
|
|
|
|
endif ()
|
|
|
|
|
2016-02-09 16:43:39 +00:00
|
|
|
set(CMAKE_REQUIRED_FLAGS ${CPP11_FLAG})
|
2016-01-29 12:03:47 +00:00
|
|
|
|
|
|
|
# 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 <class T, class ...Types>
|
|
|
|
struct S { typedef typename S<Types...>::type type; };
|
|
|
|
int main() {}" SUPPORTS_VARIADIC_TEMPLATES)
|
|
|
|
|
|
|
|
# Check if initializer lists are supported.
|
|
|
|
check_cxx_source_compiles("
|
|
|
|
#include <initializer_list>
|
|
|
|
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 <type_traits>
|
|
|
|
class C { void operator=(const C&); };
|
|
|
|
int main() { static_assert(!std::is_copy_assignable<C>::value, \"\"); }"
|
|
|
|
SUPPORTS_TYPE_TRAITS)
|
2016-05-02 21:51:37 +00:00
|
|
|
|
|
|
|
# Check if user-defined literals are available
|
|
|
|
check_cxx_source_compiles("
|
|
|
|
void operator\"\" _udl(long double);
|
|
|
|
int main() {}"
|
|
|
|
SUPPORTS_USER_DEFINED_LITERALS)
|
|
|
|
|
2016-01-29 12:03:47 +00:00
|
|
|
set(CMAKE_REQUIRED_FLAGS )
|