diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79eec1e..5a7e5de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,10 +94,28 @@ jobs: make -j"$(nproc)" make install + - name: Run modules tests + if: ${{matrix.toolset == 'clang-19'}} + run: | + cd ../boost-root/libs/$LIBRARY + cmake -S test/cmake_subdir_test \ + -B build_module \ + -GNinja \ + -DBOOST_USE_MODULES=1 \ + -DBUILD_TESTING=1 \ + -DCMAKE_CXX_STANDARD=23 \ + -DCMAKE_CXX_COMPILER=${{matrix.compiler}} \ + -DCMAKE_CXX_FLAGS="-stdlib=libc++ -I$HOME/.local/include" \ + -DCMAKE_EXE_LINKER_FLAGS="-L$HOME/.local" \ + -DCMAKE_CXX_MODULE_STD=ON \ + -DCMAKE_EXPERIMENTAL_CXX_IMPORT_STD=0e5b6991-d74f-4b3d-a41c-cf096e0b2508 + cmake --build build_module + ctest --test-dir build_module -VV + rm -rf build_module + - name: Run modules tests without 'import std;' if: ${{matrix.toolset == 'clang-19'}} run: | - pwd cd ../boost-root/libs/$LIBRARY cmake -S test/cmake_subdir_test \ -B build_module \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 36c97e5..c753f23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,18 +7,24 @@ cmake_minimum_required(VERSION 3.8...4.20) project(boost_stacktrace VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX) -function(stacktrace_add_module name) +function(stacktrace_add_module name import_std) target_sources(${name} PUBLIC FILE_SET CXX_MODULES BASE_DIRS "${CMAKE_CURRENT_LIST_DIR}/modules" FILES "${CMAKE_CURRENT_LIST_DIR}/modules/${name}.cppm" ) - target_compile_features(${name} PUBLIC cxx_std_20) target_compile_definitions(${name} PUBLIC BOOST_USE_MODULES) + + if(${import_std}) + target_compile_features(${name} PUBLIC cxx_std_23) + target_compile_definitions(${name} PRIVATE BOOST_STACKTRACE_USE_STD_MODULE) + else() + target_compile_features(${name} PUBLIC cxx_std_20) + endif() endfunction() -function(stacktrace_add_library suffix opt public_libs libs defs add_module) +function(stacktrace_add_library suffix opt public_libs libs defs add_module import_std) if(NOT opt) return() @@ -50,7 +56,7 @@ function(stacktrace_add_library suffix opt public_libs libs defs add_module) ) if (add_module) - stacktrace_add_module(boost_stacktrace_${suffix}) + stacktrace_add_module(boost_stacktrace_${suffix} ${import_std}) else() target_sources(boost_stacktrace_${suffix} PRIVATE @@ -129,23 +135,36 @@ else() set(_enable_non_noop_backend FALSE) endif() -if(NOT BOOST_USE_MODULES) +if(BOOST_USE_MODULES) + if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 20) + endif() + if ((CMAKE_CXX_STANDARD IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) AND CMAKE_CXX_MODULE_STD) + message(STATUS "Using `import std;`") + set(__import_std ON) + else() + message(STATUS "`import std;` is not available") + set(__import_std OFF) + endif() + unset(__standard) +else() set(BOOST_USE_MODULES OFF) + set(__import_std OFF) endif() -stacktrace_add_library(dump ${_enable_non_noop_backend} "" "" "" ${BOOST_USE_MODULES}) -stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "" ${BOOST_USE_MODULES}) -stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES}) -stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES}) -stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES}) -stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES}) -stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES}) +stacktrace_add_library(dump ${_enable_non_noop_backend} "" "" "" ${BOOST_USE_MODULES} ${__import_std}) +stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "" ${BOOST_USE_MODULES} ${__import_std}) +stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES} ${__import_std}) +stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES} ${__import_std}) +stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" ${BOOST_USE_MODULES} ${__import_std}) +stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES} ${__import_std}) +stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1" ${BOOST_USE_MODULES} ${__import_std}) # boost_stacktrace, default library if(BOOST_USE_MODULES) add_library(boost_stacktrace) - stacktrace_add_module(boost_stacktrace boost_stacktrace) + stacktrace_add_module(boost_stacktrace ${__import_std}) set(__scope PUBLIC) foreach(backend noop backtrace addr2line basic windbg windbg_cached) @@ -157,6 +176,7 @@ else() add_library(boost_stacktrace INTERFACE) set(__scope INTERFACE) endif() +unset(__import_std) target_include_directories(boost_stacktrace ${__scope} "${CMAKE_CURRENT_LIST_DIR}/include") add_library(Boost::stacktrace ALIAS boost_stacktrace) @@ -182,7 +202,7 @@ target_link_libraries(boost_stacktrace ${__scope} Boost::stacktrace_${__default_ # 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}" "" FALSE) + stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "" FALSE FALSE) endif() unset(_enable_non_noop_backend) diff --git a/include/boost/stacktrace/detail/addr_base.hpp b/include/boost/stacktrace/detail/addr_base.hpp index 5df86bc..6a36c82 100644 --- a/include/boost/stacktrace/detail/addr_base.hpp +++ b/include/boost/stacktrace/detail/addr_base.hpp @@ -12,12 +12,12 @@ # pragma once #endif -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include #include #include -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) namespace boost { namespace stacktrace { namespace detail { diff --git a/include/boost/stacktrace/detail/frame_decl.hpp b/include/boost/stacktrace/detail/frame_decl.hpp index 64eaf62..bfae47a 100644 --- a/include/boost/stacktrace/detail/frame_decl.hpp +++ b/include/boost/stacktrace/detail/frame_decl.hpp @@ -15,9 +15,9 @@ # pragma once #endif -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #if !defined(BOOST_USE_MODULES) #include diff --git a/include/boost/stacktrace/detail/frame_unwind.ipp b/include/boost/stacktrace/detail/frame_unwind.ipp index 40ad842..e8ae68b 100644 --- a/include/boost/stacktrace/detail/frame_unwind.ipp +++ b/include/boost/stacktrace/detail/frame_unwind.ipp @@ -15,7 +15,9 @@ #if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include +#endif // !defined(BOOST_STACKTRACE_USE_STD_MODULE) #endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) #include diff --git a/include/boost/stacktrace/detail/to_dec_array.hpp b/include/boost/stacktrace/detail/to_dec_array.hpp index fdba1ba..845b851 100644 --- a/include/boost/stacktrace/detail/to_dec_array.hpp +++ b/include/boost/stacktrace/detail/to_dec_array.hpp @@ -12,10 +12,10 @@ # pragma once #endif -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include // std::size_t -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) namespace boost { namespace stacktrace { namespace detail { diff --git a/include/boost/stacktrace/detail/to_hex_array.hpp b/include/boost/stacktrace/detail/to_hex_array.hpp index 98c54e6..e707377 100644 --- a/include/boost/stacktrace/detail/to_hex_array.hpp +++ b/include/boost/stacktrace/detail/to_hex_array.hpp @@ -12,10 +12,10 @@ # pragma once #endif -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) namespace boost { namespace stacktrace { namespace detail { diff --git a/include/boost/stacktrace/detail/void_ptr_cast.hpp b/include/boost/stacktrace/detail/void_ptr_cast.hpp index 9e83e9b..4cece51 100644 --- a/include/boost/stacktrace/detail/void_ptr_cast.hpp +++ b/include/boost/stacktrace/detail/void_ptr_cast.hpp @@ -13,9 +13,9 @@ # pragma once #endif -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #if defined(__GNUC__) && defined(__GNUC_MINOR__) && (__GNUC__ * 100 + __GNUC_MINOR__ > 301) # pragma GCC system_header diff --git a/include/boost/stacktrace/frame.hpp b/include/boost/stacktrace/frame.hpp index 734eed8..78b7895 100644 --- a/include/boost/stacktrace/frame.hpp +++ b/include/boost/stacktrace/frame.hpp @@ -15,10 +15,10 @@ # pragma once #endif -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include diff --git a/include/boost/stacktrace/safe_dump_to.hpp b/include/boost/stacktrace/safe_dump_to.hpp index 42c2823..2947c85 100644 --- a/include/boost/stacktrace/safe_dump_to.hpp +++ b/include/boost/stacktrace/safe_dump_to.hpp @@ -20,7 +20,10 @@ #endif #if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) + +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include +#endif // !defined(BOOST_STACKTRACE_USE_STD_MODULE) #if defined(BOOST_WINDOWS) #include diff --git a/include/boost/stacktrace/stacktrace.hpp b/include/boost/stacktrace/stacktrace.hpp index 6070a40..2215f23 100644 --- a/include/boost/stacktrace/stacktrace.hpp +++ b/include/boost/stacktrace/stacktrace.hpp @@ -19,6 +19,7 @@ #include #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include #include @@ -26,6 +27,7 @@ #ifndef BOOST_NO_CXX11_HDR_TYPE_TRAITS # include #endif +#endif // !defined(BOOST_STACKTRACE_USE_STD_MODULE) #endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) #include diff --git a/include/boost/stacktrace/stacktrace_fwd.hpp b/include/boost/stacktrace/stacktrace_fwd.hpp index 764591b..5741e07 100644 --- a/include/boost/stacktrace/stacktrace_fwd.hpp +++ b/include/boost/stacktrace/stacktrace_fwd.hpp @@ -11,10 +11,10 @@ #if !defined(BOOST_USE_MODULES) || defined(BOOST_STACKTRACE_INTERFACE_UNIT) -#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include -#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) +#endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) /// @file stacktrace_fwd.hpp This header contains only forward declarations of /// boost::stacktrace::frame, boost::stacktrace::basic_stacktrace, boost::stacktrace::stacktrace diff --git a/modules/boost_stacktrace_addr2line.cppm b/modules/boost_stacktrace_addr2line.cppm index c331c9c..b8dee27 100644 --- a/modules/boost_stacktrace_addr2line.cppm +++ b/modules/boost_stacktrace_addr2line.cppm @@ -18,10 +18,12 @@ module; #include #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include #include #include +#endif #include #include @@ -34,6 +36,10 @@ module; export module boost.stacktrace.addr2line; +#if defined(BOOST_STACKTRACE_USE_STD_MODULE) +import std; +#endif + import boost.stacktrace.dump; #ifdef __clang__ diff --git a/modules/boost_stacktrace_backtrace.cppm b/modules/boost_stacktrace_backtrace.cppm index ae95d56..9860c20 100644 --- a/modules/boost_stacktrace_backtrace.cppm +++ b/modules/boost_stacktrace_backtrace.cppm @@ -20,10 +20,12 @@ module; #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include #include #include +#endif #include @@ -32,6 +34,10 @@ module; export module boost.stacktrace.backtrace; +#if defined(BOOST_STACKTRACE_USE_STD_MODULE) +import std; +#endif + import boost.stacktrace.dump; #ifdef __clang__ diff --git a/modules/boost_stacktrace_basic.cppm b/modules/boost_stacktrace_basic.cppm index ae3a22e..15985c9 100644 --- a/modules/boost_stacktrace_basic.cppm +++ b/modules/boost_stacktrace_basic.cppm @@ -18,10 +18,12 @@ module; #include #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include #include #include +#endif #include @@ -30,6 +32,10 @@ module; export module boost.stacktrace.basic; +#if defined(BOOST_STACKTRACE_USE_STD_MODULE) +import std; +#endif + import boost.stacktrace.dump; #ifdef __clang__ diff --git a/modules/boost_stacktrace_dump.cppm b/modules/boost_stacktrace_dump.cppm index b976276..b1fb6d8 100644 --- a/modules/boost_stacktrace_dump.cppm +++ b/modules/boost_stacktrace_dump.cppm @@ -14,9 +14,12 @@ module; #include #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) +#include +#endif + #include #include -#include #include #define BOOST_STACKTRACE_INTERFACE_UNIT @@ -24,6 +27,10 @@ module; export module boost.stacktrace.dump; +#if defined(BOOST_STACKTRACE_USE_STD_MODULE) +import std; +#endif + #ifdef __clang__ # pragma clang diagnostic ignored "-Winclude-angled-in-module-purview" #endif diff --git a/modules/boost_stacktrace_noop.cppm b/modules/boost_stacktrace_noop.cppm index 80ef6f0..789fe4b 100644 --- a/modules/boost_stacktrace_noop.cppm +++ b/modules/boost_stacktrace_noop.cppm @@ -11,14 +11,20 @@ module; #include #include +#if !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include +#endif #define BOOST_STACKTRACE_INTERFACE_UNIT #define BOOST_STACKTRACE_LINK export module boost.stacktrace.noop; +#if defined(BOOST_STACKTRACE_USE_STD_MODULE) +import std; +#endif + #ifdef __clang__ # pragma clang diagnostic ignored "-Winclude-angled-in-module-purview" #endif diff --git a/modules/samples/usage_sample_from_exception.cpp b/modules/samples/usage_sample_from_exception.cpp index 5cac1f2..832e879 100644 --- a/modules/samples/usage_sample_from_exception.cpp +++ b/modules/samples/usage_sample_from_exception.cpp @@ -6,7 +6,7 @@ // http://www.boost.org/LICENSE_1_0.txt) #include -#include +#include #include @@ -15,7 +15,8 @@ namespace { BOOST_NOINLINE void foo() { - throw std::logic_error{"Foo"}; + std::map m; + std::ignore = m.at(1); } BOOST_NOINLINE void bar() {