diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index 7fb905b..d0970a2 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -4,7 +4,12 @@ # Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) # -project boost/stacktrace ; + +project + : source-location . + : requirements + linux:"-fvisibility=hidden" + ; lib dl : : shared ; lib unwind : : shared ; @@ -38,9 +43,10 @@ lib boost_stacktrace_noop ../src/noop.cpp : # requirements all + shared:BOOST_STACKTRACE_DYN_LINK=1 : # default build : # usage-requirements - shared:BOOST_TEST_DYN_LINK=1 + #shared:BOOST_STACKTRACE_DYN_LINK=1 ; boost-install boost_stacktrace_noop ; @@ -51,10 +57,11 @@ lib boost_stacktrace_libunwind : # requirements all unwind + shared:BOOST_STACKTRACE_DYN_LINK=1 [ check-target-builds ../build//libunwind : : no ] : # default build : # usage-requirements - shared:BOOST_TEST_DYN_LINK=1 + #shared:BOOST_STACKTRACE_DYN_LINK=1 ; boost-install boost_stacktrace_libunwind ; @@ -64,11 +71,12 @@ lib boost_stacktrace_backtrace ../src/backtrace.cpp : # requirements all - dl + linux:dl + shared:BOOST_STACKTRACE_DYN_LINK=1 [ check-target-builds ../build//backtrace : : no ] : # default build : # usage-requirements - shared:BOOST_TEST_DYN_LINK=1 + #shared:BOOST_STACKTRACE_DYN_LINK=1 ; boost-install boost_stacktrace_backtrace ; @@ -79,10 +87,11 @@ lib boost_stacktrace_windbg : # requirements all Dbghelp + shared:BOOST_STACKTRACE_DYN_LINK=1 [ check-target-builds ../build//WinDbg : : no ] : # default build : # usage-requirements - shared:BOOST_TEST_DYN_LINK=1 + #shared:BOOST_STACKTRACE_DYN_LINK=1 ; boost-install boost_stacktrace_windbg ; diff --git a/include/boost/stacktrace.hpp b/include/boost/stacktrace.hpp index a6b8f82..8262388 100644 --- a/include/boost/stacktrace.hpp +++ b/include/boost/stacktrace.hpp @@ -17,12 +17,22 @@ #include /// @cond -#if defined(BOOST_STACKTRACE_HEADER_ONLY) -# define BOOST_STACKTRACE_FUNCTION inline -#elif defined(BOOST_STACKTRACE_INTERNAL_BUILD_LIBS) -# define BOOST_STACKTRACE_FUNCTION BOOST_SYMBOL_EXPORT +#if !defined(BOOST_STACKTRACE_LINK) && defined(BOOST_STACKTRACE_DYN_LINK) +# define BOOST_STACKTRACE_LINK +#endif + +#ifdef BOOST_STACKTRACE_LINK +# if defined(BOOST_STACKTRACE_DYN_LINK) || defined(BOOST_ALL_DYN_LINK) +# ifdef BOOST_STACKTRACE_INTERNAL_BUILD_LIBS +# define BOOST_STACKTRACE_FUNCTION BOOST_SYMBOL_EXPORT +# else +# define BOOST_STACKTRACE_FUNCTION BOOST_SYMBOL_IMPORT +# endif +# else +# define BOOST_STACKTRACE_FUNCTION +# endif #else -# define BOOST_STACKTRACE_FUNCTION BOOST_SYMBOL_IMPORT +# define BOOST_STACKTRACE_FUNCTION inline #endif /// @endcond @@ -90,7 +100,7 @@ std::basic_ostream& operator<<(std::basic_ostream #endif /// @endcond diff --git a/include/boost/stacktrace/detail/stacktrace.ipp b/include/boost/stacktrace/detail/stacktrace.ipp index 9d58635..7798d66 100644 --- a/include/boost/stacktrace/detail/stacktrace.ipp +++ b/include/boost/stacktrace/detail/stacktrace.ipp @@ -15,24 +15,45 @@ #include #include -#if defined(BOOST_STACKTRACE_USE_NOOP) +// Autodetection +#if !defined(BOOST_STACKTRACE_USE_NOOP) && !defined(BOOST_STACKTRACE_USE_WINDBG) && !defined(BOOST_STACKTRACE_USE_LIBUNWIND) \ + && !defined(BOOST_STACKTRACE_USE_BACKTRACE) &&!defined(BOOST_STACKTRACE_USE_HEADER) + +#if defined(__has_include) && (!defined(__GNUC__) || __GNUC__ > 4 || BOOST_CLANG) +# if __has_include() +# define BOOST_STACKTRACE_USE_LIBUNWIND +# elif __has_include() +# define BOOST_STACKTRACE_USE_BACKTRACE +# elif __has_include("DbgHelp.h") +# define BOOST_STACKTRACE_USE_WINDBG +# endif +#else +# if defined(BOOST_WINDOWS) +# define BOOST_STACKTRACE_USE_WINDBG +# else +# define BOOST_STACKTRACE_USE_BACKTRACE +# endif +#endif + +#endif + + +#if defined(BOOST_STACKTRACE_USE_HEADER) +# include BOOST_STACKTRACE_USE_HEADER +#elif defined(BOOST_STACKTRACE_USE_NOOP) # include -#elif defined(BOOST_WINDOWS) || defined(BOOST_STACKTRACE_USE_WINDBG) +#elif defined(BOOST_STACKTRACE_USE_WINDBG) # include #elif defined(BOOST_STACKTRACE_USE_LIBUNWIND) # include #elif defined(BOOST_STACKTRACE_USE_BACKTRACE) # include -#elif defined(__has_include) && (!defined(__GNUC__) || __GNUC__ > 4) -# if __has_include() -# include -# elif __has_include() -# include -# endif #else # error No suitable backtrace backend found #endif + + namespace boost { namespace stacktrace { namespace detail { diff --git a/src/backtrace.cpp b/src/backtrace.cpp index b4d6d60..0b80a61 100644 --- a/src/backtrace.cpp +++ b/src/backtrace.cpp @@ -6,4 +6,5 @@ #define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS #define BOOST_STACKTRACE_USE_BACKTRACE +#define BOOST_STACKTRACE_LINK #include diff --git a/src/libunwind.cpp b/src/libunwind.cpp index 94974f8..6d0d118 100644 --- a/src/libunwind.cpp +++ b/src/libunwind.cpp @@ -6,4 +6,5 @@ #define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS #define BOOST_STACKTRACE_USE_LIBUNWIND +#define BOOST_STACKTRACE_LINK #include diff --git a/src/noop.cpp b/src/noop.cpp index 10a5c88..42a432b 100644 --- a/src/noop.cpp +++ b/src/noop.cpp @@ -6,4 +6,5 @@ #define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS #define BOOST_STACKTRACE_USE_NOOP +#define BOOST_STACKTRACE_LINK #include diff --git a/src/windbg.cpp b/src/windbg.cpp index 75f020f..e165cae 100644 --- a/src/windbg.cpp +++ b/src/windbg.cpp @@ -6,4 +6,5 @@ #define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS #define BOOST_STACKTRACE_USE_WINDBG +#define BOOST_STACKTRACE_LINK #include diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 63b59e6..b3ef284 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -15,33 +15,36 @@ project all on always_show_run_output + linux:"-fvisibility=hidden" ; -lib test_unwind_lib : test_impl.cpp : shared : : /boost/stacktrace//boost_stacktrace_libunwind [ check-target-builds ../build//libunwind : : no ] ; -lib test_backtrace_lib : test_impl.cpp : shared : : /boost/stacktrace//boost_stacktrace_backtrace [ check-target-builds ../build//backtrace : : no ] ; -lib test_windbg_lib : test_impl.cpp : shared : : /boost/stacktrace//boost_stacktrace_windbg [ check-target-builds ../build//WinDbg : : no ] ; -lib test_noop_lib : test_impl.cpp : shared : : /boost/stacktrace//boost_stacktrace_noop ; +lib test_impl_lib : test_impl.cpp : BOOST_STACKTRACE_DYN_LINK shared ; -local HONLY_UNW = BOOST_STACKTRACE_HEADER_ONLY BOOST_STACKTRACE_USE_LIBUNWIND unwind [ check-target-builds ../build//libunwind : : no ] ; -local HONLY_BT = BOOST_STACKTRACE_HEADER_ONLY BOOST_STACKTRACE_USE_BACKTRACE dl [ check-target-builds ../build//backtrace : : no ] ; -local HONLY_WIND = BOOST_STACKTRACE_HEADER_ONLY BOOST_STACKTRACE_USE_WINDBG Dbghelp [ check-target-builds ../build//WinDbg : : no ] ; -local HONLY_NOOP = BOOST_STACKTRACE_HEADER_ONLY BOOST_STACKTRACE_USE_NOOP ; +local HONLY_UNW = BOOST_STACKTRACE_USE_LIBUNWIND unwind [ check-target-builds ../build//libunwind : : no ] ; +local HONLY_BT = BOOST_STACKTRACE_USE_BACKTRACE linux:dl [ check-target-builds ../build//backtrace : : no ] ; +local HONLY_WIND = BOOST_STACKTRACE_USE_WINDBG Dbghelp [ check-target-builds ../build//WinDbg : : no ] ; +local HONLY_AUTO = linux:dl windows:Dbghelp [ check-target-builds ../build//libunwind : unwind ] ; +local HONLY_NOOP = BOOST_STACKTRACE_USE_NOOP ; +local LINKST = shared BOOST_STACKTRACE_DYN_LINK .//test_impl_lib ; -test-suite stacktrace +test-suite stacktrace_tests : - [ run test.cpp test_impl.cpp : : : $(HONLY_UNW) : libunwind_ho ] - [ run test.cpp test_impl.cpp : : : $(HONLY_BT) : backtrace_ho ] - [ run test.cpp test_impl.cpp : : : $(HONLY_WIND) : windbg_ho ] - [ run test_noop.cpp test_impl.cpp : : : $(HONLY_NOOP) : noop_ho ] + [ run test.cpp test_impl.cpp : : : $(HONLY_UNW) : libunwind_ho ] + [ run test.cpp test_impl.cpp : : : $(HONLY_BT) : backtrace_ho ] + [ run test.cpp test_impl.cpp : : : $(HONLY_WIND) : windbg_ho ] + [ run test.cpp test_impl.cpp : : : $(HONLY_AUTO) : autodetect_ho ] + [ run test_noop.cpp test_impl.cpp : : : $(HONLY_NOOP) : noop_ho ] - [ run test.cpp : : : .//test_unwind_lib [ check-target-builds ../build//libunwind : : no ] : libunwind_lib ] - [ run test.cpp : : : .//test_backtrace_lib [ check-target-builds ../build//backtrace : : no ] : backtrace_lib ] - [ run test.cpp : : : .//test_windbg_lib [ check-target-builds ../build//WinDbg : : no ] : windbg_lib ] - [ run test_noop.cpp : : : .//test_noop_lib : noop_lib ] + [ run test.cpp : : : $(LINKST) /boost/stacktrace//boost_stacktrace_libunwind [ check-target-builds ../build//libunwind : : no ] : libunwind_lib ] + [ run test.cpp : : : $(LINKST) /boost/stacktrace//boost_stacktrace_backtrace [ check-target-builds ../build//backtrace : : no ] : backtrace_lib ] + [ run test.cpp : : : $(LINKST) /boost/stacktrace//boost_stacktrace_windbg [ check-target-builds ../build//WinDbg : : no ] : windbg_lib ] + [ run test_noop.cpp : : : $(LINKST) /boost/stacktrace//boost_stacktrace_noop : noop_lib ] [ run ../example/getting_started.cpp : : : $(HONLY_UNW) : libunwind_getting_started ] [ run ../example/getting_started.cpp : : : $(HONLY_BT) : backtrace_getting_started ] [ run ../example/getting_started.cpp : : : $(HONLY_WIND) : windbg_getting_started ] + [ run ../example/getting_started.cpp : : : $(HONLY_AUTO) : auto_getting_started ] + [ run ../example/getting_started.cpp : : : $(HONLY_NOOP) : noop_getting_started ] ; diff --git a/test/test.cpp b/test/test.cpp index 8c4ffbe..68f48e2 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -22,7 +22,7 @@ void test_deeply_nested_namespaces() { std::cout << ss.str() << '\n'; BOOST_TEST(ss.str().find("main") != std::string::npos); -#if !defined(BOOST_STACKTRACE_HEADER_ONLY) || !defined(BOOST_STACKTRACE_USE_BACKTRACE) +#if defined(BOOST_STACKTRACE_LINK) || !defined(BOOST_STACKTRACE_USE_BACKTRACE) BOOST_TEST(ss.str().find("get_backtrace_from_nested_namespaces") != std::string::npos); #endif } @@ -46,7 +46,7 @@ void test_nested() { BOOST_TEST(ss1.str().find("main") != std::string::npos); BOOST_TEST(ss2.str().find("main") != std::string::npos); -#if !defined(BOOST_STACKTRACE_HEADER_ONLY) || !defined(BOOST_STACKTRACE_USE_BACKTRACE) +#if defined(BOOST_STACKTRACE_LINK) || !defined(BOOST_STACKTRACE_USE_BACKTRACE) BOOST_TEST(ss1.str().find("foo1") != std::string::npos); BOOST_TEST(ss1.str().find("foo2") != std::string::npos); BOOST_TEST(ss2.str().find("foo1") != std::string::npos); diff --git a/test/test_impl.cpp b/test/test_impl.cpp index 9919d3a..944b098 100644 --- a/test/test_impl.cpp +++ b/test/test_impl.cpp @@ -20,7 +20,7 @@ std::pair foo1(int i) { std::pair ret; try { throw std::logic_error("test"); - } catch (const std::logic_error& e) { + } catch (const std::logic_error& /*e*/) { ret.second = stacktrace(); return ret; }