|
@@ -1336,3 +1336,50 @@ macro(CheckLibUDev)
|
|
|
endif()
|
|
|
endif()
|
|
|
endmacro()
|
|
|
+
|
|
|
+
|
|
|
+macro(CheckLibUnwind)
|
|
|
+ set(found_libunwind FALSE)
|
|
|
+ set(_libunwind_src "#include <libunwind.h>\nint main() {unw_context_t context; unw_getcontext(&context); return 0;}")
|
|
|
+
|
|
|
+ if(NOT found_libunwind)
|
|
|
+ cmake_push_check_state()
|
|
|
+ check_c_source_compiles("${_libunwind_src}" LIBC_HAS_WORKING_LIBUNWIND)
|
|
|
+ cmake_pop_check_state()
|
|
|
+ if(LIBC_HAS_WORKING_LIBUNWIND)
|
|
|
+ set(found_libunwind TRUE)
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ if(NOT found_libunwind)
|
|
|
+ cmake_push_check_state()
|
|
|
+ list(APPEND CMAKE_REQUIRED_LIBRARIES "unwind")
|
|
|
+ check_c_source_compiles("${_libunwind_src}" LIBUNWIND_HAS_WORKINGLIBUNWIND)
|
|
|
+ cmake_pop_check_state()
|
|
|
+ if(LIBUNWIND_HAS_WORKINGLIBUNWIND)
|
|
|
+ set(found_libunwind TRUE)
|
|
|
+ list(APPEND EXTRA_TEST_LIBS unwind)
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ if(NOT found_libunwind)
|
|
|
+ set(LibUnwind_PKG_CONFIG_SPEC libunwind libunwind-generic)
|
|
|
+ pkg_check_modules(PC_LIBUNWIND IMPORTED_TARGET ${LibUnwind_PKG_CONFIG_SPEC})
|
|
|
+ if(PC_LIBUNWIND_FOUND)
|
|
|
+ cmake_push_check_state()
|
|
|
+ list(APPEND CMAKE_REQUIRED_LIBRARIES ${PC_LIBUNWIND_LIBRARIES})
|
|
|
+ list(APPEND CMAKE_REQUIRED_INCLUDES ${PC_LIBUNWIND_INCLUDE_DIRS})
|
|
|
+ check_c_source_compiles("${_libunwind_src}" PC_LIBUNWIND_HAS_WORKING_LIBUNWIND)
|
|
|
+ cmake_pop_check_state()
|
|
|
+ if(PC_LIBUNWIND_HAS_WORKING_LIBUNWIND)
|
|
|
+ set(found_libunwind TRUE)
|
|
|
+ list(APPEND EXTRA_TEST_LIBS ${PC_LIBUNWIND_LIBRARIES})
|
|
|
+ list(APPEND EXTRA_TEST_INCLUDES ${PC_LIBUNWIND_INCLUDE_DIRS})
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ if(found_libunwind)
|
|
|
+ set(HAVE_LIBUNWIND_H TRUE)
|
|
|
+ endif()
|
|
|
+endmacro()
|