function(dce_try_apply_debug_options TARGET_NAME TARGET_SCOPE) set( DCE_DEBUG_WARNINGS -Wall -Wextra -Wpedantic -Werror # -Wconversion # -Wsign-conversion -Wshadow -Wformat=2 -Wundef -Wcast-align -Wcast-qual -Wpointer-arith -Woverloaded-virtual -Wnon-virtual-dtor -Wold-style-cast -Wextra-semi -Wimplicit-fallthrough -Wnull-dereference -Wdouble-promotion -Wfloat-equal # Clang specific -Wthread-safety -Wloop-analysis -Wrange-loop-analysis ) set( DCE_DEBUG_SANITIZERS -fsanitize=address,undefined,null,pointer-overflow,local-bounds -fsanitize-address-use-after-scope ) set( DCE_DEBUG_OPTIONS -ggdb3 -O0 -fno-optimize-sibling-calls -fno-omit-frame-pointer ) set( DCE_DEBUG_DEFINES _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG _GLIBCXX_ASSERTIONS=1 _GLIBCXX_DEBUG=1 _GLIBCXX_DEBUG_PEDANTIC=1 ) target_compile_options( ${TARGET_NAME} ${TARGET_SCOPE} $<$,$>:${DCE_DEBUG_WARNINGS} ${DCE_DEBUG_OPTIONS} ${DCE_DEBUG_SANITIZERS}> ) target_link_options( ${TARGET_NAME} ${TARGET_SCOPE} $<$,$>:${DCE_DEBUG_SANITIZERS}> ) target_compile_definitions( ${TARGET_NAME} ${TARGET_SCOPE} $<$,$>:${DCE_DEBUG_DEFINES}> ) endfunction()