1
# Macro that tests and returns whether a C++ feature is present in the
4
set(CXX_CHECK_FEATURE_MODULE_DIR "${CMAKE_SOURCE_DIR}/cmake/modules")
5
set(CXX_FEATURES_SUPPORTED "")
6
set(CXX_FEATURES_UNSUPPORTED "")
8
macro(CXX_PERFORM_TEST TEST_SOURCE_FILE TEST_TEST_BINARY_DIR EXPECTED_RESULT RESULT COMPILE_DEFINITIONS)
11
RUN_RESULT_VAR COMPILE_RESULT_VAR
12
"${TEST_BINARY_DIR}" "${TEST_SOURCE_FILE}"
13
COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}"
14
COMPILE_OUTPUT_VARIABLE COMPILE_OUT
15
RUN_OUTPUT_VARIABLE RUN_OUT
20
if (COMPILE_RESULT_VAR AND NOT RUN_RESULT_VAR)
22
endif (COMPILE_RESULT_VAR AND NOT RUN_RESULT_VAR)
24
if (NOT ("${RESULT_VAR}" STREQUAL "${EXPECTED_RESULT}"))
25
# message ("Got ${RESULT_VAR} as a result, but ${EXPECTED_RESULT} expected")
27
if (NOT ${COMPILE_RESULT_VAR})
28
# message("------ compilation output ------")
29
# message("${COMPILE_OUT}")
30
endif (NOT ${COMPILE_RESULT_VAR})
32
if (${RUN_RESULT_VAR})
33
# message("---------- run output ----------")
34
# message("${RUN_OUT}")
35
# message("Process returned: ${RUN_RESULT_VAR}")
36
endif (${RUN_RESULT_VAR})
38
# message("--------------------------------")
49
endmacro(CXX_PERFORM_TEST TEST_SOURCE EXPECTED_RESULT RESULT)
53
macro(CXX_CHECK_FEATURE CXX_VERSION FEATURE_NAME FEATURE_NUMBER RESULT_VAR COMPILE_DEFINITIONS)
55
# Testing whether we have previously set the variable
56
if(NOT DEFINED ${RESULT_VAR})
59
"${CMAKE_CURRENT_BINARY_DIR}/cxx-check-feature/cxx_${FEATURE_NUMBER}"
63
"${CXX_CHECK_FEATURE_MODULE_DIR}/${CXX_VERSION}-test-${FEATURE_NAME}-${FEATURE_NUMBER}"
66
set(TEST_SOURCE_FILE "${TEST_SOURCE_BASE}.cpp")
67
set(FAILTEST_SOURCE_FILE "${TEST_SOURCE_BASE}-fail.cpp")
70
"'${FEATURE_NAME}' (${CXX_VERSION} N${FEATURE_NUMBER})"
73
message(STATUS "Checking C++ support for ${FEATURE_NAME}")
75
string (COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "Clang" CMAKE_COMPILER_IS_CLANG)
76
string (COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "GNU" CMAKE_COMPILER_IS_GCC)
78
set (ADD_COMPILE_DEFINITIONS "")
80
if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GCC)
81
set (ADD_COMPILE_DEFINITIONS "-std=c++0x")
84
if (EXISTS ${TEST_SOURCE_FILE})
85
CXX_PERFORM_TEST(${TEST_SOURCE_FILE} ${TEST_BINARY_DIR} TRUE ${RESULT_VAR} "${COMPILE_DEFINITIONS} ${ADD_COMPILE_DEFINITIONS}")
88
if (${RESULT_VAR} AND EXISTS ${FAILTEST_SOURCE_FILE})
89
CXX_PERFORM_TEST(${FAILTEST_SOURCE_FILE} ${TEST_BINARY_DIR} FALSE ${RESULT_VAR} "${COMPILE_DEFINITIONS} ${ADD_COMPILE_DEFINITIONS}")
93
message(STATUS "Checking C++ support for ${FEATURE_NAME} -- works")
94
set (CXX_FEATURES_SUPPORTED
95
"${CXX_FEATURES_SUPPORTED} ${FEATURE_NAME} (${FEATURE_NUMBER}),"
99
message(STATUS "Checking C++ support for ${FEATURE_NAME} -- not supported")
100
set (CXX_FEATURES_UNSUPPORTED
101
"${CXX_FEATURES_UNSUPPORTED} ${FEATURE_NAME} (${FEATURE_NUMBER}),"
106
# This would break the feature reporting on second call of cmake
108
# set(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++ support for ${FEATURE_NAME}")
110
endif(NOT DEFINED ${RESULT_VAR})
112
endmacro(CXX_CHECK_FEATURE)