File: CheckCxxFeatures.cmake

package info (click to toggle)
kde-config-systemd 1.2.1-3.3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,564 kB
  • sloc: cpp: 3,306; makefile: 8; sh: 2
file content (112 lines) | stat: -rw-r--r-- 3,779 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# This file was copied from the KActivities git repository and authored
# by Ivan Cukic. All credits go to him.

# Macro that tests and returns whether a C++ feature is present in the
# current compiler

set(CXX_CHECK_FEATURE_MODULE_DIR "${CMAKE_SOURCE_DIR}/cmake/modules")
set(CXX_FEATURES_SUPPORTED "")
set(CXX_FEATURES_UNSUPPORTED "")

macro(CXX_PERFORM_TEST TEST_SOURCE_FILE TEST_TEST_BINARY_DIR EXPECTED_RESULT RESULT COMPILE_DEFINITIONS)

    try_run(
        RUN_RESULT_VAR COMPILE_RESULT_VAR
        "${TEST_BINARY_DIR}" "${TEST_SOURCE_FILE}"
        COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS}"
        COMPILE_OUTPUT_VARIABLE COMPILE_OUT
        RUN_OUTPUT_VARIABLE RUN_OUT
    )

    set(RESULT_VAR FALSE)

    if (COMPILE_RESULT_VAR AND NOT RUN_RESULT_VAR)
        set(RESULT_VAR TRUE)
    endif (COMPILE_RESULT_VAR AND NOT RUN_RESULT_VAR)

    if (NOT ("${RESULT_VAR}" STREQUAL "${EXPECTED_RESULT}"))
        # message ("Got ${RESULT_VAR} as a result, but ${EXPECTED_RESULT} expected")

        if (NOT ${COMPILE_RESULT_VAR})
            # message("------ compilation output ------")
            # message("${COMPILE_OUT}")
        endif (NOT ${COMPILE_RESULT_VAR})

        if (${RUN_RESULT_VAR})
            # message("---------- run output ----------")
            # message("${RUN_OUT}")
            # message("Process returned: ${RUN_RESULT_VAR}")
        endif (${RUN_RESULT_VAR})

        # message("--------------------------------")

        set (${RESULT} FALSE)

    else ()
        set (${RESULT} TRUE)

    endif ()



endmacro(CXX_PERFORM_TEST TEST_SOURCE EXPECTED_RESULT RESULT)



macro(CXX_CHECK_FEATURE CXX_VERSION FEATURE_NAME FEATURE_NUMBER RESULT_VAR COMPILE_DEFINITIONS)

    # Testing whether we have previously set the variable
    if(NOT DEFINED ${RESULT_VAR})

        set(TEST_BINARY_DIR
            "${CMAKE_CURRENT_BINARY_DIR}/cxx-check-feature/cxx_${FEATURE_NUMBER}"
            )

        set(TEST_SOURCE_BASE
            "${CXX_CHECK_FEATURE_MODULE_DIR}/${CXX_VERSION}-test-${FEATURE_NAME}-${FEATURE_NUMBER}"
            )

        set(TEST_SOURCE_FILE "${TEST_SOURCE_BASE}.cpp")
        set(FAILTEST_SOURCE_FILE "${TEST_SOURCE_BASE}-fail.cpp")

        set(FEATURE_NAME
            "'${FEATURE_NAME}' (${CXX_VERSION} N${FEATURE_NUMBER})"
            )

        message(STATUS "Checking C++ support for ${FEATURE_NAME}")

        string (COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "Clang" CMAKE_COMPILER_IS_CLANG)
        string (COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "GNU" CMAKE_COMPILER_IS_GCC)

        set (ADD_COMPILE_DEFINITIONS "")

        if (EXISTS ${TEST_SOURCE_FILE})
            CXX_PERFORM_TEST(${TEST_SOURCE_FILE} ${TEST_BINARY_DIR} TRUE ${RESULT_VAR} "${COMPILE_DEFINITIONS} ${ADD_COMPILE_DEFINITIONS}")
        endif ()

        if (${RESULT_VAR} AND EXISTS ${FAILTEST_SOURCE_FILE})
            CXX_PERFORM_TEST(${FAILTEST_SOURCE_FILE} ${TEST_BINARY_DIR} FALSE ${RESULT_VAR} "${COMPILE_DEFINITIONS} ${ADD_COMPILE_DEFINITIONS}")
        endif ()

        if (${RESULT_VAR})
            message(STATUS "Checking C++ support for ${FEATURE_NAME} -- works")
            set (CXX_FEATURES_SUPPORTED
                "${CXX_FEATURES_SUPPORTED} ${FEATURE_NAME} (${FEATURE_NUMBER}),"
                )

        else ()
            message(STATUS "Checking C++ support for ${FEATURE_NAME} -- not supported")
            set (CXX_FEATURES_UNSUPPORTED
                "${CXX_FEATURES_UNSUPPORTED} ${FEATURE_NAME} (${FEATURE_NUMBER}),"
                )

        endif ()

        # This would break the feature reporting on second call of cmake
        # TODO: Fix?
        # set(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++ support for ${FEATURE_NAME}")

    endif(NOT DEFINED ${RESULT_VAR})

endmacro(CXX_CHECK_FEATURE)