diff options
Diffstat (limited to 'thirdparty/ryml/ext/c4core/cmake/c4SanitizeTarget.cmake')
| -rw-r--r-- | thirdparty/ryml/ext/c4core/cmake/c4SanitizeTarget.cmake | 292 |
1 files changed, 0 insertions, 292 deletions
diff --git a/thirdparty/ryml/ext/c4core/cmake/c4SanitizeTarget.cmake b/thirdparty/ryml/ext/c4core/cmake/c4SanitizeTarget.cmake deleted file mode 100644 index a064f91ee..000000000 --- a/thirdparty/ryml/ext/c4core/cmake/c4SanitizeTarget.cmake +++ /dev/null @@ -1,292 +0,0 @@ -# (C) 2017 Joao Paulo Magalhaes <[email protected]> -if(NOT _c4_sanitize_target_included) -set(_c4_sanitize_target_included ON) - -include(CMakeDependentOption) -include(PrintVar) - -function(_c4_default_if_not_set var dft) - if("${${var}}" STREQUAL "") - option(${var} "" ${dft}) - endif() -endfunction() - - -#------------------------------------------------------------------------------ -function(c4_setup_sanitize umbrella_option) - if("${CMAKE_BUILD_TYPE}" STREQUAL "Coverage") - return() - endif() - if(NOT ((CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))) - return() - endif() - - _c4_default_if_not_set(C4_SANITIZE ON) - _c4_default_if_not_set(C4_SANITIZE_ONLY OFF) - _c4_default_if_not_set(C4_ASAN ON) - _c4_default_if_not_set(C4_TSAN ON) - _c4_default_if_not_set(C4_MSAN ON) - _c4_default_if_not_set(C4_UBSAN ON) - - cmake_dependent_option(${_c4_uprefix}SANITIZE "turn on clang sanitizer targets" ${C4_SANITIZE} ${umbrella_option} OFF) - cmake_dependent_option(${_c4_uprefix}SANITIZE_ONLY "compile only sanitize targets (not the regular unsanitized targets)" ${C4_SANITIZE_ONLY} ${umbrella_option} OFF) - - # options for individual sanitizers - contingent on sanitize on/off - cmake_dependent_option(${_c4_uprefix}ASAN "" ${C4_ASAN} "${_c4_uprefix}SANITIZE" OFF) - cmake_dependent_option(${_c4_uprefix}TSAN "" ${C4_TSAN} "${_c4_uprefix}SANITIZE" OFF) - cmake_dependent_option(${_c4_uprefix}MSAN "" ${C4_MSAN} "${_c4_uprefix}SANITIZE" OFF) - cmake_dependent_option(${_c4_uprefix}UBSAN "" ${C4_UBSAN} "${_c4_uprefix}SANITIZE" OFF) - - if(${_c4_uprefix}SANITIZE) - string(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" LLVM_VERSION "${CMAKE_CXX_COMPILER_VERSION}") - find_program(LLVM_SYMBOLIZER llvm-symbolizer - NAMES llvm-symbolizer-${LLVM_VERSION} llvm-symbolizer - DOC "symbolizer to use in sanitize tools") - if(NOT LLVM_SYMBOLIZER) - string(REGEX REPLACE "([0-9]+)\\.[0-9]+.*" "\\1" LLVM_VERSION "${CMAKE_CXX_COMPILER_VERSION}") - find_program(LLVM_SYMBOLIZER llvm-symbolizer - NAMES llvm-symbolizer-${LLVM_VERSION} llvm-symbolizer - DOC "symbolizer to use in sanitize tools") - if(NOT LLVM_SYMBOLIZER) - message(FATAL_ERROR "could not find symbolizer. LLVM_VERSION=${LLVM_VERSION}") - endif() - endif() - - set(ss) # string to report enabled sanitizers - - if(${_c4_uprefix}ASAN) - set(ss "asan") - set(${_c4_uprefix}ASAN_CFLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls" CACHE STRING "compile flags for clang address sanitizer: https://clang.llvm.org/docs/AddressSanitizer.html") - set(${_c4_uprefix}ASAN_LFLAGS "-g -fsanitize=address" CACHE STRING "linker flags for clang address sanitizer: https://clang.llvm.org/docs/AddressSanitizer.html") - set(${_c4_uprefix}ASAN_RENV "env ASAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER} ASAN_OPTIONS=symbolize=1" CACHE STRING "run environment for clang address sanitizer: https://clang.llvm.org/docs/AddressSanitizer.html") - # the flags are strings; we need to separate them into a list - # to prevent cmake from quoting them when passing to the targets - separate_arguments(${_c4_uprefix}ASAN_CFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}ASAN_CFLAGS}) - separate_arguments(${_c4_uprefix}ASAN_LFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}ASAN_LFLAGS}) - endif() - - if(${_c4_uprefix}TSAN) - set(ss "${ss} tsan") - set(${_c4_uprefix}TSAN_CFLAGS "-O1 -g -fsanitize=thread -fno-omit-frame-pointer" CACHE STRING "compile flags for clang thread sanitizer: https://clang.llvm.org/docs/ThreadSanitizer.html") - set(${_c4_uprefix}TSAN_LFLAGS "-g -fsanitize=thread" CACHE STRING "linker flags for clang thread sanitizer: https://clang.llvm.org/docs/ThreadSanitizer.html") - set(${_c4_uprefix}TSAN_RENV "env TSAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER} TSAN_OPTIONS=symbolize=1" CACHE STRING "run environment for clang thread sanitizer: https://clang.llvm.org/docs/ThreadSanitizer.html") - separate_arguments(${_c4_uprefix}TSAN_CFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}TSAN_CFLAGS}) - separate_arguments(${_c4_uprefix}TSAN_LFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}TSAN_LFLAGS}) - endif() - - if(${_c4_uprefix}MSAN) - set(ss "${ss} msan") - set(${_c4_uprefix}MSAN_CFLAGS "-O1 -g -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fno-optimize-sibling-calls" CACHE STRING "compile flags for clang memory sanitizer: https://clang.llvm.org/docs/MemorySanitizer.html") - set(${_c4_uprefix}MSAN_LFLAGS "-g -fsanitize=memory" CACHE STRING "linker flags for clang memory sanitizer: https://clang.llvm.org/docs/MemorySanitizer.html") - set(${_c4_uprefix}MSAN_RENV "env MSAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER} MSAN_OPTIONS=symbolize=1" CACHE STRING "run environment for clang memory sanitizer: https://clang.llvm.org/docs/MemorySanitizer.html") - separate_arguments(${_c4_uprefix}MSAN_CFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}MSAN_CFLAGS}) - separate_arguments(${_c4_uprefix}MSAN_LFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}MSAN_LFLAGS}) - endif() - - if(${_c4_uprefix}UBSAN) - set(ss "${ss} ubsan") - set(${_c4_uprefix}UBSAN_CFLAGS "-g -fsanitize=undefined" CACHE STRING "compile flags for clang undefined behaviour sanitizer: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html") - set(${_c4_uprefix}UBSAN_LFLAGS "-g -fsanitize=undefined" CACHE STRING "linker flags for clang undefined behaviour sanitizer: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html") - set(${_c4_uprefix}UBSAN_RENV "env UBSAN_SYMBOLIZER_PATH=${LLVM_SYMBOLIZER} UBSAN_OPTIONS='symbolize=1 print_stacktrace=1'" CACHE STRING "run environment for clang undefined behaviour sanitizer: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html") - separate_arguments(${_c4_uprefix}UBSAN_CFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}UBSAN_CFLAGS}) - separate_arguments(${_c4_uprefix}UBSAN_LFLAGS_SEP UNIX_COMMAND ${${_c4_uprefix}UBSAN_LFLAGS}) - endif() - - c4_dbg("enabled clang sanitizers: ${ss}") - endif() # ${_c4_uprefix}SANITIZE - -endfunction() - - -#------------------------------------------------------------------------------ -function(c4_sanitize_get_target_command name which_sanitizer_ output) - string(TOUPPER ${which_sanitizer_} which_sanitizer) - if("${which_sanitizer}" STREQUAL ASAN) - elseif("${which_sanitizer}" STREQUAL TSAN) - elseif("${which_sanitizer}" STREQUAL MSAN) - elseif("${which_sanitizer}" STREQUAL UBSAN) - else() - message(FATAL_ERROR "the sanitizer must be one of: ASAN, TSAN, MSAN, UBSAN") - endif() - separate_arguments(cmd UNIX_COMMAND "${${_c4_uprefix}${which_sanitizer}_RENV} ${name}") - set(${output} ${cmd} PARENT_SCOPE) -endfunction() - -function(_sanitize_set_target_folder tgt folder) - if(folder) - set_target_properties(${tgt} PROPERTIES FOLDER "${folder}") - endif() -endfunction() - - -#------------------------------------------------------------------------------ -function(c4_sanitize_target name) - set(opt0arg - LIBRARY - EXECUTABLE - ) - set(opt1arg - OUTPUT_TARGET_NAMES - FOLDER - ) - set(optnarg - SOURCES - INC_DIRS # TODO public, interface, private - LIBS # TODO public, interface, private - LIB_DIRS # TODO public, interface, private - DEFS # TODO public, interface, private - CFLAGS # TODO public, interface, private - ) - cmake_parse_arguments("" "${opt0arg}" "${opt1arg}" "${optnarg}" ${ARGN}) - - if((NOT _LIBRARY) AND (NOT _EXECUTABLE)) - c4_err("either LIBRARY or EXECUTABLE must be specified") - endif() - - if(${_c4_uprefix}SANITIZE AND NOT TARGET ${_c4_lprefix}sanitize) - add_custom_target(${_c4_lprefix}sanitize) - _sanitize_set_target_folder(${_c4_lprefix}sanitize "${_FOLDER}") - endif() - if(${_c4_uprefix}ASAN AND NOT TARGET ${_c4_lprefix}asan-all) - add_custom_target(${_c4_lprefix}asan-all) - add_dependencies(${_c4_lprefix}sanitize ${_c4_lprefix}asan-all) - _sanitize_set_target_folder(${_c4_lprefix}asan-all "${_FOLDER}") - endif() - if(${_c4_uprefix}MSAN AND NOT TARGET ${_c4_lprefix}msan-all) - add_custom_target(${_c4_lprefix}msan-all) - add_dependencies(${_c4_lprefix}sanitize ${_c4_lprefix}msan-all) - _sanitize_set_target_folder(${_c4_lprefix}msan-all "${_FOLDER}") - endif() - if(${_c4_uprefix}TSAN AND NOT TARGET ${_c4_lprefix}tsan-all) - add_custom_target(${_c4_lprefix}tsan-all) - add_dependencies(${_c4_lprefix}sanitize ${_c4_lprefix}tsan-all) - _sanitize_set_target_folder(${_c4_lprefix}tsan-all "${_FOLDER}") - endif() - if(${_c4_uprefix}UBSAN AND NOT TARGET ${_c4_lprefix}ubsan-all) - add_custom_target(${_c4_lprefix}ubsan-all) - add_dependencies(${_c4_lprefix}sanitize ${_c4_lprefix}ubsan-all) - _sanitize_set_target_folder(${_c4_lprefix}ubsan-all "${_FOLDER}") - endif() - - if(${_c4_uprefix}ASAN OR ${_c4_uprefix}MSAN OR ${_c4_uprefix}TSAN OR ${_c4_uprefix}UBSAN) - add_custom_target(${name}-sanitize-all) - _sanitize_set_target_folder(${name}-sanitize-all "${_FOLDER}") - endif() - - set(targets) - - # https://clang.llvm.org/docs/AddressSanitizer.html - if(${_c4_uprefix}ASAN) - if(${_LIBRARY}) - add_library(${name}-asan EXCLUDE_FROM_ALL ${_SOURCES}) - elseif(${_EXECUTABLE}) - add_executable(${name}-asan EXCLUDE_FROM_ALL ${_SOURCES}) - endif() - _sanitize_set_target_folder(${name}-asan "${_FOLDER}") - list(APPEND targets ${name}-asan) - target_include_directories(${name}-asan PUBLIC ${_INC_DIRS}) - set(_real_libs) - foreach(_l ${_LIBS}) - if(TARGET ${_l}-asan) - list(APPEND _real_libs ${_l}-asan) - else() - list(APPEND _real_libs ${_l}) - endif() - endforeach() - target_link_libraries(${name}-asan PUBLIC ${_real_libs}) - target_compile_definitions(${name}-asan PUBLIC ${_DEFS}) - target_compile_options(${name}-asan PUBLIC ${_CFLAGS} ${${_c4_uprefix}ASAN_CFLAGS_SEP}) - # http://stackoverflow.com/questions/25043458/does-cmake-have-something-like-target-link-options - target_link_libraries(${name}-asan PUBLIC ${${_c4_uprefix}ASAN_LFLAGS_SEP}) - add_dependencies(${_c4_lprefix}asan-all ${name}-asan) - add_dependencies(${name}-sanitize-all ${name}-asan) - endif() - - # https://clang.llvm.org/docs/ThreadSanitizer.html - if(${_c4_uprefix}TSAN) - if(${_LIBRARY}) - add_library(${name}-tsan EXCLUDE_FROM_ALL ${_SOURCES}) - elseif(${_EXECUTABLE}) - add_executable(${name}-tsan EXCLUDE_FROM_ALL ${_SOURCES}) - endif() - _sanitize_set_target_folder(${name}-tsan "${_FOLDER}") - list(APPEND targets ${name}-tsan) - target_include_directories(${name}-tsan PUBLIC ${_INC_DIRS}) - set(_real_libs) - foreach(_l ${_LIBS}) - if(TARGET ${_l}-tsan) - list(APPEND _real_libs ${_l}-tsan) - else() - list(APPEND _real_libs ${_l}) - endif() - endforeach() - target_link_libraries(${name}-tsan PUBLIC ${_real_libs}) - target_compile_definitions(${name}-tsan PUBLIC ${_DEFS}) - target_compile_options(${name}-tsan PUBLIC ${_CFLAGS} ${${_c4_uprefix}TSAN_CFLAGS_SEP}) - # http://stackoverflow.com/questions/25043458/does-cmake-have-something-like-target-link-options - target_link_libraries(${name}-tsan PUBLIC ${${_c4_uprefix}TSAN_LFLAGS_SEP}) - add_dependencies(${_c4_lprefix}tsan-all ${name}-tsan) - add_dependencies(${name}-sanitize-all ${name}-tsan) - endif() - - # https://clang.llvm.org/docs/MemorySanitizer.html - if(${_c4_uprefix}MSAN) - if(${_LIBRARY}) - add_library(${name}-msan EXCLUDE_FROM_ALL ${_SOURCES}) - elseif(${_EXECUTABLE}) - add_executable(${name}-msan EXCLUDE_FROM_ALL ${_SOURCES}) - endif() - _sanitize_set_target_folder(${name}-msan "${_FOLDER}") - list(APPEND targets ${name}-msan) - target_include_directories(${name}-msan PUBLIC ${_INC_DIRS}) - set(_real_libs) - foreach(_l ${_LIBS}) - if(TARGET ${_l}-msan) - list(APPEND _real_libs ${_l}-msan) - else() - list(APPEND _real_libs ${_l}) - endif() - endforeach() - target_link_libraries(${name}-msan PUBLIC ${_real_libs}) - target_compile_definitions(${name}-msan PUBLIC ${_DEFS}) - target_compile_options(${name}-msan PUBLIC ${_CFLAGS} ${${_c4_uprefix}MSAN_CFLAGS_SEP}) - # http://stackoverflow.com/questions/25043458/does-cmake-have-something-like-target-link-options - target_link_libraries(${name}-msan PUBLIC ${${_c4_uprefix}MSAN_LFLAGS_SEP}) - add_dependencies(${_c4_lprefix}msan-all ${name}-msan) - add_dependencies(${name}-sanitize-all ${name}-msan) - endif() - - # https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html - if(${_c4_uprefix}UBSAN) - if(${_LIBRARY}) - add_library(${name}-ubsan EXCLUDE_FROM_ALL ${_SOURCES}) - elseif(${_EXECUTABLE}) - add_executable(${name}-ubsan EXCLUDE_FROM_ALL ${_SOURCES}) - endif() - _sanitize_set_target_folder(${name}-ubsan "${_FOLDER}") - list(APPEND targets ${name}-ubsan) - target_include_directories(${name}-ubsan PUBLIC ${_INC_DIRS}) - set(_real_libs) - foreach(_l ${_LIBS}) - if(TARGET ${_l}-ubsan) - list(APPEND _real_libs ${_l}-ubsan) - else() - list(APPEND _real_libs ${_l}) - endif() - endforeach() - target_link_libraries(${name}-ubsan PUBLIC ${_real_libs}) - target_compile_definitions(${name}-ubsan PUBLIC ${_DEFS}) - target_compile_options(${name}-ubsan PUBLIC ${_CFLAGS} ${${_c4_uprefix}UBSAN_CFLAGS_SEP}) - # http://stackoverflow.com/questions/25043458/does-cmake-have-something-like-target-link-options - target_link_libraries(${name}-ubsan PUBLIC ${${_c4_uprefix}UBSAN_LFLAGS_SEP}) - add_dependencies(${_c4_lprefix}ubsan-all ${name}-ubsan) - add_dependencies(${name}-sanitize-all ${name}-ubsan) - endif() - - if(_OUTPUT_TARGET_NAMES) - set(${_OUTPUT_TARGET_NAMES} ${targets} PARENT_SCOPE) - endif() -endfunction() - - -endif(NOT _c4_sanitize_target_included) |