Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 53 additions & 39 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
# Copyright 2020, 2021 Peter Dimov
# Copyright 2026 Fedor Osetrov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt

cmake_minimum_required(VERSION 3.8...4.20)

project(boost_stacktrace VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)

function(stacktrace_add_library suffix opt libs defs)
function(stacktrace_add_library suffix opt public_libs libs defs)

if(NOT opt)
return()
endif()

add_library(boost_stacktrace_${suffix}
src/${suffix}.cpp
)
add_library(boost_stacktrace_${suffix})

add_library(Boost::stacktrace_${suffix} ALIAS boost_stacktrace_${suffix})

Expand All @@ -27,13 +26,21 @@ function(stacktrace_add_library suffix opt libs defs)
Boost::core
Boost::predef
Boost::winapi
${public_libs}
PRIVATE
${libs}
)

target_compile_definitions(boost_stacktrace_${suffix}
PUBLIC BOOST_STACKTRACE_NO_LIB
PRIVATE BOOST_STACKTRACE_SOURCE ${defs}
PUBLIC
BOOST_STACKTRACE_NO_LIB
PRIVATE
${defs}
)

target_sources(boost_stacktrace_${suffix}
PRIVATE
${CMAKE_CURRENT_LIST_DIR}/src/${suffix}.cpp
)

if(BUILD_SHARED_LIBS)
Expand All @@ -50,26 +57,25 @@ endfunction()

include(CheckCXXSourceCompiles)

function(stacktrace_check var source incs libs defs)
function(stacktrace_check var source incs libs)

set(CMAKE_REQUIRED_INCLUDES "${incs}")
list(APPEND CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/build")
set(CMAKE_REQUIRED_LIBRARIES "${libs}")
set(CMAKE_REQUIRED_DEFINITIONS "${defs}")
check_cxx_source_compiles("#include \"${source}\"" ${var})
set(${var} ${${var}} PARENT_SCOPE)

endfunction()

stacktrace_check(BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace" "")
stacktrace_check(BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace")

set(_default_addr2line ON)
if(WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
set(_default_addr2line OFF)
endif()

stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32" "")
stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR}/../config/include" "dbgeng;ole32" "")
stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32")
stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR}/../config/include" "dbgeng;ole32")

set(_default_from_exception ON)
if (CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
Expand Down Expand Up @@ -97,51 +103,59 @@ message(STATUS "Boost.Stacktrace: "
"from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION}"
)

stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "")
stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "backtrace;${CMAKE_DL_LIBS}" "")
stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "${CMAKE_DL_LIBS}" "")
stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "${CMAKE_DL_LIBS}" "")
stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "dbgeng;ole32" "_GNU_SOURCE=1")
stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "dbgeng;ole32" "_GNU_SOURCE=1")
if(BOOST_STACKTRACE_ENABLE_BACKTRACE OR
BOOST_STACKTRACE_ENABLE_ADDR2LINE OR
BOOST_STACKTRACE_ENABLE_BASIC OR
BOOST_STACKTRACE_ENABLE_WINDBG OR
BOOST_STACKTRACE_ENABLE_WINDBG_CACHED
)
set(_enable_non_noop_backend TRUE)
endif()

if(_enable_non_noop_backend)
stacktrace_add_library(dump ON "" "" "")
endif()
stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "")
stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "")
stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "")
stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "")
stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1")
stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1")

# boost_stacktrace, default library

add_library(boost_stacktrace INTERFACE)
add_library(Boost::stacktrace ALIAS boost_stacktrace)

target_include_directories(boost_stacktrace INTERFACE include)

if(BOOST_STACKTRACE_ENABLE_WINDBG)

target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_windbg)
add_library(Boost::stacktrace ALIAS boost_stacktrace)

if(BOOST_STACKTRACE_ENABLE_WINDBG)
set(__default_stacktrace_backend "windbg")
elseif(BOOST_STACKTRACE_ENABLE_WINDBG_CACHED)

target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_windbg)

set(__default_stacktrace_backend "windbg_cached")
elseif(BOOST_STACKTRACE_ENABLE_BACKTRACE)

target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_backtrace)

set(__default_stacktrace_backend "backtrace")
elseif(BOOST_STACKTRACE_ENABLE_ADDR2LINE)

target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_addr2line)

