Auto config improvements (#20)

This commit is contained in:
Jeremy Rifkin 2023-07-23 23:59:34 -04:00 committed by GitHub
parent 3ab0c7f738
commit 9d52dc24e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 85 additions and 65 deletions

View File

@ -104,10 +104,11 @@ function(check_support var source includes libraries definitions)
set(${var} ${${var}} PARENT_SCOPE)
endfunction()
if(NOT MSVC) # No need to bother checking in msvc, but do check in minngw
if(MINGW OR NOT WIN32) # No need to bother checking in msvc, but do check in minngw
check_support(HAS_UNWIND has_unwind.cpp "" "" "")
check_support(HAS_EXECINFO has_execinfo.cpp "" "" "")
check_support(HAS_BACKTRACE has_backtrace.cpp "" "backtrace" "${CPPTRACE_BACKTRACE_PATH_DEFINITION}")
check_support(HAS_DL has_dl.cpp "" "dl" "")
check_support(HAS_CXXABI has_cxxabi.cpp "" "" "")
if(NOT MSVC)
set(STACKTRACE_LINK_LIB "stdc++_libbacktrace")
@ -115,6 +116,16 @@ if(NOT MSVC) # No need to bother checking in msvc, but do check in minngw
set(STACKTRACE_LINK_LIB "")
endif()
check_support(HAS_STACKTRACE has_stacktrace.cpp "" "${STACKTRACE_LINK_LIB}" "")
if(APPLE)
find_program(ADDR2LINE_PATH atos PATHS ENV PATH)
else()
find_program(ADDR2LINE_PATH addr2line PATHS ENV PATH)
endif()
if("${ADDR2LINE_PATH}" STREQUAL "ADDR2LINE_PATH-NOTFOUND")
set(HAS_ADDR2LINE FALSE)
else()
set(HAS_ADDR2LINE TRUE)
endif()
endif()
# =============================================== Autoconfig full dump ===============================================
@ -135,12 +146,14 @@ if(
)
)
# Attempt to auto-config
if(HAS_STACKTRACE AND NOT WIN32) # Our trace is better than msvc's <stacktrace>
set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On)
message(STATUS "Cpptrace auto config: Using C++23 <stacktrace> for the full trace")
elseif(HAS_BACKTRACE AND NOT WIN32) # Mingw libbacktrace doesn't seem to be working
set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On)
message(STATUS "Cpptrace auto config: Using libbacktrace for the full trace")
if(MINGW OR NOT WIN32) # Our trace is better than msvc's <stacktrace>
if(HAS_STACKTRACE)
set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On)
message(STATUS "Cpptrace auto config: Using C++23 <stacktrace> for the full trace")
elseif(HAS_BACKTRACE AND NOT WIN32) # Mingw libbacktrace doesn't seem to be working
set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On)
message(STATUS "Cpptrace auto config: Using libbacktrace for the full trace")
endif()
endif()
endif()
@ -168,7 +181,7 @@ if(
set(CPPTRACE_UNWIND_WITH_NOTHING On)
message(FATAL_ERROR "Cpptrace auto config: No unwinding back-end seems to be supported, stack tracing will not work. To compile anyway set CPPTRACE_UNWIND_WITH_NOTHING.")
endif()
elseif(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # mingw
elseif(MINGW)
if(HAS_UNWIND)
set(CPPTRACE_UNWIND_WITH_UNWIND On)
message(STATUS "Cpptrace auto config: Using libgcc unwind for unwinding")
@ -201,18 +214,19 @@ if(
)
)
# Attempt to auto-config
if(APPLE)
set(CPPTRACE_GET_SYMBOLS_WITH_LIBDL ON)
elseif(UNIX)
if(HAS_BACKTRACE)
if(UNIX OR MINGW)
if(HAS_BACKTRACE AND NOT MINGW) # not working on mingw at the moment
set(CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE On)
message(STATUS "Cpptrace auto config: Using libbacktrace for symbols")
elseif(HAS_ADDR2LINE)
set(CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE On)
message(STATUS "Cpptrace auto config: Using addr2line for symbols")
elseif(HAS_DL)
set(CPPTRACE_GET_SYMBOLS_WITH_LIBDL On)
message(STATUS "Cpptrace auto config: Using libdl for symbols")
else()
message(FATAL_ERROR "Cpptrace auto config: No symbol back-end could be automatically configured. To compile anyway set CPPTRACE_GET_SYMBOLS_WITH_NOTHING.")
endif()
elseif(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # mingw
set(CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE On)
message(STATUS "Cpptrace auto config: Using addr2line for symbols")
elseif(WIN32)
set(CPPTRACE_GET_SYMBOLS_WITH_DBGHELP On)
message(STATUS "Cpptrace auto config: Using dbghelp for symbols")

6
cmake/has_dl.cpp Normal file
View File

@ -0,0 +1,6 @@
#include <dlfcn.h>
int main() {
Dl_info info;
dladdr(nullptr, &info);
}

View File

@ -1,25 +0,0 @@
test.cpp||19||trace()
test.cpp||35||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||47||void foo<int>(int, int)
test.cpp||47||void foo<int, int>(int, int, int)
test.cpp||47||void foo<int, int, int>(int, int, int, int)
test.cpp||47||void foo<int, int, int, int>(int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int>(int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int>(int, int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int, int)
test.cpp||53||function_two(int, float)
test.cpp||59||function_one(int)
test.cpp||65||main
||0||

View File

@ -0,0 +1,25 @@
build/test||0||trace()
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||void foo<int>(int, int)
build/test||0||void foo<int, int>(int, int, int)
build/test||0||void foo<int, int, int>(int, int, int, int)
build/test||0||void foo<int, int, int, int>(int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int>(int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int>(int, int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int, int)
build/test||0||function_two(int, float)
build/test||0||function_one(int)
build/test||0||main
/usr/lib/dyld||0||start

View File

@ -1,25 +1,25 @@
build/test||0||trace()
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||foo(int)
build/test||0||void foo<int>(int, int)
build/test||0||void foo<int, int>(int, int, int)
build/test||0||void foo<int, int, int>(int, int, int, int)
build/test||0||void foo<int, int, int, int>(int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int>(int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int>(int, int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int)
build/test||0||void foo<int, int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int, int)
build/test||0||function_two(int, float)
build/test||0||function_one(int)
build/test||0||main
/usr/lib/dyld||0||start
test.cpp||19||trace()
test.cpp||35||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||39||foo(int)
test.cpp||47||void foo<int>(int, int)
test.cpp||47||void foo<int, int>(int, int, int)
test.cpp||47||void foo<int, int, int>(int, int, int, int)
test.cpp||47||void foo<int, int, int, int>(int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int>(int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int>(int, int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int)
test.cpp||47||void foo<int, int, int, int, int, int, int, int, int>(int, int, int, int, int, int, int, int, int, int)
test.cpp||53||function_two(int, float)
test.cpp||59||function_one(int)
test.cpp||65||main
||0||