Allow disabling sanitizers for specific subdirectories
This introduces two new function that cleans up the sanitizer flags and disable linking of the sanitizer libraries. The qt_internal_skip_sanitizer function clears the sanitizer flags that are set in CMAKE_<C|CXX>_FLAGS variables by ECMEnableSanitizers.cmake. qt_internal_skip_linking_sanitizer collects all targets that are created in subdirectory and disables linking the asan targets. The asan target linking can be also disabled by setting SKIP_SANITIZER on specific target. Change-Id: Ibbbbec0b4a6bfd37d939b8a55f8d04656f73c536 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> (cherry picked from commit 6a921b6751ff03a3093dfb279b02ec75e32f4adc) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
8fd897d4bd
commit
5a44b8392d
@ -158,7 +158,15 @@ if (ECM_ENABLE_SANITIZERS)
|
|||||||
endif()
|
endif()
|
||||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XSAN_COMPILE_FLAGS}" )
|
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XSAN_COMPILE_FLAGS}" )
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
link_libraries(${XSAN_LINKER_FLAGS})
|
string(JOIN "" linker_flags
|
||||||
|
"$<"
|
||||||
|
"$<NOT:"
|
||||||
|
"$<BOOL:$<TARGET_PROPERTY:SKIP_SANITIZER>>"
|
||||||
|
">:"
|
||||||
|
"${XSAN_LINKER_FLAGS}"
|
||||||
|
">"
|
||||||
|
)
|
||||||
|
link_libraries("${linker_flags}")
|
||||||
endif()
|
endif()
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
@ -26,3 +26,35 @@ function(qt_internal_set_up_sanitizer_options)
|
|||||||
set(ECM_ENABLE_SANITIZERS "${enabled_sanitizer_features}" PARENT_SCOPE)
|
set(ECM_ENABLE_SANITIZERS "${enabled_sanitizer_features}" PARENT_SCOPE)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# This function clears the previously set sanitizer flags from CMAKE_<C|CXX>_FLAGS
|
||||||
|
function(qt_internal_skip_sanitizer)
|
||||||
|
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
|
||||||
|
CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
|
||||||
|
CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
|
foreach(sanitizer ${ECM_ENABLE_SANITIZERS})
|
||||||
|
string(TOLOWER "${sanitizer}" sanitizer)
|
||||||
|
enable_sanitizer_flags("${sanitizer}")
|
||||||
|
qt_internal_remove_compiler_flags(${XSAN_COMPILE_FLAGS})
|
||||||
|
endforeach()
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# This function disables the sanitizer library linking to all targets created in a subdirectory
|
||||||
|
# where the function is called. Note that the function should be called after all involved targets
|
||||||
|
# are created, to make sure they are collected by the function.
|
||||||
|
function(qt_internal_skip_linking_sanitizer)
|
||||||
|
_qt_internal_collect_buildsystem_targets(all_targets "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
INCLUDE
|
||||||
|
STATIC_LIBRARY
|
||||||
|
MODULE_LIBRARY
|
||||||
|
SHARED_LIBRARY
|
||||||
|
OBJECT_LIBRARY
|
||||||
|
EXECUTABLE
|
||||||
|
)
|
||||||
|
foreach(t IN LISTS all_targets)
|
||||||
|
set_property(TARGET ${t} PROPERTY SKIP_SANITIZER TRUE)
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user