set(__default_stacktrace_backend "addr2line")
elseif(BOOST_STACKTRACE_ENABLE_BASIC)

target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_basic)

set(__default_stacktrace_backend "basic")
elseif(BOOST_STACKTRACE_ENABLE_NOOP)

target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_noop)

set(__default_stacktrace_backend "noop")
else()
message(FATAL "All backends are disabled")
endif()

# Boost::stacktrace_from_exception is never the default
stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "${CMAKE_DL_LIBS};boost_stacktrace" "")
message(STATUS "Boost.stacktrace default backend: ${__default_stacktrace_backend}")
target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_${__default_stacktrace_backend})

#
# Boost::stacktrace_from_exception is never the default
if(_enable_non_noop_backend)
stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "")
unset(_enable_non_noop_backend)
endif()

if(BUILD_TESTING)
add_subdirectory(test)
endif()
unset(__default_stacktrace_backend)
5 changes: 4 additions & 1 deletion build.jam
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,17 @@ project /boost/stacktrace
;

explicit
[ alias boost_stacktrace_addr2line : build//boost_stacktrace_addr2line ]
[ alias boost_stacktrace_dump : build//boost_stacktrace_dump ]
[ alias boost_stacktrace_backtrace : build//boost_stacktrace_backtrace ]
[ alias boost_stacktrace_addr2line : build//boost_stacktrace_addr2line ]
[ alias boost_stacktrace_basic : build//boost_stacktrace_basic ]
[ alias boost_stacktrace_from_exception : build//boost_stacktrace_from_exception ]
[ alias boost_stacktrace_noop : build//boost_stacktrace_noop ]
[ alias boost_stacktrace_windbg : build//boost_stacktrace_windbg ]
[ alias boost_stacktrace_windbg_cached : build//boost_stacktrace_windbg_cached ]
[ alias boost_stacktrace : boost_stacktrace_noop ]
[ alias all :
boost_stacktrace_dump
boost_stacktrace_addr2line
boost_stacktrace_backtrace
boost_stacktrace_basic
Expand All @@ -42,6 +44,7 @@ explicit

call-if : boost-library stacktrace
: install
boost_stacktrace_dump
boost_stacktrace_addr2line
boost_stacktrace_backtrace
boost_stacktrace_basic
Expand Down
23 changes: 23 additions & 0 deletions build/Jamfile.v2
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,17 @@ explicit WinDbg ;
mp-run-simple has_windbg_cached.cpp : : : <library>Dbgeng <library>ole32 : WinDbgCached ;
explicit WinDbgCached ;

lib boost_stacktrace_dump
: # sources
../src/dump.cpp
: # requirements
<warnings>all
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
: # default build
: # usage-requirements
<define>BOOST_STACKTRACE_NO_LIB=1
;

rule build-stacktrace-noop ( props * )
{
local enabled = [ property.select <boost.stacktrace.noop> : $(props) ] ;
Expand Down Expand Up @@ -108,13 +119,15 @@ lib boost_stacktrace_backtrace
: # requirements
<warnings>all
<target-os>linux:<library>dl
<library>boost_stacktrace_dump
<library>backtrace
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<conditional>@build-stacktrace-backtrace
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
<library>boost_stacktrace_dump
;

rule build-stacktrace-addr2line ( props * )
Expand Down Expand Up @@ -145,12 +158,14 @@ lib boost_stacktrace_addr2line
: # requirements
<warnings>all
<target-os>linux:<library>dl
<library>boost_stacktrace_dump
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<conditional>@build-stacktrace-addr2line
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
<library>boost_stacktrace_dump
;

rule build-stacktrace-basic ( props * )
Expand All @@ -174,12 +189,14 @@ lib boost_stacktrace_basic
: # requirements
<warnings>all
<target-os>linux:<library>dl
<library>boost_stacktrace_dump
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<conditional>@build-stacktrace-basic
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
<library>boost_stacktrace_dump
;

rule build-stacktrace-windbg ( props * )
Expand All @@ -202,13 +219,15 @@ lib boost_stacktrace_windbg
../src/windbg.cpp
: # requirements
<warnings>all
<library>boost_stacktrace_dump
<library>Dbgeng <library>ole32
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<conditional>@build-stacktrace-windbg
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
<library>boost_stacktrace_dump
;

rule build-stacktrace-windbg-cached ( props * )
Expand All @@ -231,13 +250,15 @@ lib boost_stacktrace_windbg_cached
../src/windbg_cached.cpp
: # requirements
<warnings>all
<library>boost_stacktrace_dump
<library>Dbgeng <library>ole32
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<conditional>@build-stacktrace-windbg-cached
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
<library>boost_stacktrace_dump
;

rule build-stacktrace-from-exception ( props * )
Expand All @@ -263,11 +284,13 @@ lib boost_stacktrace_from_exception
: # requirements
<warnings>all
<target-os>linux:<library>dl
<library>boost_stacktrace_dump

# Enable build when explicitly requested, or by default, when on x86
<conditional>@build-stacktrace-from-exception
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
<library>boost_stacktrace_dump
;
1 change: 0 additions & 1 deletion include/boost/stacktrace/detail/frame_decl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
# pragma once
#endif

#include <iosfwd>
#include <string>

#include <boost/stacktrace/safe_dump_to.hpp> // boost::stacktrace::detail::native_frame_ptr_t
Expand Down
4 changes: 1 addition & 3 deletions include/boost/stacktrace/frame.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
#include <iosfwd>
#include <string>

#include <boost/stacktrace/safe_dump_to.hpp> // boost::stacktrace::detail::native_frame_ptr_t

#include <boost/stacktrace/detail/frame_decl.hpp>
#include <boost/stacktrace/detail/push_options.h>

Expand Down Expand Up @@ -64,7 +62,7 @@ std::basic_ostream<CharT, TraitsT>& operator<<(std::basic_ostream<CharT, TraitsT

#include <boost/stacktrace/detail/pop_options.h>

#ifndef BOOST_STACKTRACE_LINK
#if !defined(BOOST_STACKTRACE_LINK)
# if defined(BOOST_STACKTRACE_USE_NOOP)
# include <boost/stacktrace/detail/frame_noop.ipp>
# elif defined(BOOST_MSVC) || defined(BOOST_STACKTRACE_USE_WINDBG) || defined(BOOST_STACKTRACE_USE_WINDBG_CACHED)
Expand Down
2 changes: 1 addition & 1 deletion include/boost/stacktrace/safe_dump_to.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ BOOST_FORCEINLINE std::size_t safe_dump_to(std::size_t skip, std::size_t max_dep

#include <boost/stacktrace/detail/pop_options.h>

#if !defined(BOOST_STACKTRACE_LINK) || defined(BOOST_STACKTRACE_INTERNAL_BUILD_LIBS)
#if !defined(BOOST_STACKTRACE_LINK)
# if defined(BOOST_STACKTRACE_USE_NOOP)
# include <boost/stacktrace/detail/safe_dump_noop.ipp>
# include <boost/stacktrace/detail/collect_noop.ipp>
Expand Down
2 changes: 1 addition & 1 deletion src/addr2line.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
#endif

#include <boost/stacktrace/detail/frame_unwind.ipp>
#include <boost/stacktrace/safe_dump_to.hpp>

2 changes: 1 addition & 1 deletion src/backtrace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
#endif

#include <boost/stacktrace/detail/frame_unwind.ipp>
#include <boost/stacktrace/safe_dump_to.hpp>

1 change: 0 additions & 1 deletion src/basic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,3 @@
#endif

#include <boost/stacktrace/detail/frame_unwind.ipp>
#include <boost/stacktrace/safe_dump_to.hpp>
26 changes: 26 additions & 0 deletions src/dump.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright Antony Polukhin, 2025-2026
// Copyright Fedor Osetrov, 2025-2026
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#define BOOST_STACKTRACE_LINK
#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS

#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif

#include <boost/config.hpp>

#if defined(BOOST_WINDOWS)
# include <boost/stacktrace/detail/safe_dump_win.ipp>
#else
# include <boost/stacktrace/detail/safe_dump_posix.ipp>
#endif
#if defined(BOOST_WINDOWS) && !defined(BOOST_WINAPI_IS_MINGW) // MinGW does not provide RtlCaptureStackBackTrace. MinGW-w64 does.
# include <boost/stacktrace/detail/collect_msvc.ipp>
#else
# include <boost/stacktrace/detail/collect_unwind.ipp>
#endif
Loading
Loading