diff --git a/CMakeLists.txt b/CMakeLists.txt index db91a31..1c4d8be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -cmake_minimum_required(VERSION 2.8.8) +cmake_minimum_required(VERSION 2.8.12) project(backward CXX) ############################################################################### @@ -29,6 +29,22 @@ project(backward CXX) option(BACKWARD_TESTS "Compile tests" ON) +set(STACK_WALKING_UNWIND TRUE CACHE BOOL + "Use compiler's unwind API") +set(STACK_WALKING_BACKTRACE FALSE CACHE BOOL + "Use backtrace from (e)glibc for stack walking") + + +set(STACK_DETAILS_AUTO_DETECT TRUE CACHE BOOL + "Auto detect backward's stack details dependencies") + +set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE CACHE BOOL + "Use backtrace from (e)glibc for symbols resolution") +set(STACK_DETAILS_DW FALSE CACHE BOOL + "Use libdw to read debug info") +set(STACK_DETAILS_BFD FALSE CACHE BOOL + "Use libbfd to read debug info") + ############################################################################### # COMPILER FLAGS ############################################################################### @@ -38,70 +54,91 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") endif() -enable_testing() - ############################################################################### # CONFIGS ############################################################################### +if (${STACK_DETAILS_AUTO_DETECT}) + include(FindPackageHandleStandardArgs) -set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) -set(STACK_DETAILS_DW FALSE) -set(STACK_DETAILS_BFD FALSE) + # find libdw + find_path(LIBDW_INCLUDE_DIR NAMES "elfutils/libdw.h" "elfutils/libdwfl.h") + find_library(LIBDW_LIBRARY dw) + set(LIBDW_INCLUDE_DIRS ${LIBDW_INCLUDE_DIR} ) + set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} ) + find_package_handle_standard_args(libdw DEFAULT_MSG + LIBDW_LIBRARY LIBDW_INCLUDE_DIR) + mark_as_advanced(LIBDW_INCLUDE_DIR LIBDW_LIBRARY) -set(STACK_WALKING_UNWIND FALSE) -set(STACK_WALKING_BACKTRACE FALSE) + # find libbfd + find_path(LIBBFD_INCLUDE_DIR NAMES "bfd.h") + find_path(LIBDL_INCLUDE_DIR NAMES "dlfcn.h") + find_library(LIBBFD_LIBRARY bfd) + find_library(LIBDL_LIBRARY dl) + set(LIBBFD_INCLUDE_DIRS ${LIBBFD_INCLUDE_DIR} ${LIBDL_INCLUDE_DIR}) + set(LIBBFD_LIBRARIES ${LIBBFD_LIBRARY} ${LIBDL_LIBRARY}) + find_package_handle_standard_args(libbfd DEFAULT_MSG + LIBBFD_LIBRARY LIBBFD_INCLUDE_DIR + LIBDL_LIBRARY LIBDL_INCLUDE_DIR) + mark_as_advanced(LIBBFD_INCLUDE_DIR LIBBFD_LIBRARY + LIBDL_INCLUDE_DIR LIBDL_LIBRARY) -find_library(BACKWARD_LIBDW_PATH dw) -find_library(BACKWARD_LIBBFD_PATH bfd) -if(NOT (BACKWARD_LIBDW_PATH STREQUAL "BACKWARD_LIBDW_PATH-NOTFOUND" OR BACKWARD_LIBDW_PATH STREQUAL "")) - set(STACK_DETAILS_DW TRUE) - list(APPEND backward_LIBRARIES ${BACKWARD_LIBDW_PATH}) -elseif(NOT (BACKWARD_LIBBFD_PATH STREQUAL "BACKWARD_LIBBFD_PATH-NOTFOUND" OR BACKWARD_LIBBFD_PATH STREQUAL "")) - set(STACK_DETAILS_BFD TRUE) - list(APPEND backward_LIBRARIES ${BACKWARD_LIBBFD_PATH}) + if (LIBDW_FOUND) + LIST(APPEND BACKWARD_INCLUDE_DIRS ${LIBDW_INCLUDE_DIRS}) + LIST(APPEND BACKWARD_LIBRARIES ${LIBDW_LIBRARIES}) + set(STACK_DETAILS_DW TRUE) + set(STACK_DETAILS_BFD FALSE) + set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) + elseif(LIBBFD_FOUND) + LIST(APPEND BACKWARD_INCLUDE_DIRS ${LIBBFD_INCLUDE_DIRS}) + LIST(APPEND BACKWARD_LIBRARIES ${LIBBFD_LIBRARIES}) + set(STACK_DETAILS_DW FALSE) + set(STACK_DETAILS_BFD TRUE) + set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) + else() + set(STACK_DETAILS_DW FALSE) + set(STACK_DETAILS_BFD FALSE) + set(STACK_DETAILS_BACKTRACE_SYMBOL TRUE) + endif() else() - set(STACK_DETAILS_BACKTRACE_SYMBOL TRUE) - message(WARNING "Could not find advanced symbol information library (libdw/libbfd), falling back to backtrace") -endif() + if (STACK_DETAILS_DW) + LIST(APPEND BACKWARD_LIBRARIES dw) + endif() -find_library(BACKWARD_LIBUNWIND_PATH unwind) -if(NOT (BACKWARD_LIBUNWIND_PATH STREQUAL "BACKWARD_LIBUNWIND_PATH-NOTFOUND" OR BACKWARD_LIBUNWIND_PATH STREQUAL "")) - set(STACK_WALKING_UNWIND TRUE) - list(APPEND backward_LIBRARIES ${BACKWARD_LIBUNWIND_PATH}) -else() - set(STACK_WALKING_BACKTRACE TRUE) - message(WARNING "Could not find stack backtrace library (libunwind), falling back to backtrace") + if (STACK_DETAILS_BFD) + LIST(APPEND BACKWARD_LIBRARIES bfd dl) + endif() endif() macro(map_definitions var_prefix define_prefix) - foreach(def ${ARGV}) + foreach(def ${ARGN}) if (${${var_prefix}${def}}) LIST(APPEND BACKWARD_DEFINITIONS "${define_prefix}${def}=1") + else() + LIST(APPEND BACKWARD_DEFINITIONS "${define_prefix}${def}=0") endif() endforeach() endmacro() -map_definitions("STACK_DETAILS_" "BACKWARD_HAS_" BACKTRACE_SYMBOL DW BFD) map_definitions("STACK_WALKING_" "BACKWARD_HAS_" UNWIND BACKTRACE) +map_definitions("STACK_DETAILS_" "BACKWARD_HAS_" BACKTRACE_SYMBOL DW BFD) foreach(def ${BACKWARD_DEFINITIONS}) message(STATUS "${def}") endforeach() -add_library(enable_backward OBJECT backward.cpp) -target_compile_definitions(enable_backward PRIVATE ${BACKWARD_DEFINITIONS}) -set(BACKWARD_ENABLE $ CACHE STRING -"object to enable automatic backward processing") +add_library(backward_object OBJECT backward.cpp) +target_compile_definitions(backward_object PRIVATE ${BACKWARD_DEFINITIONS}) +target_include_directories(backward_object PRIVATE ${BACKWARD_INCLUDE_DIRS}) +set(BACKWARD_ENABLE $ CACHE STRING + "Link with this object to setup backward automatically") + +LIST(APPEND BACKWARD_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}) -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}) + target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${BACKWARD_DEFINITIONS}) set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES ${BACKWARD_LIBRARIES}) endmacro() - mark_as_advanced(BACKWARD_INCLUDE_DIR BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) ############################################################################### @@ -109,20 +146,22 @@ mark_as_advanced(BACKWARD_INCLUDE_DIR BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) ############################################################################### if(BACKWARD_TESTS) - include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + enable_testing() add_library(test_main SHARED test/_test_main.cpp) - macro(backward_add_test src src_dep) + macro(backward_add_test src) get_filename_component(name ${src} NAME_WE) set(test_name "test_${name}") - add_executable(${test_name} ${src} ${src_dep}) + add_executable(${test_name} ${src} ${ARGN}) set_target_properties(${test_name} PROPERTIES COMPILE_DEFINITIONS "${BACKWARD_DEFINITIONS}") - target_link_libraries(${test_name} dw bfd dl test_main) + target_include_directories(${test_name} PRIVATE ${BACKWARD_INCLUDE_DIRS}) + + target_link_libraries(${test_name} ${BACKWARD_LIBRARIES} test_main) add_test(NAME ${name} COMMAND ${test_name}) endmacro() @@ -135,7 +174,7 @@ if(BACKWARD_TESTS) ) foreach(test ${TESTS}) - backward_add_test(test/${test}.cpp "") + backward_add_test(test/${test}.cpp) endforeach() # Tests with backward.cpp @@ -144,6 +183,6 @@ if(BACKWARD_TESTS) ) foreach(test ${TESTS}) - backward_add_test(test/${test}.cpp backward.cpp) + backward_add_test(test/${test}.cpp ${BACKWARD_ENABLE}) endforeach() endif()