From 5913812bb6d382fa2c8e124f1a9aca9009221fe8 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Wed, 21 May 2025 17:24:13 +0200 Subject: [PATCH 1/9] Import backwards version 1.6 Signed-off-by: Jose Luis Rivero --- .../backward-cpp/BackwardConfig.cmake | 85 ++++------ .../backward-cpp/CMakeLists.txt | 123 ++++++++------- .../backward_vendor/backward-cpp/backward.hpp | 146 ++++++------------ 3 files changed, 143 insertions(+), 211 deletions(-) diff --git a/test/backward_vendor/backward-cpp/BackwardConfig.cmake b/test/backward_vendor/backward-cpp/BackwardConfig.cmake index 353cdc5dc4..a982adcd64 100644 --- a/test/backward_vendor/backward-cpp/BackwardConfig.cmake +++ b/test/backward_vendor/backward-cpp/BackwardConfig.cmake @@ -43,6 +43,12 @@ set(STACK_DETAILS_BFD FALSE CACHE BOOL set(STACK_DETAILS_DWARF FALSE CACHE BOOL "Use libdwarf/libelf to read debug info") +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT DEFINED BACKWARD_TESTS) + # If this is a top level CMake project, we most lixely want the tests + set(BACKWARD_TESTS ON CACHE BOOL "Enable tests") +else() + set(BACKWARD_TESTS OFF CACHE BOOL "Enable tests") +endif() ############################################################################### # CONFIGS ############################################################################### @@ -73,7 +79,7 @@ if (STACK_WALKING_LIBUNWIND) # Disable other unwinders if libunwind is found set(STACK_WALKING_UNWIND FALSE) - set(STACK_WALKING_BACKTRACE FALSE) + set(STACK_WALKING_BACKTRACE FALSE) endif() if (${STACK_DETAILS_AUTO_DETECT}) @@ -83,21 +89,8 @@ if (${STACK_DETAILS_AUTO_DETECT}) # find libdw find_path(LIBDW_INCLUDE_DIR NAMES "elfutils/libdw.h" "elfutils/libdwfl.h") find_library(LIBDW_LIBRARY dw) - # in case it's statically linked, look for all the possible dependencies - find_library(LIBELF_LIBRARY elf) - find_library(LIBPTHREAD_LIBRARY pthread) - find_library(LIBZ_LIBRARY z) - find_library(LIBBZ2_LIBRARY bz2) - find_library(LIBLZMA_LIBRARY lzma) - find_library(LIBZSTD_LIBRARY zstd) set(LIBDW_INCLUDE_DIRS ${LIBDW_INCLUDE_DIR} ) - set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} - $<$:${LIBELF_LIBRARY}> - $<$:${LIBPTHREAD_LIBRARY}> - $<$:${LIBZ_LIBRARY}> - $<$:${LIBBZ2_LIBRARY}> - $<$:${LIBLZMA_LIBRARY}> - $<$:${LIBZSTD_LIBRARY}>) + set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} ) find_package_handle_standard_args(libdw ${_name_mismatched_arg} REQUIRED_VARS LIBDW_LIBRARY LIBDW_INCLUDE_DIR) mark_as_advanced(LIBDW_INCLUDE_DIR LIBDW_LIBRARY) @@ -146,11 +139,6 @@ if (${STACK_DETAILS_AUTO_DETECT}) # If we attempt to link against static bfd, make sure to link its dependencies, too get_filename_component(bfd_lib_ext "${LIBBFD_LIBRARY}" EXT) if (bfd_lib_ext STREQUAL "${CMAKE_STATIC_LIBRARY_SUFFIX}") - find_library(LIBSFRAME_LIBRARY NAMES sframe) - if (LIBSFRAME_LIBRARY) - list(APPEND _BACKWARD_LIBRARIES ${LIBSFRAME_LIBRARY}) - endif() - list(APPEND _BACKWARD_LIBRARIES iberty z) endif() @@ -202,24 +190,14 @@ if (NOT _BACKWARD_DEFINITIONS) endif() if(WIN32) - list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) + list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) if(MINGW) - include(CheckCXXCompilerFlag) - check_cxx_compiler_flag(-gcodeview SUPPORT_WINDOWS_DEBUG_INFO) - if(SUPPORT_WINDOWS_DEBUG_INFO) - set(CMAKE_EXE_LINKER_FLAGS "-Wl,--pdb= ") - add_compile_options(-gcodeview) - else() - set(MINGW_MSVCR_LIBRARY "msvcr90$<$:d>" CACHE STRING "Mingw MSVC runtime import library") - list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) - endif() + set(MINGW_MSVCR_LIBRARY "msvcr90$<$:d>" CACHE STRING "Mingw MSVC runtime import library") + list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) endif() endif() -set(BACKWARD_INCLUDE_DIR - $ - $ -) +set(BACKWARD_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}") set(BACKWARD_HAS_EXTERNAL_LIBRARIES FALSE) set(FIND_PACKAGE_REQUIRED_VARS BACKWARD_INCLUDE_DIR) @@ -230,25 +208,17 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Backward - REQUIRED_VARS ${FIND_PACKAGE_REQUIRED_VARS} + REQUIRED_VARS ${FIND_PACKAGE_REQUIRED_VARS} ) list(APPEND _BACKWARD_INCLUDE_DIRS ${BACKWARD_INCLUDE_DIR}) -# add_backward, optional bool argument; if passed and true, backward will be included as a system header macro(add_backward target) - message(DEPRECATION "The add_backward() macro is deprecated, use target_link_libraries() to link to " - "one of the exported targets: Backward::Interface, Backward::Object, or Backward::Backward." - ) - if ("${ARGN}") - target_include_directories(${target} SYSTEM PRIVATE ${BACKWARD_INCLUDE_DIRS}) - else() - target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) - endif() + target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${BACKWARD_DEFINITIONS}) set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES ${BACKWARD_LIBRARIES}) endmacro() -set(BACKWARD_INCLUDE_DIRS ${_BACKWARD_INCLUDE_DIRS} CACHE INTERNAL "BACKWARD_INCLUDE_DIRS") +set(BACKWARD_INCLUDE_DIRS ${_BACKWARD_INCLUDE_DIRS} CACHE INTERNAL "_BACKWARD_INCLUDE_DIRS") set(BACKWARD_DEFINITIONS ${_BACKWARD_DEFINITIONS} CACHE INTERNAL "BACKWARD_DEFINITIONS") set(BACKWARD_LIBRARIES ${_BACKWARD_LIBRARIES} CACHE INTERNAL "BACKWARD_LIBRARIES") mark_as_advanced(BACKWARD_INCLUDE_DIRS BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) @@ -256,15 +226,22 @@ mark_as_advanced(BACKWARD_INCLUDE_DIRS BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) # Expand each definition in BACKWARD_DEFINITIONS to its own cmake var and export # to outer scope foreach(var ${BACKWARD_DEFINITIONS}) - string(REPLACE "=" ";" var_as_list ${var}) - list(GET var_as_list 0 var_name) - list(GET var_as_list 1 var_value) - set(${var_name} ${var_value}) - mark_as_advanced(${var_name}) + string(REPLACE "=" ";" var_as_list ${var}) + list(GET var_as_list 0 var_name) + list(GET var_as_list 1 var_value) + set(${var_name} ${var_value}) + mark_as_advanced(${var_name}) endforeach() -# if this file is used from the install tree by find_package(), include the -# file CMake-generated file where the targets are defined -if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/BackwardTargets.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/BackwardTargets.cmake) +if (NOT TARGET Backward::Backward) + add_library(Backward::Backward INTERFACE IMPORTED) + set_target_properties(Backward::Backward PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${BACKWARD_INCLUDE_DIRS}" + INTERFACE_COMPILE_DEFINITIONS "${BACKWARD_DEFINITIONS}" + ) + if(BACKWARD_HAS_EXTERNAL_LIBRARIES) + set_target_properties(Backward::Backward PROPERTIES + INTERFACE_LINK_LIBRARIES "${BACKWARD_LIBRARIES}" + ) + endif() endif() diff --git a/test/backward_vendor/backward-cpp/CMakeLists.txt b/test/backward_vendor/backward-cpp/CMakeLists.txt index 667fa34666..97327ccd17 100644 --- a/test/backward_vendor/backward-cpp/CMakeLists.txt +++ b/test/backward_vendor/backward-cpp/CMakeLists.txt @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.0) project(backward CXX) # Introduce variables: @@ -31,22 +31,6 @@ include(GNUInstallDirs) include(BackwardConfig.cmake) -############################################################################### -# OPTIONS -############################################################################### - -option(BACKWARD_SHARED "Build backward as a shared library" OFF) -if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT DEFINED BACKWARD_TESTS) - # If this is a top level CMake project, we most lixely want the tests - set(BACKWARD_TESTS ON CACHE BOOL "Enable tests") -else() - set(BACKWARD_TESTS OFF CACHE BOOL "Enable tests") -endif() - -############################################################################### -# COMPILER FLAGS -############################################################################### - # check if compiler is nvcc or nvcc_wrapper set(COMPILER_IS_NVCC false) get_filename_component(COMPILER_NAME ${CMAKE_CXX_COMPILER} NAME) @@ -68,6 +52,10 @@ if (${COMPILER_IS_NVCC}) set(CMAKE_CXX_EXTENSIONS OFF) endif() +############################################################################### +# COMPILER FLAGS +############################################################################### + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") if (NOT ${COMPILER_IS_NVCC}) @@ -77,58 +65,75 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) endif() ############################################################################### -# BACKWARD INTERFACE -############################################################################### - -add_library(backward_interface INTERFACE) -set_target_properties(backward_interface PROPERTIES EXPORT_NAME Interface) -target_compile_definitions(backward_interface INTERFACE ${BACKWARD_DEFINITIONS}) -target_include_directories(backward_interface INTERFACE ${BACKWARD_INCLUDE_DIRS}) -if(BACKWARD_HAS_EXTERNAL_LIBRARIES) - target_link_libraries(backward_interface INTERFACE ${BACKWARD_LIBRARIES}) -endif() -add_library(Backward::Interface ALIAS backward_interface) - -############################################################################### -# BACKWARD OBJECT (Includes backward.cpp) -# (Note that this target is not exported, since CMake currently does not allow -# exporting an OBJECT library.) +# BACKWARD OBJECT ############################################################################### add_library(backward_object OBJECT backward.cpp) -set_target_properties(backward_object PROPERTIES EXPORT_NAME Object) -target_link_libraries(backward_object PUBLIC Backward::Interface) -add_library(Backward::Object ALIAS backward_object) +target_compile_definitions(backward_object PRIVATE ${BACKWARD_DEFINITIONS}) +target_include_directories(backward_object PRIVATE ${BACKWARD_INCLUDE_DIRS}) +set(BACKWARD_ENABLE $ CACHE STRING + "Link with this object to setup backward automatically") + ############################################################################### # BACKWARD LIBRARY (Includes backward.cpp) -# (Note that the linker will not include unused objects from a static library, -# unless the -Wl,--whole-archive option (or similar) is used.) ############################################################################### +option(BACKWARD_SHARED "Build dynamic backward-cpp shared lib" OFF) -set(libtype STATIC) if(BACKWARD_SHARED) set(libtype SHARED) endif() add_library(backward ${libtype} backward.cpp) -set_target_properties(backward PROPERTIES EXPORT_NAME Backward) -target_link_libraries(backward PUBLIC Backward::Interface) -add_library(Backward::Backward ALIAS backward) - -# check if Backward is being used as a top-level project or included as a subproject -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - install( - FILES "backward.hpp" - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) - install( - FILES "BackwardConfig.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - ) - # export the targets (note that exporting backward_object does not make sense) - install(TARGETS backward_interface backward EXPORT BackwardTargets) - # install a CMake file for the exported targets - install(EXPORT BackwardTargets - NAMESPACE Backward:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") +target_compile_definitions(backward PUBLIC ${BACKWARD_DEFINITIONS}) +target_include_directories(backward PUBLIC ${BACKWARD_INCLUDE_DIRS}) + +############################################################################### +# TESTS +############################################################################### + +if(BACKWARD_TESTS) + enable_testing() + + add_library(test_main OBJECT test/_test_main.cpp) + + macro(backward_add_test src) + get_filename_component(name ${src} NAME_WE) + set(test_name "test_${name}") + + add_executable(${test_name} ${src} ${ARGN} $) + + target_link_libraries(${test_name} PRIVATE Backward::Backward) + + add_test(NAME ${name} COMMAND ${test_name}) + endmacro() + + # Tests without backward.cpp + set(TESTS + test + stacktrace + rectrace + select_signals + ) + + foreach(test ${TESTS}) + backward_add_test(test/${test}.cpp) + endforeach() + + # Tests with backward.cpp + set(TESTS + suicide + ) + + foreach(test ${TESTS}) + backward_add_test(test/${test}.cpp ${BACKWARD_ENABLE}) + endforeach() endif() + +install( + FILES "backward.hpp" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) +install( + FILES "BackwardConfig.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/backward +) diff --git a/test/backward_vendor/backward-cpp/backward.hpp b/test/backward_vendor/backward-cpp/backward.hpp index 2342b180c1..ac7ad51738 100644 --- a/test/backward_vendor/backward-cpp/backward.hpp +++ b/test/backward_vendor/backward-cpp/backward.hpp @@ -101,7 +101,7 @@ // #define BACKWARD_HAS_UNWIND 1 // - unwind comes from libgcc, but I saw an equivalent inside clang itself. // - with unwind, the stacktrace is as accurate as it can possibly be, since -// this is used by the C++ runtime in gcc/clang for stack unwinding on +// this is used by the C++ runtine in gcc/clang for stack unwinding on // exception. // - normally libgcc is already linked to your program by default. // @@ -211,23 +211,10 @@ #else #include #endif -#if defined(__ppc__) || defined(__powerpc) || defined(__powerpc__) || \ - defined(__POWERPC__) -// Linux kernel header required for the struct pt_regs definition -// to access the NIP (Next Instruction Pointer) register value -#include -#endif #include #include #include #include -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#include -#undef _GNU_SOURCE -#else -#include -#endif #if BACKWARD_HAS_BFD == 1 // NOTE: defining PACKAGE{,_VERSION} is required before including @@ -240,6 +227,13 @@ #define PACKAGE_VERSION #endif #include +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#include +#undef _GNU_SOURCE +#else +#include +#endif #endif #if BACKWARD_HAS_DW == 1 @@ -254,6 +248,13 @@ #include #include #include +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#include +#undef _GNU_SOURCE +#else +#include +#endif #endif #if (BACKWARD_HAS_BACKTRACE == 1) || (BACKWARD_HAS_BACKTRACE_SYMBOL == 1) @@ -270,7 +271,7 @@ // #define BACKWARD_HAS_UNWIND 1 // - unwind comes from libgcc, but I saw an equivalent inside clang itself. // - with unwind, the stacktrace is as accurate as it can possibly be, since -// this is used by the C++ runtime in gcc/clang for stack unwinding on +// this is used by the C++ runtine in gcc/clang for stack unwinding on // exception. // - normally libgcc is already linked to your program by default. // @@ -337,12 +338,7 @@ #include #include - -#ifdef _WIN64 typedef SSIZE_T ssize_t; -#else -typedef int ssize_t; -#endif #ifndef NOMINMAX #define NOMINMAX @@ -521,7 +517,7 @@ template struct default_delete { void operator()(T &ptr) const { delete ptr; } }; -template > +template > class handle { struct dummy; T _val; @@ -727,7 +723,6 @@ template class StackTraceImpl { } size_t thread_id() const { return 0; } void skip_n_firsts(size_t) {} - void *const *begin() const { return nullptr; } }; class StackTraceImplBase { @@ -811,12 +806,7 @@ template class Unwinder { _index = -1; _depth = depth; _Unwind_Backtrace(&this->backtrace_trampoline, this); - if (_index == -1) { - // _Unwind_Backtrace has failed to obtain any backtraces - return 0; - } else { - return static_cast(_index); - } + return static_cast(_index); } private: @@ -837,7 +827,7 @@ template class Unwinder { uintptr_t ip = _Unwind_GetIPInfo(ctx, &ip_before_instruction); if (!ip_before_instruction) { - // calculating 0-1 for unsigned, looks like a possible bug to sanitizers, + // calculating 0-1 for unsigned, looks like a possible bug to sanitiziers, // so let's do it explicitly: if (ip == 0) { ip = std::numeric_limits::max(); // set it to 0xffff... (as @@ -954,7 +944,7 @@ class StackTraceImpl : public StackTraceImplHolder { reinterpret_cast(uctx->uc_mcontext.gregs[REG_EIP]); ++index; ctx = *reinterpret_cast(uctx); -#elif defined(__arm__) // clang libunwind/arm +#elif defined(__arm__) // libunwind uses its own context type for ARM unwinding. // Copy the registers from the signal handler's context so we can // unwind @@ -985,24 +975,6 @@ class StackTraceImpl : public StackTraceImplHolder { } _stacktrace[index] = reinterpret_cast(ctx.regs[UNW_ARM_R15]); ++index; -#elif defined(__aarch64__) // gcc libunwind/arm64 - unw_getcontext(&ctx); - // If the IP is the same as the crash address we have a bad function - // dereference The caller's address is pointed to by the link pointer, so - // we dereference that value and set it to be the next frame's IP. - if (uctx->uc_mcontext.pc == reinterpret_cast<__uint64_t>(error_addr())) { - uctx->uc_mcontext.pc = uctx->uc_mcontext.regs[UNW_TDEP_IP]; - } - - // 29 general purpose registers - for (int i = UNW_AARCH64_X0; i <= UNW_AARCH64_X28; i++) { - ctx.uc_mcontext.regs[i] = uctx->uc_mcontext.regs[i]; - } - ctx.uc_mcontext.sp = uctx->uc_mcontext.sp; - ctx.uc_mcontext.pc = uctx->uc_mcontext.pc; - ctx.uc_mcontext.fault_address = uctx->uc_mcontext.fault_address; - _stacktrace[index] = reinterpret_cast(ctx.uc_mcontext.pc); - ++index; #elif defined(__APPLE__) && defined(__x86_64__) unw_getcontext(&ctx); // OS X's implementation of libunwind uses its own context object @@ -1252,7 +1224,7 @@ class TraceResolverImplBase { } template void load_stacktrace(ST &st) { - load_addresses(st.begin(), static_cast(st.size())); + load_addresses(st.begin(), (int)st.size()); } virtual ResolvedTrace resolve(ResolvedTrace t) { return t; } @@ -1477,7 +1449,7 @@ class TraceResolverLinuxImpl // line of the function that was called. But if the code is optimized, // we might get something absolutely not related since the compiler // can reschedule the return address with inline functions and - // tail-call optimization (among other things that I don't even know + // tail-call optimisation (among other things that I don't even know // or cannot even dream about with my tiny limited brain). find_sym_result details_adjusted_call_site = find_symbol_details( fobj, (void *)(uintptr_t(trace.addr) - 1), symbol_info.dli_fbase); @@ -1508,7 +1480,7 @@ class TraceResolverLinuxImpl // this time we get the name of the function where the code is // located, instead of the function were the address is // located. In short, if the code was inlined, we get the - // function corresponding to the code. Else we already got in + // function correspoding to the code. Else we already got in // trace.function. trace.source.function = demangle(details_selected->funcname); @@ -1577,7 +1549,7 @@ class TraceResolverLinuxImpl bool _bfd_loaded; typedef details::handle > + details::deleter> bfd_handle_t; typedef details::handle bfd_symtab_t; @@ -1723,7 +1695,7 @@ class TraceResolverLinuxImpl // are we in the boundaries of the section? if (addr < sec_addr || addr >= sec_addr + size) { - addr -= base_addr; // oops, a relocated object, lets try again... + addr -= base_addr; // oups, a relocated object, lets try again... if (addr < sec_addr || addr >= sec_addr + size) { return; } @@ -1802,7 +1774,7 @@ class TraceResolverLinuxImpl ResolvedTrace resolve(ResolvedTrace trace) override { using namespace details; - Dwarf_Addr trace_addr = reinterpret_cast(trace.addr); + Dwarf_Addr trace_addr = (Dwarf_Addr)trace.addr; if (!_dwfl_handle_initialized) { // initialize dwfl... @@ -1934,8 +1906,8 @@ class TraceResolverLinuxImpl int line = 0, col = 0; dwarf_lineno(srcloc, &line); dwarf_linecol(srcloc, &col); - trace.source.line = static_cast(line); - trace.source.col = static_cast(col); + trace.source.line = line; + trace.source.col = col; } deep_first_search_by_pc(cudie, trace_addr - mod_bias, @@ -1949,9 +1921,9 @@ class TraceResolverLinuxImpl } private: - typedef details::handle > + typedef details::handle> dwfl_handle_t; - details::handle > + details::handle> _dwfl_cb; dwfl_handle_t _dwfl_handle; bool _dwfl_handle_initialized; @@ -1982,8 +1954,8 @@ class TraceResolverLinuxImpl Dwarf_Word line = 0, col = 0; dwarf_formudata(dwarf_attr(die, DW_AT_call_line, &attr_mem), &line); dwarf_formudata(dwarf_attr(die, DW_AT_call_column, &attr_mem), &col); - sloc.line = static_cast(line); - sloc.col = static_cast(col); + sloc.line = (unsigned)line; + sloc.col = (unsigned)col; trace.inliners.push_back(sloc); break; @@ -2273,14 +2245,14 @@ class TraceResolverLinuxImpl private: bool _dwarf_loaded; - typedef details::handle > + typedef details::handle> dwarf_file_t; - typedef details::handle > + typedef details::handle> dwarf_elf_t; typedef details::handle > + details::deleter> dwarf_handle_t; typedef std::map die_linemap_t; @@ -3638,12 +3610,10 @@ template <> class TraceResolverImpl symOptions |= SYMOPT_LOAD_LINES | SYMOPT_UNDNAME; SymSetOptions(symOptions); EnumProcessModules(process, &module_handles[0], - static_cast(module_handles.size() * sizeof(HMODULE)), - &cbNeeded); + module_handles.size() * sizeof(HMODULE), &cbNeeded); module_handles.resize(cbNeeded / sizeof(HMODULE)); EnumProcessModules(process, &module_handles[0], - static_cast(module_handles.size() * sizeof(HMODULE)), - &cbNeeded); + module_handles.size() * sizeof(HMODULE), &cbNeeded); std::transform(module_handles.begin(), module_handles.end(), std::back_inserter(modules), get_mod_info(process)); void *base = modules[0].base_address; @@ -3716,7 +3686,7 @@ class TraceResolver : public TraceResolverImpl {}; class SourceFile { public: - typedef std::vector > lines_t; + typedef std::vector> lines_t; SourceFile() {} SourceFile(const std::string &path) { @@ -3827,18 +3797,11 @@ class SourceFile { } #endif - // Allow adding to paths gotten from BACKWARD_CXX_SOURCE_PREFIXES after loading the - // library; this can be useful when the library is loaded when the locations are unknown - // Warning: Because this edits the static paths variable, it is *not* intrinsiclly thread safe - static void add_paths_to_env_variable_impl(const std::string & to_add) { - get_mutable_paths_from_env_variable().push_back(to_add); - } - private: - details::handle > + details::handle> _file; - static std::vector get_paths_from_env_variable_impl() { + std::vector get_paths_from_env_variable_impl() { std::vector paths; const char *prefixes_str = std::getenv("BACKWARD_CXX_SOURCE_PREFIXES"); if (prefixes_str && prefixes_str[0]) { @@ -3847,13 +3810,9 @@ class SourceFile { return paths; } - static std::vector &get_mutable_paths_from_env_variable() { - static volatile std::vector paths = get_paths_from_env_variable_impl(); - return const_cast&>(paths); - } - - static const std::vector &get_paths_from_env_variable() { - return get_mutable_paths_from_env_variable(); + const std::vector &get_paths_from_env_variable() { + static std::vector paths = get_paths_from_env_variable_impl(); + return paths; } #ifdef BACKWARD_ATLEAST_CXX11 @@ -4021,12 +3980,10 @@ class Printer { bool object; int inliner_context_size; int trace_context_size; - bool reverse; Printer() : snippet(true), color_mode(ColorMode::automatic), address(false), - object(false), inliner_context_size(5), trace_context_size(7), - reverse(true) {} + object(false), inliner_context_size(5), trace_context_size(7) {} template FILE *print(ST &st, FILE *fp = stderr) { cfile_streambuf obuf(fp); @@ -4073,14 +4030,8 @@ class Printer { void print_stacktrace(ST &st, std::ostream &os, Colorize &colorize) { print_header(os, st.thread_id()); _resolver.load_stacktrace(st); - if ( reverse ) { - for (size_t trace_idx = st.size(); trace_idx > 0; --trace_idx) { - print_trace(os, _resolver.resolve(st[trace_idx - 1]), colorize); - } - } else { - for (size_t trace_idx = 0; trace_idx < st.size(); ++trace_idx) { - print_trace(os, _resolver.resolve(st[trace_idx]), colorize); - } + for (size_t trace_idx = st.size(); trace_idx > 0; --trace_idx) { + print_trace(os, _resolver.resolve(st[trace_idx - 1]), colorize); } } @@ -4294,8 +4245,7 @@ class SignalHandling { printer.address = true; printer.print(st, stderr); -#if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700) || \ - (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L) +#if _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L psiginfo(info, nullptr); #else (void)info; @@ -4410,7 +4360,7 @@ class SignalHandling { static const constexpr int signal_skip_recs = #ifdef __clang__ // With clang, RtlCaptureContext also captures the stack frame of the - // current function Below that, there are 3 internal Windows functions + // current function Below that, there ar 3 internal Windows functions 4 #else // With MSVC cl, RtlCaptureContext misses the stack frame of the current From 965d46370d963dcb59ccee282377aad9a3b6dbc5 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Wed, 21 May 2025 17:35:42 +0200 Subject: [PATCH 2/9] Rename the backwards vendor dir Signed-off-by: Jose Luis Rivero --- .../backward_vendor => vendor}/backward-cpp/BackwardConfig.cmake | 0 {test/backward_vendor => vendor}/backward-cpp/CMakeLists.txt | 0 {test/backward_vendor => vendor}/backward-cpp/LICENSE.txt | 0 {test/backward_vendor => vendor}/backward-cpp/backward.cpp | 0 {test/backward_vendor => vendor}/backward-cpp/backward.hpp | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {test/backward_vendor => vendor}/backward-cpp/BackwardConfig.cmake (100%) rename {test/backward_vendor => vendor}/backward-cpp/CMakeLists.txt (100%) rename {test/backward_vendor => vendor}/backward-cpp/LICENSE.txt (100%) rename {test/backward_vendor => vendor}/backward-cpp/backward.cpp (100%) rename {test/backward_vendor => vendor}/backward-cpp/backward.hpp (100%) diff --git a/test/backward_vendor/backward-cpp/BackwardConfig.cmake b/vendor/backward-cpp/BackwardConfig.cmake similarity index 100% rename from test/backward_vendor/backward-cpp/BackwardConfig.cmake rename to vendor/backward-cpp/BackwardConfig.cmake diff --git a/test/backward_vendor/backward-cpp/CMakeLists.txt b/vendor/backward-cpp/CMakeLists.txt similarity index 100% rename from test/backward_vendor/backward-cpp/CMakeLists.txt rename to vendor/backward-cpp/CMakeLists.txt diff --git a/test/backward_vendor/backward-cpp/LICENSE.txt b/vendor/backward-cpp/LICENSE.txt similarity index 100% rename from test/backward_vendor/backward-cpp/LICENSE.txt rename to vendor/backward-cpp/LICENSE.txt diff --git a/test/backward_vendor/backward-cpp/backward.cpp b/vendor/backward-cpp/backward.cpp similarity index 100% rename from test/backward_vendor/backward-cpp/backward.cpp rename to vendor/backward-cpp/backward.cpp diff --git a/test/backward_vendor/backward-cpp/backward.hpp b/vendor/backward-cpp/backward.hpp similarity index 100% rename from test/backward_vendor/backward-cpp/backward.hpp rename to vendor/backward-cpp/backward.hpp From fd0edc98262394385bd9a4440022f350a81c1136 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Wed, 21 May 2025 17:43:45 +0200 Subject: [PATCH 3/9] Use backwards in gz-sim-gui and gz-sim-main Signed-off-by: Jose Luis Rivero --- CMakeLists.txt | 11 +++++++++-- src/cmd/CMakeLists.txt | 6 ++++-- test/CMakeLists.txt | 1 - 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 67f775b6fe..bf22d7cb98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,10 +32,17 @@ else() add_definitions("-DGZ_PROFILER_ENABLE=0") endif() +#-------------------------------------- +# Find Backward-cpp for stack trace support +# See https://github.com/gazebosim/gz-cmake/issues/477 before copy this code +find_package(Backward REQUIRED + HINTS ${CMAKE_CURRENT_SOURCE_DIR}/vendor/backward-cpp + NO_DEFAULT_PATH) + if (UNIX AND NOT APPLE) - set (EXTRA_TEST_LIB_DEPS stdc++fs backward_object) + set (EXTRA_TEST_LIB_DEPS stdc++fs Backward::Backward) else() - set (EXTRA_TEST_LIB_DEPS backward_object) + set (EXTRA_TEST_LIB_DEPS Backward::Backward) endif() # We're disabling pybind11 by default on Windows because they diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index cb2d37bb8c..993495d383 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -25,7 +25,9 @@ if(ENABLE_GUI) target_link_libraries(gz gz-sim-gui) add_executable(gz-sim-gui-client gui_main.cc) - target_link_libraries(gz-sim-gui-client PRIVATE gz) + target_link_libraries(gz-sim-gui-client + PUBLIC Backward::Backward + PRIVATE gz) install( TARGETS gz-sim-gui-client @@ -36,7 +38,7 @@ endif() # Create sim main executable set(sim_executable gz-sim-main) add_executable(${sim_executable} sim_main.cc) -target_link_libraries(${sim_executable} PRIVATE gz) +target_link_libraries(${sim_executable} PUBLIC gz Backward::Backward) install( TARGETS ${sim_executable} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4caf48b3ca..0436a5fc32 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -5,7 +5,6 @@ include_directories ( ${PROJECT_BINARY_DIR}/include ) -add_subdirectory(backward_vendor/backward-cpp) add_subdirectory(gtest_vendor) add_subdirectory(benchmark) add_subdirectory(integration) From 42383a5400b7c83a01549a2082f392277fe8fd02 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Thu, 22 May 2025 17:42:33 +0200 Subject: [PATCH 4/9] Use backwards header and signal handler Signed-off-by: Jose Luis Rivero --- src/cmd/CMakeLists.txt | 7 ++++--- src/cmd/gui_main.cc | 4 ++++ src/cmd/gz.cc | 1 + src/cmd/sim_main.cc | 3 +++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index 993495d383..9693143da8 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -15,6 +15,7 @@ install( add_library(gz STATIC gz.cc) target_link_libraries(gz ${PROJECT_LIBRARY_TARGET_NAME} + Backward::Backward gz-common::gz-common gz-utils::cli gz-sim @@ -26,8 +27,7 @@ if(ENABLE_GUI) add_executable(gz-sim-gui-client gui_main.cc) target_link_libraries(gz-sim-gui-client - PUBLIC Backward::Backward - PRIVATE gz) + PRIVATE gz Backward::Backward) install( TARGETS gz-sim-gui-client @@ -38,7 +38,8 @@ endif() # Create sim main executable set(sim_executable gz-sim-main) add_executable(${sim_executable} sim_main.cc) -target_link_libraries(${sim_executable} PUBLIC gz Backward::Backward) +target_link_libraries(${sim_executable} PUBLIC gz + PRIVATE Backward::Backward) install( TARGETS ${sim_executable} diff --git a/src/cmd/gui_main.cc b/src/cmd/gui_main.cc index 76e55cdcdd..7e5db3af49 100644 --- a/src/cmd/gui_main.cc +++ b/src/cmd/gui_main.cc @@ -15,6 +15,8 @@ * */ +#include + #include #include #include @@ -24,6 +26,8 @@ using namespace gz; +backward::SignalHandling sh; + ////////////////////////////////////////////////// /// \brief Structure to hold all available GUI launch options struct GuiOptions diff --git a/src/cmd/gz.cc b/src/cmd/gz.cc index ebc13e9ce5..a685a93b5b 100644 --- a/src/cmd/gz.cc +++ b/src/cmd/gz.cc @@ -17,6 +17,7 @@ #include "gz.hh" +#include #include #include #include diff --git a/src/cmd/sim_main.cc b/src/cmd/sim_main.cc index 5580485edf..2c89610826 100644 --- a/src/cmd/sim_main.cc +++ b/src/cmd/sim_main.cc @@ -15,6 +15,7 @@ * */ +#include #include #include #include @@ -34,6 +35,8 @@ #include "gz/sim/ServerConfig.hh" #include "gz.hh" +backward::SignalHandling sh; + using namespace gz; ////////////////////////////////////////////////// From 255dd435e5d3cb106f5894b03782d4260f4a1a45 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Thu, 22 May 2025 17:52:26 +0200 Subject: [PATCH 5/9] Revert "Use backwards header and signal handler" This reverts commit 42383a5400b7c83a01549a2082f392277fe8fd02. --- src/cmd/CMakeLists.txt | 7 +++---- src/cmd/gui_main.cc | 4 ---- src/cmd/gz.cc | 1 - src/cmd/sim_main.cc | 3 --- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index 9693143da8..993495d383 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -15,7 +15,6 @@ install( add_library(gz STATIC gz.cc) target_link_libraries(gz ${PROJECT_LIBRARY_TARGET_NAME} - Backward::Backward gz-common::gz-common gz-utils::cli gz-sim @@ -27,7 +26,8 @@ if(ENABLE_GUI) add_executable(gz-sim-gui-client gui_main.cc) target_link_libraries(gz-sim-gui-client - PRIVATE gz Backward::Backward) + PUBLIC Backward::Backward + PRIVATE gz) install( TARGETS gz-sim-gui-client @@ -38,8 +38,7 @@ endif() # Create sim main executable set(sim_executable gz-sim-main) add_executable(${sim_executable} sim_main.cc) -target_link_libraries(${sim_executable} PUBLIC gz - PRIVATE Backward::Backward) +target_link_libraries(${sim_executable} PUBLIC gz Backward::Backward) install( TARGETS ${sim_executable} diff --git a/src/cmd/gui_main.cc b/src/cmd/gui_main.cc index 7e5db3af49..76e55cdcdd 100644 --- a/src/cmd/gui_main.cc +++ b/src/cmd/gui_main.cc @@ -15,8 +15,6 @@ * */ -#include - #include #include #include @@ -26,8 +24,6 @@ using namespace gz; -backward::SignalHandling sh; - ////////////////////////////////////////////////// /// \brief Structure to hold all available GUI launch options struct GuiOptions diff --git a/src/cmd/gz.cc b/src/cmd/gz.cc index a685a93b5b..ebc13e9ce5 100644 --- a/src/cmd/gz.cc +++ b/src/cmd/gz.cc @@ -17,7 +17,6 @@ #include "gz.hh" -#include #include #include #include diff --git a/src/cmd/sim_main.cc b/src/cmd/sim_main.cc index 2c89610826..5580485edf 100644 --- a/src/cmd/sim_main.cc +++ b/src/cmd/sim_main.cc @@ -15,7 +15,6 @@ * */ -#include #include #include #include @@ -35,8 +34,6 @@ #include "gz/sim/ServerConfig.hh" #include "gz.hh" -backward::SignalHandling sh; - using namespace gz; ////////////////////////////////////////////////// From 454f13a7830b4354128d58913fd68c84af8b025e Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Thu, 22 May 2025 18:04:14 +0200 Subject: [PATCH 6/9] Use backwards.cpp instead of backwards.hpp Signed-off-by: Jose Luis Rivero --- src/cmd/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index 993495d383..865107fede 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -12,9 +12,10 @@ install( ) # Create sim utilies library -add_library(gz STATIC gz.cc) +add_library(gz STATIC gz.cc "${Backward_DIR}/backward.cpp") target_link_libraries(gz ${PROJECT_LIBRARY_TARGET_NAME} + Backward::Backward gz-common::gz-common gz-utils::cli gz-sim @@ -24,7 +25,7 @@ target_link_libraries(gz if(ENABLE_GUI) target_link_libraries(gz gz-sim-gui) - add_executable(gz-sim-gui-client gui_main.cc) + add_executable(gz-sim-gui-client gui_main.cc "${Backward_DIR}/backward.cpp") target_link_libraries(gz-sim-gui-client PUBLIC Backward::Backward PRIVATE gz) @@ -37,7 +38,7 @@ endif() # Create sim main executable set(sim_executable gz-sim-main) -add_executable(${sim_executable} sim_main.cc) +add_executable(${sim_executable} sim_main.cc "${Backward_DIR}/backward.cpp") target_link_libraries(${sim_executable} PUBLIC gz Backward::Backward) install( From 5d531b2afc165fa2e6830df789d97460840dc657 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Fri, 23 May 2025 13:37:46 +0200 Subject: [PATCH 7/9] Update backwards to 0bfd0a07a61551413ccd2ab9a9099af3bad40681 Signed-off-by: Jose Luis Rivero --- vendor/backward-cpp/BackwardConfig.cmake | 87 +++++++----- vendor/backward-cpp/CMakeLists.txt | 71 +++++++--- vendor/backward-cpp/backward.hpp | 166 ++++++++++++++++------- 3 files changed, 225 insertions(+), 99 deletions(-) diff --git a/vendor/backward-cpp/BackwardConfig.cmake b/vendor/backward-cpp/BackwardConfig.cmake index a982adcd64..7f6b3cb1dd 100644 --- a/vendor/backward-cpp/BackwardConfig.cmake +++ b/vendor/backward-cpp/BackwardConfig.cmake @@ -43,12 +43,6 @@ set(STACK_DETAILS_BFD FALSE CACHE BOOL set(STACK_DETAILS_DWARF FALSE CACHE BOOL "Use libdwarf/libelf to read debug info") -if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT DEFINED BACKWARD_TESTS) - # If this is a top level CMake project, we most lixely want the tests - set(BACKWARD_TESTS ON CACHE BOOL "Enable tests") -else() - set(BACKWARD_TESTS OFF CACHE BOOL "Enable tests") -endif() ############################################################################### # CONFIGS ############################################################################### @@ -79,7 +73,7 @@ if (STACK_WALKING_LIBUNWIND) # Disable other unwinders if libunwind is found set(STACK_WALKING_UNWIND FALSE) - set(STACK_WALKING_BACKTRACE FALSE) + set(STACK_WALKING_BACKTRACE FALSE) endif() if (${STACK_DETAILS_AUTO_DETECT}) @@ -89,8 +83,21 @@ if (${STACK_DETAILS_AUTO_DETECT}) # find libdw find_path(LIBDW_INCLUDE_DIR NAMES "elfutils/libdw.h" "elfutils/libdwfl.h") find_library(LIBDW_LIBRARY dw) + # in case it's statically linked, look for all the possible dependencies + find_library(LIBELF_LIBRARY elf) + find_library(LIBPTHREAD_LIBRARY pthread) + find_library(LIBZ_LIBRARY z) + find_library(LIBBZ2_LIBRARY bz2) + find_library(LIBLZMA_LIBRARY lzma) + find_library(LIBZSTD_LIBRARY zstd) set(LIBDW_INCLUDE_DIRS ${LIBDW_INCLUDE_DIR} ) - set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} ) + set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} + $<$:${LIBELF_LIBRARY}> + $<$:${LIBPTHREAD_LIBRARY}> + $<$:${LIBZ_LIBRARY}> + $<$:${LIBBZ2_LIBRARY}> + $<$:${LIBLZMA_LIBRARY}> + $<$:${LIBZSTD_LIBRARY}>) find_package_handle_standard_args(libdw ${_name_mismatched_arg} REQUIRED_VARS LIBDW_LIBRARY LIBDW_INCLUDE_DIR) mark_as_advanced(LIBDW_INCLUDE_DIR LIBDW_LIBRARY) @@ -139,6 +146,11 @@ if (${STACK_DETAILS_AUTO_DETECT}) # If we attempt to link against static bfd, make sure to link its dependencies, too get_filename_component(bfd_lib_ext "${LIBBFD_LIBRARY}" EXT) if (bfd_lib_ext STREQUAL "${CMAKE_STATIC_LIBRARY_SUFFIX}") + find_library(LIBSFRAME_LIBRARY NAMES sframe) + if (LIBSFRAME_LIBRARY) + list(APPEND _BACKWARD_LIBRARIES ${LIBSFRAME_LIBRARY}) + endif() + list(APPEND _BACKWARD_LIBRARIES iberty z) endif() @@ -190,14 +202,24 @@ if (NOT _BACKWARD_DEFINITIONS) endif() if(WIN32) - list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) + list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) if(MINGW) - set(MINGW_MSVCR_LIBRARY "msvcr90$<$:d>" CACHE STRING "Mingw MSVC runtime import library") - list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) - endif() + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag(-gcodeview SUPPORT_WINDOWS_DEBUG_INFO) + if(SUPPORT_WINDOWS_DEBUG_INFO) + set(CMAKE_EXE_LINKER_FLAGS "-Wl,--pdb= ") + add_compile_options(-gcodeview) + else() + set(MINGW_MSVCR_LIBRARY "msvcr90$<$:d>" CACHE STRING "Mingw MSVC runtime import library") + list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) + endif() + endif() endif() -set(BACKWARD_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}") +set(BACKWARD_INCLUDE_DIR + $ + $ +) set(BACKWARD_HAS_EXTERNAL_LIBRARIES FALSE) set(FIND_PACKAGE_REQUIRED_VARS BACKWARD_INCLUDE_DIR) @@ -208,17 +230,25 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Backward - REQUIRED_VARS ${FIND_PACKAGE_REQUIRED_VARS} + REQUIRED_VARS ${FIND_PACKAGE_REQUIRED_VARS} ) list(APPEND _BACKWARD_INCLUDE_DIRS ${BACKWARD_INCLUDE_DIR}) +# add_backward, optional bool argument; if passed and true, backward will be included as a system header macro(add_backward target) - target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) + message(DEPRECATION "The add_backward() macro is deprecated, use target_link_libraries() to link to " + "one of the exported targets: Backward::Interface, Backward::Object, or Backward::Backward." + ) + if ("${ARGN}") + target_include_directories(${target} SYSTEM PRIVATE ${BACKWARD_INCLUDE_DIRS}) + else() + target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) + endif() set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${BACKWARD_DEFINITIONS}) set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES ${BACKWARD_LIBRARIES}) endmacro() -set(BACKWARD_INCLUDE_DIRS ${_BACKWARD_INCLUDE_DIRS} CACHE INTERNAL "_BACKWARD_INCLUDE_DIRS") +set(BACKWARD_INCLUDE_DIRS ${_BACKWARD_INCLUDE_DIRS} CACHE INTERNAL "BACKWARD_INCLUDE_DIRS") set(BACKWARD_DEFINITIONS ${_BACKWARD_DEFINITIONS} CACHE INTERNAL "BACKWARD_DEFINITIONS") set(BACKWARD_LIBRARIES ${_BACKWARD_LIBRARIES} CACHE INTERNAL "BACKWARD_LIBRARIES") mark_as_advanced(BACKWARD_INCLUDE_DIRS BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) @@ -226,22 +256,15 @@ mark_as_advanced(BACKWARD_INCLUDE_DIRS BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) # Expand each definition in BACKWARD_DEFINITIONS to its own cmake var and export # to outer scope foreach(var ${BACKWARD_DEFINITIONS}) - string(REPLACE "=" ";" var_as_list ${var}) - list(GET var_as_list 0 var_name) - list(GET var_as_list 1 var_value) - set(${var_name} ${var_value}) - mark_as_advanced(${var_name}) + string(REPLACE "=" ";" var_as_list ${var}) + list(GET var_as_list 0 var_name) + list(GET var_as_list 1 var_value) + set(${var_name} ${var_value}) + mark_as_advanced(${var_name}) endforeach() -if (NOT TARGET Backward::Backward) - add_library(Backward::Backward INTERFACE IMPORTED) - set_target_properties(Backward::Backward PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${BACKWARD_INCLUDE_DIRS}" - INTERFACE_COMPILE_DEFINITIONS "${BACKWARD_DEFINITIONS}" - ) - if(BACKWARD_HAS_EXTERNAL_LIBRARIES) - set_target_properties(Backward::Backward PROPERTIES - INTERFACE_LINK_LIBRARIES "${BACKWARD_LIBRARIES}" - ) - endif() +# if this file is used from the install tree by find_package(), include the +# file CMake-generated file where the targets are defined +if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/BackwardTargets.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/BackwardTargets.cmake) endif() diff --git a/vendor/backward-cpp/CMakeLists.txt b/vendor/backward-cpp/CMakeLists.txt index 97327ccd17..e625f8ac97 100644 --- a/vendor/backward-cpp/CMakeLists.txt +++ b/vendor/backward-cpp/CMakeLists.txt @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.14) project(backward CXX) # Introduce variables: @@ -31,6 +31,22 @@ include(GNUInstallDirs) include(BackwardConfig.cmake) +############################################################################### +# OPTIONS +############################################################################### + +option(BACKWARD_SHARED "Build backward as a shared library" OFF) +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT DEFINED BACKWARD_TESTS) + # If this is a top level CMake project, we most lixely want the tests + set(BACKWARD_TESTS ON CACHE BOOL "Enable tests") +else() + set(BACKWARD_TESTS OFF CACHE BOOL "Enable tests") +endif() + +############################################################################### +# COMPILER FLAGS +############################################################################### + # check if compiler is nvcc or nvcc_wrapper set(COMPILER_IS_NVCC false) get_filename_component(COMPILER_NAME ${CMAKE_CXX_COMPILER} NAME) @@ -52,10 +68,6 @@ if (${COMPILER_IS_NVCC}) set(CMAKE_CXX_EXTENSIONS OFF) endif() -############################################################################### -# COMPILER FLAGS -############################################################################### - if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") if (NOT ${COMPILER_IS_NVCC}) @@ -65,27 +77,43 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) endif() ############################################################################### -# BACKWARD OBJECT +# BACKWARD INTERFACE ############################################################################### -add_library(backward_object OBJECT backward.cpp) -target_compile_definitions(backward_object PRIVATE ${BACKWARD_DEFINITIONS}) -target_include_directories(backward_object PRIVATE ${BACKWARD_INCLUDE_DIRS}) -set(BACKWARD_ENABLE $ CACHE STRING - "Link with this object to setup backward automatically") +add_library(backward_interface INTERFACE) +set_target_properties(backward_interface PROPERTIES EXPORT_NAME Interface) +target_compile_definitions(backward_interface INTERFACE ${BACKWARD_DEFINITIONS}) +target_include_directories(backward_interface INTERFACE ${BACKWARD_INCLUDE_DIRS}) +if(BACKWARD_HAS_EXTERNAL_LIBRARIES) + target_link_libraries(backward_interface INTERFACE ${BACKWARD_LIBRARIES}) +endif() +add_library(Backward::Interface ALIAS backward_interface) +############################################################################### +# BACKWARD OBJECT (Includes backward.cpp) +# (Note that this target is not exported, since CMake currently does not allow +# exporting an OBJECT library.) +############################################################################### + +add_library(backward_object OBJECT backward.cpp) +set_target_properties(backward_object PROPERTIES EXPORT_NAME Object) +target_link_libraries(backward_object PUBLIC Backward::Interface) +add_library(Backward::Object ALIAS backward_object) ############################################################################### # BACKWARD LIBRARY (Includes backward.cpp) +# (Note that the linker will not include unused objects from a static library, +# unless the -Wl,--whole-archive option (or similar) is used.) ############################################################################### -option(BACKWARD_SHARED "Build dynamic backward-cpp shared lib" OFF) +set(libtype STATIC) if(BACKWARD_SHARED) set(libtype SHARED) endif() add_library(backward ${libtype} backward.cpp) -target_compile_definitions(backward PUBLIC ${BACKWARD_DEFINITIONS}) -target_include_directories(backward PUBLIC ${BACKWARD_INCLUDE_DIRS}) +set_target_properties(backward PROPERTIES EXPORT_NAME Backward) +target_link_libraries(backward PUBLIC Backward::Interface) +add_library(Backward::Backward ALIAS backward) ############################################################################### # TESTS @@ -102,7 +130,7 @@ if(BACKWARD_TESTS) add_executable(${test_name} ${src} ${ARGN} $) - target_link_libraries(${test_name} PRIVATE Backward::Backward) + target_link_libraries(${test_name} PRIVATE Backward::Interface) add_test(NAME ${name} COMMAND ${test_name}) endmacro() @@ -125,7 +153,7 @@ if(BACKWARD_TESTS) ) foreach(test ${TESTS}) - backward_add_test(test/${test}.cpp ${BACKWARD_ENABLE}) + backward_add_test(test/${test}.cpp backward.cpp) endforeach() endif() @@ -135,5 +163,14 @@ install( ) install( FILES "BackwardConfig.cmake" - DESTINATION ${CMAKE_INSTALL_LIBDIR}/backward + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) +# check if Backward is being used as a top-level project or included as a subproject +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + # export the targets (note that exporting backward_object does not make sense) + install(TARGETS backward_interface backward EXPORT BackwardTargets) + # install a CMake file for the exported targets + install(EXPORT BackwardTargets + NAMESPACE Backward:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") +endif() diff --git a/vendor/backward-cpp/backward.hpp b/vendor/backward-cpp/backward.hpp index ac7ad51738..263cd1b4c4 100644 --- a/vendor/backward-cpp/backward.hpp +++ b/vendor/backward-cpp/backward.hpp @@ -101,7 +101,7 @@ // #define BACKWARD_HAS_UNWIND 1 // - unwind comes from libgcc, but I saw an equivalent inside clang itself. // - with unwind, the stacktrace is as accurate as it can possibly be, since -// this is used by the C++ runtine in gcc/clang for stack unwinding on +// this is used by the C++ runtime in gcc/clang for stack unwinding on // exception. // - normally libgcc is already linked to your program by default. // @@ -211,10 +211,23 @@ #else #include #endif +#if defined(__ppc__) || defined(__powerpc) || defined(__powerpc__) || \ + defined(__POWERPC__) +// Linux kernel header required for the struct pt_regs definition +// to access the NIP (Next Instruction Pointer) register value +#include +#endif #include #include #include #include +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#include +#undef _GNU_SOURCE +#else +#include +#endif #if BACKWARD_HAS_BFD == 1 // NOTE: defining PACKAGE{,_VERSION} is required before including @@ -227,13 +240,6 @@ #define PACKAGE_VERSION #endif #include -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#include -#undef _GNU_SOURCE -#else -#include -#endif #endif #if BACKWARD_HAS_DW == 1 @@ -248,13 +254,6 @@ #include #include #include -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#include -#undef _GNU_SOURCE -#else -#include -#endif #endif #if (BACKWARD_HAS_BACKTRACE == 1) || (BACKWARD_HAS_BACKTRACE_SYMBOL == 1) @@ -271,7 +270,7 @@ // #define BACKWARD_HAS_UNWIND 1 // - unwind comes from libgcc, but I saw an equivalent inside clang itself. // - with unwind, the stacktrace is as accurate as it can possibly be, since -// this is used by the C++ runtine in gcc/clang for stack unwinding on +// this is used by the C++ runtime in gcc/clang for stack unwinding on // exception. // - normally libgcc is already linked to your program by default. // @@ -338,7 +337,12 @@ #include #include + +#ifdef _WIN64 typedef SSIZE_T ssize_t; +#else +typedef int ssize_t; +#endif #ifndef NOMINMAX #define NOMINMAX @@ -517,7 +521,7 @@ template struct default_delete { void operator()(T &ptr) const { delete ptr; } }; -template > +template > class handle { struct dummy; T _val; @@ -723,6 +727,7 @@ template class StackTraceImpl { } size_t thread_id() const { return 0; } void skip_n_firsts(size_t) {} + void *const *begin() const { return nullptr; } }; class StackTraceImplBase { @@ -806,7 +811,12 @@ template class Unwinder { _index = -1; _depth = depth; _Unwind_Backtrace(&this->backtrace_trampoline, this); - return static_cast(_index); + if (_index == -1) { + // _Unwind_Backtrace has failed to obtain any backtraces + return 0; + } else { + return static_cast(_index); + } } private: @@ -827,7 +837,7 @@ template class Unwinder { uintptr_t ip = _Unwind_GetIPInfo(ctx, &ip_before_instruction); if (!ip_before_instruction) { - // calculating 0-1 for unsigned, looks like a possible bug to sanitiziers, + // calculating 0-1 for unsigned, looks like a possible bug to sanitizers, // so let's do it explicitly: if (ip == 0) { ip = std::numeric_limits::max(); // set it to 0xffff... (as @@ -944,7 +954,7 @@ class StackTraceImpl : public StackTraceImplHolder { reinterpret_cast(uctx->uc_mcontext.gregs[REG_EIP]); ++index; ctx = *reinterpret_cast(uctx); -#elif defined(__arm__) +#elif defined(__arm__) // clang libunwind/arm // libunwind uses its own context type for ARM unwinding. // Copy the registers from the signal handler's context so we can // unwind @@ -975,6 +985,24 @@ class StackTraceImpl : public StackTraceImplHolder { } _stacktrace[index] = reinterpret_cast(ctx.regs[UNW_ARM_R15]); ++index; +#elif defined(__aarch64__) // gcc libunwind/arm64 + unw_getcontext(&ctx); + // If the IP is the same as the crash address we have a bad function + // dereference The caller's address is pointed to by the link pointer, so + // we dereference that value and set it to be the next frame's IP. + if (uctx->uc_mcontext.pc == reinterpret_cast<__uint64_t>(error_addr())) { + uctx->uc_mcontext.pc = uctx->uc_mcontext.regs[UNW_TDEP_IP]; + } + + // 29 general purpose registers + for (int i = UNW_AARCH64_X0; i <= UNW_AARCH64_X28; i++) { + ctx.uc_mcontext.regs[i] = uctx->uc_mcontext.regs[i]; + } + ctx.uc_mcontext.sp = uctx->uc_mcontext.sp; + ctx.uc_mcontext.pc = uctx->uc_mcontext.pc; + ctx.uc_mcontext.fault_address = uctx->uc_mcontext.fault_address; + _stacktrace[index] = reinterpret_cast(ctx.uc_mcontext.pc); + ++index; #elif defined(__APPLE__) && defined(__x86_64__) unw_getcontext(&ctx); // OS X's implementation of libunwind uses its own context object @@ -1150,10 +1178,18 @@ class StackTraceImpl : public StackTraceImplHolder { s.AddrStack.Mode = AddrModeFlat; s.AddrFrame.Mode = AddrModeFlat; s.AddrPC.Mode = AddrModeFlat; -#ifdef _M_X64 +#if defined(_M_X64) s.AddrPC.Offset = ctx_->Rip; s.AddrStack.Offset = ctx_->Rsp; s.AddrFrame.Offset = ctx_->Rbp; +#elif defined(_M_ARM64) + s.AddrPC.Offset = ctx_->Pc; + s.AddrStack.Offset = ctx_->Sp; + s.AddrFrame.Offset = ctx_->Fp; +#elif defined(_M_ARM) + s.AddrPC.Offset = ctx_->Pc; + s.AddrStack.Offset = ctx_->Sp; + s.AddrFrame.Offset = ctx_->R11; #else s.AddrPC.Offset = ctx_->Eip; s.AddrStack.Offset = ctx_->Esp; @@ -1161,8 +1197,12 @@ class StackTraceImpl : public StackTraceImplHolder { #endif if (!machine_type_) { -#ifdef _M_X64 +#if defined(_M_X64) machine_type_ = IMAGE_FILE_MACHINE_AMD64; +#elif defined(_M_ARM64) + machine_type_ = IMAGE_FILE_MACHINE_ARM64; +#elif defined(_M_ARM) + machine_type_ = IMAGE_FILE_MACHINE_ARMNT; #else machine_type_ = IMAGE_FILE_MACHINE_I386; #endif @@ -1224,7 +1264,7 @@ class TraceResolverImplBase { } template void load_stacktrace(ST &st) { - load_addresses(st.begin(), (int)st.size()); + load_addresses(st.begin(), static_cast(st.size())); } virtual ResolvedTrace resolve(ResolvedTrace t) { return t; } @@ -1449,7 +1489,7 @@ class TraceResolverLinuxImpl // line of the function that was called. But if the code is optimized, // we might get something absolutely not related since the compiler // can reschedule the return address with inline functions and - // tail-call optimisation (among other things that I don't even know + // tail-call optimization (among other things that I don't even know // or cannot even dream about with my tiny limited brain). find_sym_result details_adjusted_call_site = find_symbol_details( fobj, (void *)(uintptr_t(trace.addr) - 1), symbol_info.dli_fbase); @@ -1480,7 +1520,7 @@ class TraceResolverLinuxImpl // this time we get the name of the function where the code is // located, instead of the function were the address is // located. In short, if the code was inlined, we get the - // function correspoding to the code. Else we already got in + // function corresponding to the code. Else we already got in // trace.function. trace.source.function = demangle(details_selected->funcname); @@ -1549,7 +1589,7 @@ class TraceResolverLinuxImpl bool _bfd_loaded; typedef details::handle> + details::deleter > bfd_handle_t; typedef details::handle bfd_symtab_t; @@ -1695,7 +1735,7 @@ class TraceResolverLinuxImpl // are we in the boundaries of the section? if (addr < sec_addr || addr >= sec_addr + size) { - addr -= base_addr; // oups, a relocated object, lets try again... + addr -= base_addr; // oops, a relocated object, lets try again... if (addr < sec_addr || addr >= sec_addr + size) { return; } @@ -1774,7 +1814,7 @@ class TraceResolverLinuxImpl ResolvedTrace resolve(ResolvedTrace trace) override { using namespace details; - Dwarf_Addr trace_addr = (Dwarf_Addr)trace.addr; + Dwarf_Addr trace_addr = reinterpret_cast(trace.addr); if (!_dwfl_handle_initialized) { // initialize dwfl... @@ -1906,8 +1946,8 @@ class TraceResolverLinuxImpl int line = 0, col = 0; dwarf_lineno(srcloc, &line); dwarf_linecol(srcloc, &col); - trace.source.line = line; - trace.source.col = col; + trace.source.line = static_cast(line); + trace.source.col = static_cast(col); } deep_first_search_by_pc(cudie, trace_addr - mod_bias, @@ -1921,9 +1961,9 @@ class TraceResolverLinuxImpl } private: - typedef details::handle> + typedef details::handle > dwfl_handle_t; - details::handle> + details::handle > _dwfl_cb; dwfl_handle_t _dwfl_handle; bool _dwfl_handle_initialized; @@ -1954,8 +1994,8 @@ class TraceResolverLinuxImpl Dwarf_Word line = 0, col = 0; dwarf_formudata(dwarf_attr(die, DW_AT_call_line, &attr_mem), &line); dwarf_formudata(dwarf_attr(die, DW_AT_call_column, &attr_mem), &col); - sloc.line = (unsigned)line; - sloc.col = (unsigned)col; + sloc.line = static_cast(line); + sloc.col = static_cast(col); trace.inliners.push_back(sloc); break; @@ -2245,14 +2285,14 @@ class TraceResolverLinuxImpl private: bool _dwarf_loaded; - typedef details::handle> + typedef details::handle > dwarf_file_t; - typedef details::handle> + typedef details::handle > dwarf_elf_t; typedef details::handle> + details::deleter > dwarf_handle_t; typedef std::map die_linemap_t; @@ -3610,10 +3650,12 @@ template <> class TraceResolverImpl symOptions |= SYMOPT_LOAD_LINES | SYMOPT_UNDNAME; SymSetOptions(symOptions); EnumProcessModules(process, &module_handles[0], - module_handles.size() * sizeof(HMODULE), &cbNeeded); + static_cast(module_handles.size() * sizeof(HMODULE)), + &cbNeeded); module_handles.resize(cbNeeded / sizeof(HMODULE)); EnumProcessModules(process, &module_handles[0], - module_handles.size() * sizeof(HMODULE), &cbNeeded); + static_cast(module_handles.size() * sizeof(HMODULE)), + &cbNeeded); std::transform(module_handles.begin(), module_handles.end(), std::back_inserter(modules), get_mod_info(process)); void *base = modules[0].base_address; @@ -3686,7 +3728,7 @@ class TraceResolver : public TraceResolverImpl {}; class SourceFile { public: - typedef std::vector> lines_t; + typedef std::vector > lines_t; SourceFile() {} SourceFile(const std::string &path) { @@ -3797,11 +3839,18 @@ class SourceFile { } #endif + // Allow adding to paths gotten from BACKWARD_CXX_SOURCE_PREFIXES after loading the + // library; this can be useful when the library is loaded when the locations are unknown + // Warning: Because this edits the static paths variable, it is *not* intrinsiclly thread safe + static void add_paths_to_env_variable_impl(const std::string & to_add) { + get_mutable_paths_from_env_variable().push_back(to_add); + } + private: - details::handle> + details::handle > _file; - std::vector get_paths_from_env_variable_impl() { + static std::vector get_paths_from_env_variable_impl() { std::vector paths; const char *prefixes_str = std::getenv("BACKWARD_CXX_SOURCE_PREFIXES"); if (prefixes_str && prefixes_str[0]) { @@ -3810,9 +3859,13 @@ class SourceFile { return paths; } - const std::vector &get_paths_from_env_variable() { - static std::vector paths = get_paths_from_env_variable_impl(); - return paths; + static std::vector &get_mutable_paths_from_env_variable() { + static volatile std::vector paths = get_paths_from_env_variable_impl(); + return const_cast&>(paths); + } + + static const std::vector &get_paths_from_env_variable() { + return get_mutable_paths_from_env_variable(); } #ifdef BACKWARD_ATLEAST_CXX11 @@ -3980,10 +4033,12 @@ class Printer { bool object; int inliner_context_size; int trace_context_size; + bool reverse; Printer() : snippet(true), color_mode(ColorMode::automatic), address(false), - object(false), inliner_context_size(5), trace_context_size(7) {} + object(false), inliner_context_size(5), trace_context_size(7), + reverse(true) {} template FILE *print(ST &st, FILE *fp = stderr) { cfile_streambuf obuf(fp); @@ -4030,8 +4085,14 @@ class Printer { void print_stacktrace(ST &st, std::ostream &os, Colorize &colorize) { print_header(os, st.thread_id()); _resolver.load_stacktrace(st); - for (size_t trace_idx = st.size(); trace_idx > 0; --trace_idx) { - print_trace(os, _resolver.resolve(st[trace_idx - 1]), colorize); + if ( reverse ) { + for (size_t trace_idx = st.size(); trace_idx > 0; --trace_idx) { + print_trace(os, _resolver.resolve(st[trace_idx - 1]), colorize); + } + } else { + for (size_t trace_idx = 0; trace_idx < st.size(); ++trace_idx) { + print_trace(os, _resolver.resolve(st[trace_idx]), colorize); + } } } @@ -4220,6 +4281,8 @@ class SignalHandling { #elif defined(__mips__) error_addr = reinterpret_cast( reinterpret_cast(&uctx->uc_mcontext)->sc_pc); +#elif defined(__APPLE__) && defined(__POWERPC__) + error_addr = reinterpret_cast(uctx->uc_mcontext->__ss.__srr0); #elif defined(__ppc__) || defined(__powerpc) || defined(__powerpc__) || \ defined(__POWERPC__) error_addr = reinterpret_cast(uctx->uc_mcontext.regs->nip); @@ -4231,6 +4294,8 @@ class SignalHandling { error_addr = reinterpret_cast(uctx->uc_mcontext->__ss.__rip); #elif defined(__APPLE__) error_addr = reinterpret_cast(uctx->uc_mcontext->__ss.__eip); +#elif defined(__loongarch__) + error_addr = reinterpret_cast(uctx->uc_mcontext.__pc); #else #warning ":/ sorry, ain't know no nothing none not of your architecture!" #endif @@ -4245,7 +4310,8 @@ class SignalHandling { printer.address = true; printer.print(st, stderr); -#if _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L +#if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700) || \ + (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L) psiginfo(info, nullptr); #else (void)info; @@ -4360,7 +4426,7 @@ class SignalHandling { static const constexpr int signal_skip_recs = #ifdef __clang__ // With clang, RtlCaptureContext also captures the stack frame of the - // current function Below that, there ar 3 internal Windows functions + // current function Below that, there are 3 internal Windows functions 4 #else // With MSVC cl, RtlCaptureContext misses the stack frame of the current From 01095127b0feb2e18479190e9aebbe942067bb83 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Fri, 23 May 2025 13:40:09 +0200 Subject: [PATCH 8/9] Change backwards use to relay on Object Signed-off-by: Jose Luis Rivero --- CMakeLists.txt | 13 ++++++++----- src/cmd/CMakeLists.txt | 14 +++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf22d7cb98..135bbf0698 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,14 +35,17 @@ endif() #-------------------------------------- # Find Backward-cpp for stack trace support # See https://github.com/gazebosim/gz-cmake/issues/477 before copy this code -find_package(Backward REQUIRED - HINTS ${CMAKE_CURRENT_SOURCE_DIR}/vendor/backward-cpp - NO_DEFAULT_PATH) +set(BACKWARD_TESTS OFF) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/vendor/backward-cpp) + +# Using other CMake interfaces from backwards won't work here since +# CMake would not resolve them into gz-cmake (uses EXTRA_TEST_LIB_DEPS) +# using backward_object set the object file path. if (UNIX AND NOT APPLE) - set (EXTRA_TEST_LIB_DEPS stdc++fs Backward::Backward) + set (EXTRA_TEST_LIB_DEPS stdc++fs backward_object) else() - set (EXTRA_TEST_LIB_DEPS Backward::Backward) + set (EXTRA_TEST_LIB_DEPS backward_object) endif() # We're disabling pybind11 by default on Windows because they diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index 865107fede..70fb984397 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -12,10 +12,10 @@ install( ) # Create sim utilies library -add_library(gz STATIC gz.cc "${Backward_DIR}/backward.cpp") +add_library(gz STATIC gz.cc) target_link_libraries(gz ${PROJECT_LIBRARY_TARGET_NAME} - Backward::Backward + Backward::Object gz-common::gz-common gz-utils::cli gz-sim @@ -25,10 +25,9 @@ target_link_libraries(gz if(ENABLE_GUI) target_link_libraries(gz gz-sim-gui) - add_executable(gz-sim-gui-client gui_main.cc "${Backward_DIR}/backward.cpp") + add_executable(gz-sim-gui-client gui_main.cc) target_link_libraries(gz-sim-gui-client - PUBLIC Backward::Backward - PRIVATE gz) + PRIVATE gz Backward::Object) install( TARGETS gz-sim-gui-client @@ -38,8 +37,9 @@ endif() # Create sim main executable set(sim_executable gz-sim-main) -add_executable(${sim_executable} sim_main.cc "${Backward_DIR}/backward.cpp") -target_link_libraries(${sim_executable} PUBLIC gz Backward::Backward) +add_executable(${sim_executable} sim_main.cc) +target_link_libraries(${sim_executable} + PRIVATE Backward::Object gz) install( TARGETS ${sim_executable} From cf010b15d7e07ccc9c77a3601724e1afe045aa7c Mon Sep 17 00:00:00 2001 From: Arjo Chakravarty Date: Mon, 26 May 2025 03:13:55 +0000 Subject: [PATCH 9/9] Minor style related issues Signed-off-by: Arjo Chakravarty --- vendor/backward-cpp/BackwardConfig.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/backward-cpp/BackwardConfig.cmake b/vendor/backward-cpp/BackwardConfig.cmake index 7f6b3cb1dd..353cdc5dc4 100644 --- a/vendor/backward-cpp/BackwardConfig.cmake +++ b/vendor/backward-cpp/BackwardConfig.cmake @@ -205,7 +205,7 @@ if(WIN32) list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) if(MINGW) include(CheckCXXCompilerFlag) - check_cxx_compiler_flag(-gcodeview SUPPORT_WINDOWS_DEBUG_INFO) + check_cxx_compiler_flag(-gcodeview SUPPORT_WINDOWS_DEBUG_INFO) if(SUPPORT_WINDOWS_DEBUG_INFO) set(CMAKE_EXE_LINKER_FLAGS "-Wl,--pdb= ") add_compile_options(-gcodeview) @@ -213,7 +213,7 @@ if(WIN32) set(MINGW_MSVCR_LIBRARY "msvcr90$<$:d>" CACHE STRING "Mingw MSVC runtime import library") list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) endif() - endif() + endif() endif() set(BACKWARD_INCLUDE_DIR