Skip to content

Commit e93f50d

Browse files
fdr400Fedor Osetrov
andauthored
feat boost.stacktrace: support import std (#231)
Support build with `import std;`. Add Github CI pipeline --------- Co-authored-by: Fedor Osetrov <fdr400@Fedors-MacBook-Pro.local>
1 parent f966b6a commit e93f50d

18 files changed

Lines changed: 109 additions & 32 deletions

.github/workflows/ci.yml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,28 @@ jobs:
9494
make -j"$(nproc)"
9595
make install
9696
97+
- name: Run modules tests
98+
if: ${{matrix.toolset == 'clang-19'}}
99+
run: |
100+
cd ../boost-root/libs/$LIBRARY
101+
cmake -S test/cmake_subdir_test \
102+
-B build_module \
103+
-GNinja \
104+
-DBOOST_USE_MODULES=1 \
105+
-DBUILD_TESTING=1 \
106+
-DCMAKE_CXX_STANDARD=23 \
107+
-DCMAKE_CXX_COMPILER=${{matrix.compiler}} \
108+
-DCMAKE_CXX_FLAGS="-stdlib=libc++ -I$HOME/.local/include" \
109+
-DCMAKE_EXE_LINKER_FLAGS="-L$HOME/.local" \
110+
-DCMAKE_CXX_MODULE_STD=ON \
111+
-DCMAKE_EXPERIMENTAL_CXX_IMPORT_STD=0e5b6991-d74f-4b3d-a41c-cf096e0b2508
112+
cmake --build build_module
113+
ctest --test-dir build_module -VV
114+
rm -rf build_module
115+
97116
- name: Run modules tests without 'import std;'
98117
if: ${{matrix.toolset == 'clang-19'}}
99118
run: |
100-
pwd
101119
cd ../boost-root/libs/$LIBRARY
102120
cmake -S test/cmake_subdir_test \
103121
-B build_module \

CMakeLists.txt

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,24 @@ cmake_minimum_required(VERSION 3.8...4.20)
77

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

10-
function(stacktrace_add_module name)
10+
function(stacktrace_add_module name import_std)
1111
target_sources(${name}
1212
PUBLIC
1313
FILE_SET CXX_MODULES
1414
BASE_DIRS "${CMAKE_CURRENT_LIST_DIR}/modules"
1515
FILES "${CMAKE_CURRENT_LIST_DIR}/modules/${name}.cppm"
1616
)
17-
target_compile_features(${name} PUBLIC cxx_std_20)
1817
target_compile_definitions(${name} PUBLIC BOOST_USE_MODULES)
18+
19+
if(${import_std})
20+
target_compile_features(${name} PUBLIC cxx_std_23)
21+
target_compile_definitions(${name} PRIVATE BOOST_STACKTRACE_USE_STD_MODULE)
22+
else()
23+
target_compile_features(${name} PUBLIC cxx_std_20)
24+
endif()
1925
endfunction()
2026

21-
function(stacktrace_add_library suffix opt public_libs libs defs add_module)
27+
function(stacktrace_add_library suffix opt public_libs libs defs add_module import_std)
2228

2329
if(NOT opt)
2430
return()
@@ -50,7 +56,7 @@ function(stacktrace_add_library suffix opt public_libs libs defs add_module)
5056
)
5157

5258
if (add_module)
53-
stacktrace_add_module(boost_stacktrace_${suffix})
59+
stacktrace_add_module(boost_stacktrace_${suffix} ${import_std})
5460
else()
5561
target_sources(boost_stacktrace_${suffix}
5662
PRIVATE
@@ -129,23 +135,36 @@ else()
129135
set(_enable_non_noop_backend FALSE)
130136
endif()
131137

132-
if(NOT BOOST_USE_MODULES)
138+
if(BOOST_USE_MODULES)
139+
if(NOT CMAKE_CXX_STANDARD)
140+
set(CMAKE_CXX_STANDARD 20)
141+
endif()
142+
if ((CMAKE_CXX_STANDARD IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) AND CMAKE_CXX_MODULE_STD)
143+
message(STATUS "Using `import std;`")
144+
set(__import_std ON)
145+
else()
146+
message(STATUS "`import std;` is not available")
147+
set(__import_std OFF)
148+
endif()
149+
unset(__standard)
150+
else()
133151
set(BOOST_USE_MODULES OFF)
152+
set(__import_std OFF)
134153
endif()
135154

136-
stacktrace_add_library(dump ${_enable_non_noop_backend} "" "" "" ${BOOST_USE_MODULES})
137-
stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "" ${BOOST_USE_MODULES})
138-
stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES})
139-
stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES})
140-
stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES})
141-
stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES})
142-
stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES})
155+
stacktrace_add_library(dump ${_enable_non_noop_backend} "" "" "" ${BOOST_USE_MODULES} ${__import_std})
156+
stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "" ${BOOST_USE_MODULES} ${__import_std})
157+
stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES} ${__import_std})
158+
stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES} ${__import_std})
159+
stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES} ${__import_std})
160+
stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES} ${__import_std})
161+
stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES} ${__import_std})
143162

