ferencd@0: # - Check which parts of the C++11 standard the compiler supports ferencd@0: # ferencd@0: # When found it will set the following variables ferencd@0: # ferencd@0: # CXX11_COMPILER_FLAGS - the compiler flags needed to get C++11 features ferencd@0: # ferencd@0: # HAS_CXX11_AUTO - auto keyword ferencd@0: # HAS_CXX11_AUTO_RET_TYPE - function declaration with deduced return types ferencd@0: # HAS_CXX11_CLASS_OVERRIDE - override and final keywords for classes and methods ferencd@0: # HAS_CXX11_CONSTEXPR - constexpr keyword ferencd@0: # HAS_CXX11_CSTDINT_H - cstdint header ferencd@0: # HAS_CXX11_DECLTYPE - decltype keyword ferencd@0: # HAS_CXX11_FUNC - __func__ preprocessor constant ferencd@0: # HAS_CXX11_INITIALIZER_LIST - initializer list ferencd@0: # HAS_CXX11_LAMBDA - lambdas ferencd@0: # HAS_CXX11_LIB_REGEX - regex library ferencd@0: # HAS_CXX11_LONG_LONG - long long signed & unsigned types ferencd@0: # HAS_CXX11_NULLPTR - nullptr ferencd@0: # HAS_CXX11_RVALUE_REFERENCES - rvalue references ferencd@0: # HAS_CXX11_SIZEOF_MEMBER - sizeof() non-static members ferencd@0: # HAS_CXX11_STATIC_ASSERT - static_assert() ferencd@0: # HAS_CXX11_VARIADIC_TEMPLATES - variadic templates ferencd@0: ferencd@0: #============================================================================= ferencd@0: # Copyright 2011,2012 Rolf Eike Beer ferencd@0: # Copyright 2012 Andreas Weis ferencd@0: # ferencd@0: # Distributed under the OSI-approved BSD License (the "License"); ferencd@0: # see accompanying file Copyright.txt for details. ferencd@0: # ferencd@0: # This software is distributed WITHOUT ANY WARRANTY; without even the ferencd@0: # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ferencd@0: # See the License for more information. ferencd@0: #============================================================================= ferencd@0: # (To distribute this file outside of CMake, substitute the full ferencd@0: # License text for the above reference.) ferencd@0: ferencd@0: # ferencd@0: # Each feature may have up to 3 checks, every one of them in it's own file ferencd@0: # FEATURE.cpp - example that must build and return 0 when run ferencd@0: # FEATURE_fail.cpp - example that must build, but may not return 0 when run ferencd@0: # FEATURE_fail_compile.cpp - example that must fail compilation ferencd@0: # ferencd@0: # The first one is mandatory, the latter 2 are optional and do not depend on ferencd@0: # each other (i.e. only one may be present). ferencd@0: # ferencd@0: ferencd@0: if (NOT CMAKE_CXX_COMPILER_LOADED) ferencd@0: message(FATAL_ERROR "CheckCXX11Features modules only works if language CXX is enabled") ferencd@0: endif () ferencd@0: ferencd@0: cmake_minimum_required(VERSION 2.8.3) ferencd@0: ferencd@0: # ferencd@0: ### Check for needed compiler flags ferencd@0: # ferencd@0: include(CheckCXXCompilerFlag) ferencd@0: check_cxx_compiler_flag("-std=c++11" _HAS_CXX11_FLAG) ferencd@0: if (NOT _HAS_CXX11_FLAG) ferencd@0: check_cxx_compiler_flag("-std=c++0x" _HAS_CXX0X_FLAG) ferencd@0: endif () ferencd@0: ferencd@0: if (_HAS_CXX11_FLAG) ferencd@0: set(CXX11_COMPILER_FLAGS "-std=c++11") ferencd@0: elseif (_HAS_CXX0X_FLAG) ferencd@0: set(CXX11_COMPILER_FLAGS "-std=c++0x") ferencd@0: endif () ferencd@0: ferencd@0: function(cxx11_check_feature FEATURE_NAME RESULT_VAR) ferencd@0: if (NOT DEFINED ${RESULT_VAR}) ferencd@0: set(_bindir "${CMAKE_CURRENT_BINARY_DIR}/cxx11_${FEATURE_NAME}") ferencd@0: ferencd@0: set(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/CheckCXX11Features/cxx11-test-${FEATURE_NAME}) ferencd@0: set(_LOG_NAME "\"${FEATURE_NAME}\"") ferencd@0: message(STATUS "Checking C++11 support for ${_LOG_NAME}") ferencd@0: ferencd@0: set(_SRCFILE "${_SRCFILE_BASE}.cpp") ferencd@0: set(_SRCFILE_FAIL "${_SRCFILE_BASE}_fail.cpp") ferencd@0: set(_SRCFILE_FAIL_COMPILE "${_SRCFILE_BASE}_fail_compile.cpp") ferencd@0: ferencd@0: if (CROSS_COMPILING) ferencd@0: try_compile(${RESULT_VAR} "${_bindir}" "${_SRCFILE}" ferencd@0: COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") ferencd@0: if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) ferencd@0: try_compile(${RESULT_VAR} "${_bindir}_fail" "${_SRCFILE_FAIL}" ferencd@0: COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") ferencd@0: endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) ferencd@0: else (CROSS_COMPILING) ferencd@0: try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR ferencd@0: "${_bindir}" "${_SRCFILE}" ferencd@0: COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") ferencd@0: if (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR) ferencd@0: set(${RESULT_VAR} TRUE) ferencd@0: else (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR) ferencd@0: set(${RESULT_VAR} FALSE) ferencd@0: endif (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR) ferencd@0: if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) ferencd@0: try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR ferencd@0: "${_bindir}_fail" "${_SRCFILE_FAIL}" ferencd@0: COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") ferencd@0: if (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR) ferencd@0: set(${RESULT_VAR} TRUE) ferencd@0: else (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR) ferencd@0: set(${RESULT_VAR} FALSE) ferencd@0: endif (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR) ferencd@0: endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL}) ferencd@0: endif (CROSS_COMPILING) ferencd@0: if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE}) ferencd@0: try_compile(_TMP_RESULT "${_bindir}_fail_compile" "${_SRCFILE_FAIL_COMPILE}" ferencd@0: COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}") ferencd@0: if (_TMP_RESULT) ferencd@0: set(${RESULT_VAR} FALSE) ferencd@0: else (_TMP_RESULT) ferencd@0: set(${RESULT_VAR} TRUE) ferencd@0: endif (_TMP_RESULT) ferencd@0: endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE}) ferencd@0: ferencd@0: if (${RESULT_VAR}) ferencd@0: message(STATUS "Checking C++11 support for ${_LOG_NAME}: works") ferencd@0: else (${RESULT_VAR}) ferencd@0: message(STATUS "Checking C++11 support for ${_LOG_NAME}: not supported") ferencd@0: endif (${RESULT_VAR}) ferencd@0: set(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++11 support for ${_LOG_NAME}") ferencd@0: endif (NOT DEFINED ${RESULT_VAR}) ferencd@0: endfunction(cxx11_check_feature) ferencd@0: ferencd@0: cxx11_check_feature("__func__" HAS_CXX11_FUNC) ferencd@0: cxx11_check_feature("auto" HAS_CXX11_AUTO) ferencd@0: cxx11_check_feature("auto_ret_type" HAS_CXX11_AUTO_RET_TYPE) ferencd@0: cxx11_check_feature("class_override_final" HAS_CXX11_CLASS_OVERRIDE) ferencd@0: cxx11_check_feature("constexpr" HAS_CXX11_CONSTEXPR) ferencd@0: cxx11_check_feature("cstdint" HAS_CXX11_CSTDINT_H) ferencd@0: cxx11_check_feature("decltype" HAS_CXX11_DECLTYPE) ferencd@0: cxx11_check_feature("initializer_list" HAS_CXX11_INITIALIZER_LIST) ferencd@0: cxx11_check_feature("lambda" HAS_CXX11_LAMBDA) ferencd@0: cxx11_check_feature("long_long" HAS_CXX11_LONG_LONG) ferencd@0: cxx11_check_feature("nullptr" HAS_CXX11_NULLPTR) ferencd@0: cxx11_check_feature("regex" HAS_CXX11_LIB_REGEX) ferencd@0: cxx11_check_feature("rvalue-references" HAS_CXX11_RVALUE_REFERENCES) ferencd@0: cxx11_check_feature("sizeof_member" HAS_CXX11_SIZEOF_MEMBER) ferencd@0: cxx11_check_feature("static_assert" HAS_CXX11_STATIC_ASSERT) ferencd@0: cxx11_check_feature("variadic_templates" HAS_CXX11_VARIADIC_TEMPLATES)