Warning, /sdk/heaptrack/cmake/FindLibunwind.cmake is written in an unsupported language. File is not indexed.

0001 #.rst:
0002 # FindLibunwind
0003 # -----------
0004 #
0005 # Find Libunwind
0006 #
0007 # Find Libunwind headers and library
0008 #
0009 # ::
0010 #
0011 #   LIBUNWIND_FOUND                     - True if libunwind is found.
0012 #   LIBUNWIND_INCLUDE_DIRS              - Directory where libunwind headers are located.
0013 #   LIBUNWIND_LIBRARIES                 - Unwind libraries to link against.
0014 #   LIBUNWIND_HAS_UNW_GETCONTEXT        - True if unw_getcontext() is found (optional).
0015 #   LIBUNWIND_HAS_UNW_INIT_LOCAL        - True if unw_init_local() is found (optional).
0016 #   LIBUNWIND_HAS_UNW_BACKTRACE         - True if unw_backtrace() is found (required).
0017 #   LIBUNWIND_HAS_UNW_BACKTRACE_SKIP    - True if unw_backtrace_skip() is found (optional).
0018 #   LIBUNWIND_VERSION_STRING            - version number as a string (ex: "5.0.3")
0019 
0020 #=============================================================================
0021 # SPDX-FileCopyrightText: 2014 ZBackup contributors
0022 # SPDX-License-Identifier: BSD-3-Clause
0023 
0024 
0025 find_path(LIBUNWIND_INCLUDE_DIR libunwind.h )
0026 if(NOT EXISTS "${LIBUNWIND_INCLUDE_DIR}/unwind.h")
0027   MESSAGE("Found libunwind.h but corresponding unwind.h is absent!")
0028   SET(LIBUNWIND_INCLUDE_DIR "")
0029 endif()
0030 
0031 find_library(LIBUNWIND_LIBRARY unwind)
0032 
0033 if(LIBUNWIND_INCLUDE_DIR AND EXISTS "${LIBUNWIND_INCLUDE_DIR}/libunwind-common.h")
0034   file(STRINGS "${LIBUNWIND_INCLUDE_DIR}/libunwind-common.h" LIBUNWIND_HEADER_CONTENTS REGEX "#define UNW_VERSION_[A-Z]+\t[0-9]*")
0035 
0036   string(REGEX REPLACE ".*#define UNW_VERSION_MAJOR\t([0-9]*).*" "\\1" LIBUNWIND_VERSION_MAJOR "${LIBUNWIND_HEADER_CONTENTS}")
0037   string(REGEX REPLACE ".*#define UNW_VERSION_MINOR\t([0-9]*).*" "\\1" LIBUNWIND_VERSION_MINOR "${LIBUNWIND_HEADER_CONTENTS}")
0038   string(REGEX REPLACE ".*#define UNW_VERSION_EXTRA\t([0-9]*).*" "\\1" LIBUNWIND_VERSION_EXTRA "${LIBUNWIND_HEADER_CONTENTS}")
0039 
0040   if(LIBUNWIND_VERSION_EXTRA)
0041     set(LIBUNWIND_VERSION_STRING "${LIBUNWIND_VERSION_MAJOR}.${LIBUNWIND_VERSION_MINOR}.${LIBUNWIND_VERSION_EXTRA}")
0042   else(not LIBUNWIND_VERSION_EXTRA)
0043     set(LIBUNWIND_VERSION_STRING "${LIBUNWIND_VERSION_MAJOR}.${LIBUNWIND_VERSION_MINOR}")
0044   endif()
0045   unset(LIBUNWIND_HEADER_CONTENTS)
0046 endif()
0047 
0048 if (LIBUNWIND_LIBRARY)
0049   include(CheckCSourceCompiles)
0050   set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
0051   set(CMAKE_REQUIRED_QUIET ${Libunwind_FIND_QUIETLY})
0052   set(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES})
0053   set(CMAKE_REQUIRED_LIBRARIES ${LIBUNWIND_LIBRARY})
0054   set(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
0055   set(CMAKE_REQUIRED_INCLUDES ${LIBUNWIND_INCLUDE_DIR})
0056   check_c_source_compiles("#define UNW_LOCAL_ONLY 1\n#include <libunwind.h>\nint main() { unw_context_t context; unw_getcontext(&context); return 0; }"
0057                           LIBUNWIND_HAS_UNW_GETCONTEXT)
0058   check_c_source_compiles("#define UNW_LOCAL_ONLY 1\n#include <libunwind.h>\nint main() { unw_context_t context; unw_cursor_t cursor; unw_getcontext(&context); unw_init_local(&cursor, &context); return 0; }"
0059                           LIBUNWIND_HAS_UNW_INIT_LOCAL)
0060   check_c_source_compiles("#define UNW_LOCAL_ONLY 1\n#include <libunwind.h>\nint main() { void* buf[10]; unw_backtrace(buf, 10); return 0; }" LIBUNWIND_HAS_UNW_BACKTRACE)
0061   check_c_source_compiles ("#define UNW_LOCAL_ONLY 1\n#include <libunwind.h>\nint main() { void* buf[10]; unw_backtrace_skip(buf, 10, 2); return 0; }" LIBUNWIND_HAS_UNW_BACKTRACE_SKIP)
0062   check_c_source_compiles ("#define UNW_LOCAL_ONLY 1\n#include <libunwind.h>\nint main() { return unw_set_cache_size(unw_local_addr_space, 1024, 0); }" LIBUNWIND_HAS_UNW_SET_CACHE_SIZE)
0063   check_c_source_compiles ("#define UNW_LOCAL_ONLY 1\n#include <libunwind.h>\nint main() { return unw_set_caching_policy(unw_local_addr_space, UNW_CACHE_PER_THREAD); }" LIBUNWIND_HAS_UNW_CACHE_PER_THREAD)
0064   set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
0065   set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_SAVE})
0066   set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
0067 endif ()
0068 
0069 include(FindPackageHandleStandardArgs)
0070 FIND_PACKAGE_HANDLE_STANDARD_ARGS(Libunwind  REQUIRED_VARS  LIBUNWIND_INCLUDE_DIR
0071                                                             LIBUNWIND_LIBRARY
0072                                                             LIBUNWIND_HAS_UNW_BACKTRACE
0073                                              VERSION_VAR    LIBUNWIND_VERSION_STRING
0074                                  )
0075 
0076 if (LIBUNWIND_FOUND)
0077   set(LIBUNWIND_LIBRARIES ${LIBUNWIND_LIBRARY})
0078   set(LIBUNWIND_INCLUDE_DIRS ${LIBUNWIND_INCLUDE_DIR})
0079 endif ()
0080 
0081 mark_as_advanced( LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARY )