50 lines
1.6 KiB
CMake
50 lines
1.6 KiB
CMake
include(CheckCXXCompilerFlag)
|
|
|
|
option(ENABLE_ASAN "Enable AddressSanitizer (+UBSan minimal) for Debug builds" OFF)
|
|
option(ENABLE_UBSAN "Enable UndefinedBehaviorSanitizer for Debug builds" OFF)
|
|
option(ENABLE_TSAN "Enable ThreadSanitizer for Debug builds" OFF)
|
|
|
|
if(ENABLE_TSAN AND ENABLE_ASAN)
|
|
message(FATAL_ERROR "ENABLE_TSAN and ENABLE_ASAN cannot be enabled together.")
|
|
endif()
|
|
|
|
function(_yams_append_flags var)
|
|
foreach(flag IN LISTS ARGN)
|
|
set(${var} "${${var}} ${flag}" PARENT_SCOPE)
|
|
endforeach()
|
|
endfunction()
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES "^[Dd]ebug$")
|
|
set(_SAN_CFLAGS "")
|
|
set(_SAN_LDFLAGS "")
|
|
|
|
if(ENABLE_ASAN)
|
|
_yams_append_flags(_SAN_CFLAGS "-fsanitize=address,undefined" "-fno-omit-frame-pointer")
|
|
_yams_append_flags(_SAN_LDFLAGS "-fsanitize=address,undefined")
|
|
if(APPLE)
|
|
_yams_append_flags(_SAN_CFLAGS "-fsanitize-address-use-after-scope")
|
|
endif()
|
|
endif()
|
|
|
|
if(ENABLE_UBSAN AND NOT ENABLE_ASAN)
|
|
_yams_append_flags(_SAN_CFLAGS "-fsanitize=undefined" "-fno-omit-frame-pointer")
|
|
_yams_append_flags(_SAN_LDFLAGS "-fsanitize=undefined")
|
|
endif()
|
|
|
|
if(ENABLE_TSAN)
|
|
_yams_append_flags(_SAN_CFLAGS "-fsanitize=thread" "-fno-omit-frame-pointer")
|
|
_yams_append_flags(_SAN_LDFLAGS "-fsanitize=thread")
|
|
endif()
|
|
|
|
if(_SAN_CFLAGS)
|
|
add_compile_options(${_SAN_CFLAGS})
|
|
add_link_options(${_SAN_LDFLAGS})
|
|
if(UNIX AND NOT APPLE)
|
|
add_compile_options(-gline-tables-only)
|
|
endif()
|
|
message(STATUS "Sanitizers enabled: ${_SAN_CFLAGS}")
|
|
set(YAMS_ENABLE_SANITIZERS ON CACHE BOOL "Sanitizers enabled" FORCE)
|
|
else()
|
|
set(YAMS_ENABLE_SANITIZERS OFF CACHE BOOL "Sanitizers enabled" FORCE)
|
|
endif()
|
|
endif()
|