diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a57750..05abc32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,17 +45,39 @@ enable_testing() # CONFIGS ############################################################################### -set(STACK_DETAILS_BACKTRACE_SYMBOL TRUE CACHE BOOL "Use backtrace symbol") +set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE CACHE BOOL "Use backtrace symbol") set(STACK_DETAILS_DW FALSE CACHE BOOL "Use libdw") set(STACK_DETAILS_BFD FALSE CACHE BOOL "Use libbfd") set(STACK_WALKING_UNWIND TRUE CACHE BOOL "Use unwind for stack walking") set(STACK_WALKING_BACKTRACE FALSE CACHE BOOL "Use backtrace for stack walking") +find_library(BACKWARD_LIBDW_PATH dw) +find_library(BACKWARD_LIBBFD_PATH bfd) +if(NOT BACKWARD_LIBDW_PATH STREQUAL "BACKWARD_LIBDW_PATH-NOTFOUND") + set(STACK_DETAILS_DW TRUE) + list(APPEND backward_LIBRARIES ${BACKWARD_LIBDW_PATH}) +elseif(NOT BACKWARD_LIBBFD_PATH STREQUAL "BACKWARD_LIBBFD_PATH-NOTFOUND") + set(STACK_DETAILS_BFD TRUE) + list(APPEND backward_LIBRARIES ${BACKWARD_LIBBFD_PATH}) +else() + set(STACK_DETAILS_BACKTRACE_SYMBOL TRUE) + message(INFO "Could not find advanced symbol information library (libdw/libbfd), falling back to backtrace") +endif() + +find_library(BACKWARD_LIBUNWIND_PATH unwind) +if(NOT BACKWARD_LIBUNWIND_PATH STREQUAL "BACKWARD_LIBUNWIND_PATH-NOTFOUND") + set(STACK_WALKING_UNWIND TRUE) + list(APPEND backward_LIBRARIES ${BACKWARD_LIBUNWIND_PATH}) +else() + set(STACK_WALKING_BACKTRACE TRUE) + message(INFO "Could not find stack backtrace library (libunwind), falling back to backtrace") +endif() + macro(map_definitions var_prefix define_prefix) foreach(def ${ARGV}) if (${${var_prefix}${def}}) - LIST(APPEND BACKWARD_DEFINITIONS "${define_prefix}${def}=1") + LIST(APPEND backward_DEFINITIONS "${define_prefix}${def}=1") endif() endforeach() endmacro() @@ -67,6 +89,25 @@ foreach(def ${BACKWARD_DEFINITIONS}) message(STATUS "${def}") endforeach() +add_library(enable_backward OBJECT backward.cpp) +target_compile_definitions(enable_backward PRIVATE ${backward_DEFINITIONS}) + +if(BACKWARD_ONLY_IF_DEBUG) + set(backward_ENABLE $<$,$>:$ CACHE STRING + "object to enable automatic backward processing (only in Debug/RelWithDebInfo)") +else() + set(backward_ENABLE $ CACHE STRING + "object to enable automatic backward processing") +endif() +set(backward_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE STRING "backward include directory") +set(backward_DEFINITIONS ${backward_DEFINITIONS} CACHE STRING "backward feature definitions") +set(backward_LIBRARIES ${backward_LIBRARIES} CACHE STRING "backward libraries") +macro(add_backward target) + target_include_directories(${target} PRIVATE ${backward_INCLUDE_DIR}) + set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${backward_DEFINITIONS}) + set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES ${backward_LIBRARIES}) +endmacro() + ############################################################################### # TESTS ###############################################################################