104 lines
4.5 KiB
CMake
104 lines
4.5 KiB
CMake
# Checks for C++11 features
|
|
# CXX11_FEATURE_LIST - a list containing all supported features
|
|
# HAS_CXX11_AUTO - auto keyword
|
|
# HAS_CXX11_NULLPTR - nullptr
|
|
# HAS_CXX11_LAMBDA - lambdas
|
|
# HAS_CXX11_STATIC_ASSERT - static_assert()
|
|
# HAS_CXX11_RVALUE_REFERENCES - rvalue references
|
|
# HAS_CXX11_DECLTYPE - decltype keyword
|
|
# HAS_CXX11_CSTDINT_H - cstdint header
|
|
# HAS_CXX11_LONG_LONG - long long signed & unsigned types
|
|
# HAS_CXX11_VARIADIC_TEMPLATES - variadic templates
|
|
# HAS_CXX11_CONSTEXPR - constexpr keyword
|
|
# HAS_CXX11_SIZEOF_MEMBER - sizeof() non-static members
|
|
# HAS_CXX11_FUNC - __func__ preprocessor constant
|
|
#
|
|
# Original script by Rolf Eike Beer
|
|
# Modifications by Andreas Weis
|
|
#
|
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3)
|
|
|
|
SET(CHECK_CXX11_OLD_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
IF(CMAKE_COMPILER_IS_GNUCXX)
|
|
SET(CMAKE_CXX_FLAGS "-std=c++0x")
|
|
endif()
|
|
|
|
MACRO(CXX11_CHECK_FEATURE FEATURE_NAME FEATURE_NUMBER RESULT_VAR)
|
|
IF (NOT DEFINED ${RESULT_VAR})
|
|
SET(_bindir "${CMAKE_CURRENT_BINARY_DIR}/cxx11/cxx11_${FEATURE_NAME}")
|
|
|
|
IF (${FEATURE_NUMBER})
|
|
SET(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/c++11-test-${FEATURE_NAME}-N${FEATURE_NUMBER})
|
|
SET(_LOG_NAME "\"${FEATURE_NAME}\" (N${FEATURE_NUMBER})")
|
|
ELSE (${FEATURE_NUMBER})
|
|
SET(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/c++11-test-${FEATURE_NAME})
|
|
SET(_LOG_NAME "\"${FEATURE_NAME}\"")
|
|
ENDIF (${FEATURE_NUMBER})
|
|
MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME}")
|
|
|
|
SET(_SRCFILE "${_SRCFILE_BASE}.cpp")
|
|
SET(_SRCFILE_FAIL "${_SRCFILE_BASE}_fail.cpp")
|
|
SET(_SRCFILE_FAIL_COMPILE "${_SRCFILE_BASE}_fail_compile.cpp")
|
|
|
|
IF (CROSS_COMPILING)
|
|
try_compile(${RESULT_VAR} "${_bindir}" "${_SRCFILE}")
|
|
IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
|
|
try_compile(${RESULT_VAR} "${_bindir}_fail" "${_SRCFILE_FAIL}")
|
|
ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
|
|
ELSE (CROSS_COMPILING)
|
|
try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
|
|
"${_bindir}" "${_SRCFILE}")
|
|
IF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
|
|
SET(${RESULT_VAR} TRUE)
|
|
ELSE (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
|
|
SET(${RESULT_VAR} FALSE)
|
|
ENDIF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
|
|
IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
|
|
try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
|
|
"${_bindir}_fail" "${_SRCFILE_FAIL}")
|
|
IF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
|
|
SET(${RESULT_VAR} TRUE)
|
|
ELSE (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
|
|
SET(${RESULT_VAR} FALSE)
|
|
ENDIF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
|
|
ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
|
|
ENDIF (CROSS_COMPILING)
|
|
IF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
|
|
try_compile(_TMP_RESULT "${_bindir}_fail_compile" "${_SRCFILE_FAIL_COMPILE}")
|
|
IF (_TMP_RESULT)
|
|
SET(${RESULT_VAR} FALSE)
|
|
ELSE (_TMP_RESULT)
|
|
SET(${RESULT_VAR} TRUE)
|
|
ENDIF (_TMP_RESULT)
|
|
ENDIF (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
|
|
|
|
IF (${RESULT_VAR})
|
|
MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME} -- works")
|
|
LIST(APPEND CXX11_FEATURE_LIST ${RESULT_VAR})
|
|
ELSE (${RESULT_VAR})
|
|
MESSAGE(STATUS "Checking C++11 support for ${_LOG_NAME} -- not supported")
|
|
ENDIF (${RESULT_VAR})
|
|
SET(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++11 support for ${_LOG_NAME}")
|
|
ENDIF (NOT DEFINED ${RESULT_VAR})
|
|
ENDMACRO(CXX11_CHECK_FEATURE)
|
|
|
|
CXX11_CHECK_FEATURE("auto" 2546 HAS_CXX11_AUTO)
|
|
CXX11_CHECK_FEATURE("nullptr" 2431 HAS_CXX11_NULLPTR)
|
|
CXX11_CHECK_FEATURE("lambda" 2927 HAS_CXX11_LAMBDA)
|
|
CXX11_CHECK_FEATURE("static_assert" 1720 HAS_CXX11_STATIC_ASSERT)
|
|
CXX11_CHECK_FEATURE("rvalue_references" 2118 HAS_CXX11_RVALUE_REFERENCES)
|
|
CXX11_CHECK_FEATURE("decltype" 2343 HAS_CXX11_DECLTYPE)
|
|
CXX11_CHECK_FEATURE("cstdint" "" HAS_CXX11_CSTDINT_H)
|
|
CXX11_CHECK_FEATURE("long_long" 1811 HAS_CXX11_LONG_LONG)
|
|
CXX11_CHECK_FEATURE("variadic_templates" 2555 HAS_CXX11_VARIADIC_TEMPLATES)
|
|
CXX11_CHECK_FEATURE("constexpr" 2235 HAS_CXX11_CONSTEXPR)
|
|
CXX11_CHECK_FEATURE("sizeof_member" 2253 HAS_CXX11_SIZEOF_MEMBER)
|
|
CXX11_CHECK_FEATURE("__func__" 2340 HAS_CXX11_FUNC)
|
|
|
|
SET(CXX11_FEATURE_LIST ${CXX11_FEATURE_LIST} CACHE STRING "C++11 feature support list")
|
|
MARK_AS_ADVANCED(FORCE CXX11_FEATURE_LIST)
|
|
|
|
SET(CMAKE_CXX_FLAGS ${CHECK_CXX11_OLD_CMAKE_CXX_FLAGS})
|
|
UNSET(CHECK_CXX11_OLD_CMAKE_CXX_FLAGS)
|
|
|