11# Copyright 2020, 2021 Peter Dimov
2+ # Copyright 2026 Fedor Osetrov
23# Distributed under the Boost Software License, Version 1.0.
34# https://www.boost.org/LICENSE_1_0.txt
45
56cmake_minimum_required (VERSION 3.8...4.20 )
67
78project (boost_stacktrace VERSION "${BOOST_SUPERPROJECT_VERSION} " LANGUAGES CXX )
89
9- function (stacktrace_add_library suffix opt libs defs )
10+ function (stacktrace_add_library suffix opt public_libs libs defs )
1011
1112 if (NOT opt)
1213 return ()
1314 endif ()
1415
15- add_library (boost_stacktrace_${suffix}
16- src/${suffix}.cpp
17- )
16+ add_library (boost_stacktrace_${suffix} )
1817
1918 add_library (Boost::stacktrace_${suffix} ALIAS boost_stacktrace_${suffix} )
2019
@@ -27,13 +26,21 @@ function(stacktrace_add_library suffix opt libs defs)
2726 Boost::core
2827 Boost::predef
2928 Boost::winapi
29+ ${public_libs}
3030 PRIVATE
3131 ${libs}
3232 )
3333
3434 target_compile_definitions (boost_stacktrace_${suffix}
35- PUBLIC BOOST_STACKTRACE_NO_LIB
36- PRIVATE BOOST_STACKTRACE_SOURCE ${defs}
35+ PUBLIC
36+ BOOST_STACKTRACE_NO_LIB
37+ PRIVATE
38+ ${defs}
39+ )
40+
41+ target_sources (boost_stacktrace_${suffix}
42+ PRIVATE
43+ ${CMAKE_CURRENT_LIST_DIR} /src/${suffix}.cpp
3744 )
3845
3946 if (BUILD_SHARED_LIBS )
@@ -50,26 +57,25 @@ endfunction()
5057
5158include (CheckCXXSourceCompiles )
5259
53- function (stacktrace_check var source incs libs defs )
60+ function (stacktrace_check var source incs libs )
5461
5562 set (CMAKE_REQUIRED_INCLUDES "${incs} " )
5663 list (APPEND CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR} /build" )
5764 set (CMAKE_REQUIRED_LIBRARIES "${libs} " )
58- set (CMAKE_REQUIRED_DEFINITIONS "${defs} " )
5965 check_cxx_source_compiles ("#include \" ${source} \" " ${var} )
6066 set (${var} ${${var} } PARENT_SCOPE )
6167
6268endfunction ()
6369
64- stacktrace_check (BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace" "" )
70+ stacktrace_check (BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace" )
6571
6672set (_default_addr2line ON )
6773if (WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin" )
6874 set (_default_addr2line OFF )
6975endif ()
7076
71- stacktrace_check (BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32" "" )
72- stacktrace_check (BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR} /../config/include" "dbgeng;ole32" "" )
77+ stacktrace_check (BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32" )
78+ stacktrace_check (BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR} /../config/include" "dbgeng;ole32" )
7379
7480set (_default_from_exception ON )
7581if (CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin" )
@@ -97,51 +103,59 @@ message(STATUS "Boost.Stacktrace: "
97103 "from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "
98104)
99105
100- stacktrace_add_library (noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" )
101- stacktrace_add_library (backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "backtrace;${CMAKE_DL_LIBS} " "" )
102- stacktrace_add_library (addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "${CMAKE_DL_LIBS} " "" )
103- stacktrace_add_library (basic ${BOOST_STACKTRACE_ENABLE_BASIC} "${CMAKE_DL_LIBS} " "" )
104- stacktrace_add_library (windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "dbgeng;ole32" "_GNU_SOURCE=1" )
105- stacktrace_add_library (windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "dbgeng;ole32" "_GNU_SOURCE=1" )
106+ if (BOOST_STACKTRACE_ENABLE_BACKTRACE OR
107+ BOOST_STACKTRACE_ENABLE_ADDR2LINE OR
108+ BOOST_STACKTRACE_ENABLE_BASIC OR
109+ BOOST_STACKTRACE_ENABLE_WINDBG OR
110+ BOOST_STACKTRACE_ENABLE_WINDBG_CACHED
111+ )
112+ set (_enable_non_noop_backend TRUE )
113+ endif ()
114+
115+ if (_enable_non_noop_backend)
116+ stacktrace_add_library (dump ON "" "" "" )
117+ endif ()
118+ stacktrace_add_library (noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "" )
119+ stacktrace_add_library (backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS} " "" )
120+ stacktrace_add_library (addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS} " "" )
121+ stacktrace_add_library (basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS} " "" )
122+ stacktrace_add_library (windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" )
123+ stacktrace_add_library (windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" )
106124
107125# boost_stacktrace, default library
108126
109127add_library (boost_stacktrace INTERFACE )
110- add_library (Boost::stacktrace ALIAS boost_stacktrace )
111128
112129target_include_directories (boost_stacktrace INTERFACE include )
113130
114- if (BOOST_STACKTRACE_ENABLE_WINDBG)
115-
116- target_link_libraries (boost_stacktrace INTERFACE Boost::stacktrace_windbg )
131+ add_library (Boost::stacktrace ALIAS boost_stacktrace )
117132
133+ if (BOOST_STACKTRACE_ENABLE_WINDBG)
134+ set (__default_stacktrace_backend "windbg" )
118135elseif (BOOST_STACKTRACE_ENABLE_WINDBG_CACHED)
119-
120- target_link_libraries (boost_stacktrace INTERFACE Boost::stacktrace_windbg )
121-
136+ set (__default_stacktrace_backend "windbg_cached" )
122137elseif (BOOST_STACKTRACE_ENABLE_BACKTRACE)
123-
124- target_link_libraries (boost_stacktrace INTERFACE Boost::stacktrace_backtrace )
125-
138+ set (__default_stacktrace_backend "backtrace" )
126139elseif (BOOST_STACKTRACE_ENABLE_ADDR2LINE)
127-
128- target_link_libraries (boost_stacktrace INTERFACE Boost::stacktrace_addr2line )
129-
140+ set (__default_stacktrace_backend "addr2line" )
130141elseif (BOOST_STACKTRACE_ENABLE_BASIC)
131-
132- target_link_libraries (boost_stacktrace INTERFACE Boost::stacktrace_basic )
133-
142+ set (__default_stacktrace_backend "basic" )
134143elseif (BOOST_STACKTRACE_ENABLE_NOOP)
135-
136- target_link_libraries ( boost_stacktrace INTERFACE Boost::stacktrace_noop )
137-
144+ set (__default_stacktrace_backend "noop" )
145+ else ( )
146+ message (FATAL "All backends are disabled" )
138147endif ()
139148
140- # Boost::stacktrace_from_exception is never the default
141- stacktrace_add_library ( from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} " ${CMAKE_DL_LIBS} ;boost_stacktrace" "" )
149+ message ( STATUS " Boost.stacktrace default backend: ${__default_stacktrace_backend} " )
150+ target_link_libraries ( boost_stacktrace INTERFACE Boost::stacktrace_${__default_stacktrace_backend} )
142151
143- #
152+ # Boost::stacktrace_from_exception is never the default
153+ if (_enable_non_noop_backend)
154+ stacktrace_add_library (from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} Boost::stacktrace_dump "${CMAKE_DL_LIBS} " "" )
155+ unset (_enable_non_noop_backend)
156+ endif ()
144157
145158if (BUILD_TESTING)
146159 add_subdirectory (test )
147160endif ()
161+ unset (__default_stacktrace_backend)
0 commit comments