Skip to content
Snippets Groups Projects
sanitizer.cmake 1.11 KiB
Newer Older
# Adapted from: https://github.com/Eyescale/CMake/blob/master/Sanitizer.cmake

if(NOT SANITIZER)
	return()
endif()

# According to: http://clang.llvm.org/docs/AddressSanitizer.html#usage
# the following compiler flags allow us to keep -O1 on, if desired, but
# still get pretty call stacks
# set(_SANITIZER_COMPILE_OPTIONS "-g -fno-omit-frame-pointer -fno-optimize-sibling-calls")

string(TOLOWER ${SANITIZER} SANITIZER)
set(AVAILABLE_SANITIZERS "")

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.7)
		set(AVAILABLE_SANITIZERS address thread)
	endif()

elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.1)
		set(AVAILABLE_SANITIZERS address thread undefined)
	endif()
endif()

list(FIND AVAILABLE_SANITIZERS ${SANITIZER} _SANITIZER_FOUND)

if(${_SANITIZER_FOUND} GREATER -1)
	set(_SANITIZER "-fsanitize=${SANITIZER}")

	add_compile_options("-fno-omit-frame-pointer" ${_SANITIZER})
	set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_SANITIZER}")

else()
	message(WARNING "Sanitizer '${SANITIZER}' not set, check compiler support.")
endif()