1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4#[=======================================================================[.rst: 5FindBacktrace 6------------- 7 8Find provider for `backtrace(3) <http://man7.org/linux/man-pages/man3/backtrace.3.html>`__. 9 10Checks if OS supports ``backtrace(3)`` via either ``libc`` or custom library. 11This module defines the following variables: 12 13``Backtrace_HEADER`` 14 The header file needed for ``backtrace(3)``. Cached. 15 Could be forcibly set by user. 16``Backtrace_INCLUDE_DIRS`` 17 The include directories needed to use ``backtrace(3)`` header. 18``Backtrace_LIBRARIES`` 19 The libraries (linker flags) needed to use ``backtrace(3)``, if any. 20``Backtrace_FOUND`` 21 Is set if and only if ``backtrace(3)`` support detected. 22 23The following cache variables are also available to set or use: 24 25``Backtrace_LIBRARY`` 26 The external library providing backtrace, if any. 27``Backtrace_INCLUDE_DIR`` 28 The directory holding the ``backtrace(3)`` header. 29 30Typical usage is to generate of header file using :command:`configure_file` 31with the contents like the following:: 32 33 #cmakedefine01 Backtrace_FOUND 34 #if Backtrace_FOUND 35 # include <${Backtrace_HEADER}> 36 #endif 37 38And then reference that generated header file in actual source. 39#]=======================================================================] 40 41include(CMakePushCheckState) 42include(CheckSymbolExists) 43include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) 44 45# List of variables to be provided to find_package_handle_standard_args() 46set(_Backtrace_STD_ARGS Backtrace_INCLUDE_DIR) 47 48if(Backtrace_HEADER) 49 set(_Backtrace_HEADER_TRY "${Backtrace_HEADER}") 50else(Backtrace_HEADER) 51 set(_Backtrace_HEADER_TRY "execinfo.h") 52endif(Backtrace_HEADER) 53 54find_path(Backtrace_INCLUDE_DIR "${_Backtrace_HEADER_TRY}") 55set(Backtrace_INCLUDE_DIRS ${Backtrace_INCLUDE_DIR}) 56 57if (NOT DEFINED Backtrace_LIBRARY) 58 # First, check if we already have backtrace(), e.g., in libc 59 cmake_push_check_state(RESET) 60 set(CMAKE_REQUIRED_INCLUDES ${Backtrace_INCLUDE_DIRS}) 61 set(CMAKE_REQUIRED_QUIET ${Backtrace_FIND_QUIETLY}) 62 check_symbol_exists("backtrace" "${_Backtrace_HEADER_TRY}" _Backtrace_SYM_FOUND) 63 cmake_pop_check_state() 64endif() 65 66if(_Backtrace_SYM_FOUND) 67 # Avoid repeating the message() call below each time CMake is run. 68 if(NOT Backtrace_FIND_QUIETLY AND NOT DEFINED Backtrace_LIBRARY) 69 message(STATUS "backtrace facility detected in default set of libraries") 70 endif() 71 set(Backtrace_LIBRARY "" CACHE FILEPATH "Library providing backtrace(3), empty for default set of libraries") 72else() 73 # Check for external library, for non-glibc systems 74 if(Backtrace_INCLUDE_DIR) 75 # OpenBSD has libbacktrace renamed to libexecinfo 76 find_library(Backtrace_LIBRARY "execinfo") 77 else() # respect user wishes 78 set(_Backtrace_HEADER_TRY "backtrace.h") 79 find_path(Backtrace_INCLUDE_DIR ${_Backtrace_HEADER_TRY}) 80 find_library(Backtrace_LIBRARY "backtrace") 81 endif() 82 83 # Prepend list with library path as it's more common practice 84 set(_Backtrace_STD_ARGS Backtrace_LIBRARY ${_Backtrace_STD_ARGS}) 85endif() 86 87set(Backtrace_LIBRARIES ${Backtrace_LIBRARY}) 88set(Backtrace_HEADER "${_Backtrace_HEADER_TRY}" CACHE STRING "Header providing backtrace(3) facility") 89 90find_package_handle_standard_args(Backtrace FOUND_VAR Backtrace_FOUND REQUIRED_VARS ${_Backtrace_STD_ARGS}) 91mark_as_advanced(Backtrace_HEADER Backtrace_INCLUDE_DIR Backtrace_LIBRARY) 92