Skip to content

Commit

Permalink
Use libunwind as an imported target
Browse files Browse the repository at this point in the history
When UNWIND_LIBRARY is used directly as a public dependency then
absolute path is stored in cmake config file. This is an issue when
glog is used as part of an SDK, which was built somewhere else. When
SDK is installed on developer's machine, cmake config contains a full
path to non-existent location. The solution is to find libunwind
during configure stage and store target name as a dependency, not a full path

Signed-off-by: Vyacheslav Yurkov <[email protected]>
  • Loading branch information
UVV-gh committed Nov 2, 2018
1 parent 8d7a107 commit 30b33a8
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 8 deletions.
13 changes: 5 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ check_include_file (dlfcn.h HAVE_DLFCN_H)
check_include_file (execinfo.h HAVE_EXECINFO_H)
check_include_file (glob.h HAVE_GLOB_H)
check_include_file (inttypes.h HAVE_INTTYPES_H)
check_include_file (libunwind.h HAVE_LIBUNWIND_H)
check_include_file (memory.h HAVE_MEMORY_H)
check_include_file (pwd.h HAVE_PWD_H)
check_include_file (stdint.h HAVE_STDINT_H)
Expand All @@ -78,7 +77,6 @@ check_include_file (syscall.h HAVE_SYSCALL_H)
check_include_file (syslog.h HAVE_SYSLOG_H)
check_include_file (ucontext.h HAVE_UCONTEXT_H)
check_include_file (unistd.h HAVE_UNISTD_H)
check_include_file (unwind.h HAVE_UNWIND_H)
check_include_file (pwd.h HAVE_PWD_H)

check_include_file_cxx ("ext/hash_map" HAVE_EXT_HASH_MAP)
Expand Down Expand Up @@ -114,11 +112,9 @@ check_cxx_compiler_flag (-Wunnamed-type-template-args
# snprintf as an inline function
check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)

check_library_exists (unwind get_static_proc_name "" HAVE_LIB_UNWIND)
check_library_exists (dbghelp UnDecorateSymbolName "" HAVE_DBGHELP)

find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
mark_as_advanced (UNWIND_LIBRARY)
find_package(Libunwind)

check_c_source_compiles ("
#include <stdlib.h>
Expand Down Expand Up @@ -463,9 +459,9 @@ add_library(glog::glog ALIAS glog)

set_target_properties (glog PROPERTIES POSITION_INDEPENDENT_CODE ON)

if (UNWIND_LIBRARY)
target_link_libraries (glog PUBLIC ${UNWIND_LIBRARY})
endif (UNWIND_LIBRARY)
if (Libunwind_FOUND)
target_link_libraries (glog PUBLIC unwind)
endif (Libunwind_FOUND)

if (HAVE_DBGHELP)
target_link_libraries (glog PUBLIC dbghelp)
Expand Down Expand Up @@ -669,6 +665,7 @@ export (PACKAGE glog)
install (FILES
${CMAKE_CURRENT_BINARY_DIR}/glog-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindLibunwind.cmake
DESTINATION ${_glog_CMake_INSTALLDIR})

install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
Expand Down
37 changes: 37 additions & 0 deletions cmake/FindLibunwind.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# - Try to find libunwind
# Once done this will define
#
# LIBUNWIND_FOUND - system has libunwind
# unwind - cmake target for libunwind

find_library (UNWIND_LIBRARY NAMES unwind DOC "unwind library")
include (CheckIncludeFile)
check_include_file (libunwind.h HAVE_LIBUNWIND_H)
check_include_file (unwind.h HAVE_UNWIND_H)

if (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
set(LIBUNWIND_ARCH "arm")
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" OR
set(LIBUNWIND_ARCH "x86_64")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
set(LIBUNWIND_ARCH "x86")
endif()

find_library (UNWIND_LIBRARY_PLATFORM NAMES "unwind-${LIBUNWIND_ARCH}" DOC "unwind library platform")
if (UNWIND_LIBRARY_PLATFORM)
set(HAVE_LIB_UNWIND "1")
endif()

include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set Libunwind_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(Libunwind DEFAULT_MSG
UNWIND_LIBRARY HAVE_LIBUNWIND_H HAVE_UNWIND_H HAVE_LIB_UNWIND)

mark_as_advanced (UNWIND_LIBRARY UNWIND_LIBRARY_PLATFORM)

add_library(unwind INTERFACE IMPORTED)
set_target_properties(unwind PROPERTIES
INTERFACE_LINK_LIBRARIES "${UNWIND_LIBRARY};${UNWIND_LIBRARY_PLATFORM}"
)
11 changes: 11 additions & 0 deletions glog-config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,15 @@ include (CMakeFindDependencyMacro)

@gflags_DEPENDENCY@

# Record the state of the CMake module path when this script was
# called so that we can ensure that we leave it in the same state on
# exit as it was on entry, but modify it locally.
set(UNWIND_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
find_dependency (Libunwind)

# Restore original module path
set(CMAKE_MODULE_PATH "${UNWIND_CMAKE_MODULE_PATH}")

include ("${CMAKE_CURRENT_LIST_DIR}/glog-targets.cmake")

0 comments on commit 30b33a8

Please sign in to comment.