1 # Copyright 2020, 2021 Peter Dimov
2 # Distributed under the Boost Software License, Version 1.0.
3 # https://www.boost.org/LICENSE_1_0.txt
5 cmake_minimum_required(VERSION 3.5...3.16)
7 project(boost_stacktrace VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
9 function(stacktrace_add_library suffix opt libs defs)
15 add_library(boost_stacktrace_${suffix}
19 add_library(Boost::stacktrace_${suffix} ALIAS boost_stacktrace_${suffix})
21 target_include_directories(boost_stacktrace_${suffix} PUBLIC include)
23 target_link_libraries(boost_stacktrace_${suffix}
37 target_compile_definitions(boost_stacktrace_${suffix}
38 PUBLIC BOOST_STACKTRACE_NO_LIB
39 PRIVATE BOOST_STACKTRACE_SOURCE ${defs}
43 target_compile_definitions(boost_stacktrace_${suffix} PUBLIC BOOST_STACKTRACE_DYN_LINK)
45 target_compile_definitions(boost_stacktrace_${suffix} PUBLIC BOOST_STACKTRACE_STATIC_LINK)
48 if(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)
49 boost_install(TARGETS boost_stacktrace_${suffix} VERSION ${BOOST_SUPERPROJECT_VERSION} HEADER_DIRECTORY include)
54 include(CheckCXXSourceCompiles)
56 function(stacktrace_check var source incs libs defs)
58 set(CMAKE_REQUIRED_INCLUDES "${incs}")
59 list(APPEND CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/build")
60 set(CMAKE_REQUIRED_LIBRARIES "${libs}")
61 set(CMAKE_REQUIRED_DEFINITIONS "${defs}")
62 check_cxx_source_compiles("#include \"${source}\"" ${var})
63 set(${var} ${${var}} PARENT_SCOPE)
67 stacktrace_check(BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace" "")
69 set(_default_addr2line ON)
70 if(WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
71 set(_default_addr2line OFF)
74 stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32" "")
75 stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR}/../config/include" "dbgeng;ole32" "")
77 option(BOOST_STACKTRACE_ENABLE_NOOP "Boost.Stacktrace: build boost_stacktrace_noop" ON)
78 option(BOOST_STACKTRACE_ENABLE_BACKTRACE "Boost.Stacktrace: build boost_stacktrace_backtrace" ${BOOST_STACKTRACE_HAS_BACKTRACE})
79 option(BOOST_STACKTRACE_ENABLE_ADDR2LINE "Boost.Stacktrace: build boost_stacktrace_addr2line" ${_default_addr2line})
80 option(BOOST_STACKTRACE_ENABLE_BASIC "Boost.Stacktrace: build boost_stacktrace_basic" ON)
81 option(BOOST_STACKTRACE_ENABLE_WINDBG "Boost.Stacktrace: build boost_stacktrace_windbg" ${BOOST_STACKTRACE_HAS_WINDBG})
82 option(BOOST_STACKTRACE_ENABLE_WINDBG_CACHED "Boost.Stacktrace: build boost_stacktrace_windbg_cached" ${BOOST_STACKTRACE_HAS_WINDBG_CACHED})
84 unset(_default_addr2line)
86 message(STATUS "Boost.Stacktrace: "
87 "noop ${BOOST_STACKTRACE_ENABLE_NOOP}, "
88 "backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE}, "
89 "addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE}, "
90 "basic ${BOOST_STACKTRACE_ENABLE_BASIC}, "
91 "windbg ${BOOST_STACKTRACE_ENABLE_WINDBG}, "
92 "windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED}"
95 stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "")
96 stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "backtrace" "")
97 stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "" "")
98 stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "" "")
99 stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "dbgeng;ole32" "_GNU_SOURCE=1")
100 stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "dbgeng;ole32" "_GNU_SOURCE=1")
102 if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
104 add_subdirectory(test)