summaryrefslogtreecommitdiffstats
path: root/cmake/QtSanitizerHelpers.cmake
blob: 551446517896f35fe3ecdfafcbea3f19de824d97 (plain)
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
function(qt_internal_set_up_sanitizer_features)
    set(ECM_ENABLE_SANITIZERS "" CACHE STRING "Enable sanitizers")
    set_property(CACHE ECM_ENABLE_SANITIZERS PROPERTY STRINGS "address;memory;thread;undefined")

    # If FEATURE_sanitize_foo is set on the command line, make sure to set the appropriate
    # ECM_ENABLE_SANITIZERS value. Also the other way around. This basically allows setting either
    # the feature or ECM_ENABLE_SANITIZERS directly.
    #
    # TODO: Decide which one of these should be the source of truth, because reconfiguration with
    # different options might not work as expected when ECM_ENABLE_SANITIZERS is provided instead of
    # the features.
    set(enabled_sanitizer_features "")
    foreach(sanitizer_type address memory thread undefined)
        if(FEATURE_sanitize_${sanitizer_type})
            list(APPEND enabled_sanitizer_features "${sanitizer_type}")
        endif()
    endforeach()
    if(enabled_sanitizer_features)
        set(ECM_ENABLE_SANITIZERS
            "${enabled_sanitizer_features}" CACHE STRING "Enable sanitizers" FORCE)
    endif()

    if(ECM_ENABLE_SANITIZERS)
        foreach(sanitizer_type ${ECM_ENABLE_SANITIZERS})
            message(STATUS "Enabling sanitizer: ${sanitizer_type}")
            set(feature_name "FEATURE_sanitize_${sanitizer_type}")
            set(${feature_name} "ON" CACHE BOOL "Enable ${sanitizer_type} sanitizer" FORCE)
            set(QT_${feature_name} "ON" CACHE BOOL "Enable ${sanitizer_type} sanitizer" FORCE)
        endforeach()
    endif()
endfunction()