144163
# boost_stacktrace, default library
145164

146165
if(BOOST_USE_MODULES)
147166
add_library(boost_stacktrace)
148-
stacktrace_add_module(boost_stacktrace boost_stacktrace)
167+
stacktrace_add_module(boost_stacktrace ${__import_std})
149168
set(__scope PUBLIC)
150169

151170
foreach(backend noop backtrace addr2line basic windbg windbg_cached)
@@ -157,6 +176,7 @@ else()
157176
add_library(boost_stacktrace INTERFACE)
158177
set(__scope INTERFACE)
159178
endif()
179+
unset(__import_std)
160180

161181
target_include_directories(boost_stacktrace ${__scope} "${CMAKE_CURRENT_LIST_DIR}/include")
162182
add_library(Boost::stacktrace ALIAS boost_stacktrace)
@@ -182,7 +202,7 @@ target_link_libraries(boost_stacktrace ${__scope} Boost::stacktrace_${__default_
182202

183203
# Boost::stacktrace_from_exception is never the default
184204
if(_enable_non_noop_backend)
185-
stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" FALSE)
205+
stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" FALSE FALSE)
186206
endif()
187207
unset(_enable_non_noop_backend)
188208

include/boost/stacktrace/detail/addr_base.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
# pragma once
1313
#endif
1414

15-
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
15+
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1616
#include <fstream>
1717
#include <sstream>
1818
#include <cstdint>
1919
#include <cstdlib>
20-
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
20+
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
2121

2222
namespace boost { namespace stacktrace { namespace detail {
2323

include/boost/stacktrace/detail/frame_decl.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
# pragma once
1616
#endif
1717

18-
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
18+
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1919
#include <string>
20-
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
20+
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
2121

2222
#if !defined(BOOST_USE_MODULES)
2323
#include <boost/stacktrace/safe_dump_to.hpp>

include/boost/stacktrace/detail/frame_unwind.ipp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
1616
#include <boost/core/demangle.hpp>
1717

18+
#if !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1819
#include <cstdio>
20+
#endif // !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1921
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
2022

2123
#include <boost/stacktrace/frame.hpp>

include/boost/stacktrace/detail/to_dec_array.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
# pragma once
1313
#endif
1414

15-
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
15+
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1616
#include <array>
1717
#include <cstddef> // std::size_t
18-
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
18+
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1919

2020
namespace boost { namespace stacktrace { namespace detail {
2121

include/boost/stacktrace/detail/to_hex_array.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
# pragma once
1313
#endif
1414

15-
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
15+
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1616
#include <array>
1717
#include <type_traits>
18-
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
18+
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1919

2020
namespace boost { namespace stacktrace { namespace detail {
2121

include/boost/stacktrace/detail/void_ptr_cast.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
# pragma once
1414
#endif
1515

16-
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
16+
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1717
#include <type_traits>
18-
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
18+
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1919

2020
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && (__GNUC__ * 100 + __GNUC_MINOR__ > 301)
2121
# pragma GCC system_header

include/boost/stacktrace/frame.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
# pragma once
1616
#endif
1717

18-
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
18+
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
1919
#include <iosfwd>
2020
#include <string>
21-
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
21+
#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE)
2222

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

include/boost/stacktrace/safe_dump_to.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
#endif
2121

2222
#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT)
23+
24+
#if !defined(BOOST_STACKTRACE_USE_STD_MODULE)
2325
#include <cstddef>
26+
#endif // !defined(BOOST_STACKTRACE_USE_STD_MODULE)
2427

2528
#if defined(BOOST_WINDOWS)
2629
#include <boost/winapi/config.hpp>

0 commit comments

Comments
 (0)