mirror of
https://github.com/QuasarApp/backward-cpp.git
synced 2025-05-03 05:19:33 +00:00
Try to get the CMakeLists.txt working and somewhat flexible.
This commit is contained in:
parent
8fe8aee5b0
commit
77fc8d9fe4
125
CMakeLists.txt
125
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 $<TARGET_OBJECTS:enable_backward> 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 $<TARGET_OBJECTS:backward_object> 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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user