Skip to content

Commit 9a56f9e

Browse files
Improve dependency handling for libunwind and installation relocatability (#314)
Fixes #287
1 parent cbf945d commit 9a56f9e

File tree

4 files changed

+58
-41
lines changed

4 files changed

+58
-41
lines changed

CMakeLists.txt

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -474,39 +474,9 @@ if(CPPTRACE_UNWIND_WITH_UNWIND)
474474
endif()
475475

476476
if(CPPTRACE_UNWIND_WITH_LIBUNWIND)
477-
find_package(PkgConfig)
478-
if(PkgConfig_FOUND)
479-
pkg_check_modules(LIBUNWIND QUIET libunwind)
480-
if(LIBUNWIND_FOUND)
481-
target_compile_options(${target_name} PRIVATE ${LIBUNWIND_CFLAGS_OTHER})
482-
target_include_directories(${target_name} PRIVATE ${LIBUNWIND_INCLUDE_DIRS})
483-
target_link_libraries(${target_name} PRIVATE ${LIBUNWIND_LDFLAGS})
484-
endif()
485-
endif()
486-
if(NOT LIBUNWIND_FOUND)
487-
if (NOT APPLE)
488-
# set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON)
489-
# set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB32_PATHS ON)
490-
find_path(LIBUNWIND_INCLUDE_DIRS NAMES "libunwind.h")
491-
find_library(LIBUNWIND NAMES unwind libunwind libunwind8 libunwind.so.8 REQUIRED PATHS "/usr/lib/x86_64-linux-gnu/")
492-
if(LIBUNWIND)
493-
set(LIBUNWIND_FOUND TRUE)
494-
endif()
495-
if(NOT LIBUNWIND_FOUND)
496-
# message(FATAL_ERROR "Unable to locate libunwind")
497-
# Try to link with it if it's where it should be
498-
# This path can be entered if libunwind was installed via the system package manager, sometimes. I probably messed
499-
# up the find_library above.
500-
set(LIBUNWIND_LDFLAGS "-lunwind")
501-
endif()
502-
if(NOT LIBUNWIND_LDFLAGS)
503-
set(LIBUNWIND_LDFLAGS "${LIBUNWIND}")
504-
endif()
505-
target_compile_options(${target_name} PRIVATE ${LIBUNWIND_CFLAGS_OTHER})
506-
target_include_directories(${target_name} PRIVATE ${LIBUNWIND_INCLUDE_DIRS})
507-
target_link_libraries(${target_name} PRIVATE ${LIBUNWIND_LDFLAGS})
508-
endif()
509-
endif()
477+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
478+
find_package(Libunwind REQUIRED)
479+
target_link_libraries(${target_name} PRIVATE Libunwind::Libunwind)
510480
target_compile_definitions(${target_name} PRIVATE CPPTRACE_UNWIND_WITH_LIBUNWIND UNW_LOCAL_ONLY)
511481
endif()
512482

cmake/FindLibunwind.cmake

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Find module for libunwind, providing Libunwind::Libunwind
2+
3+
if(APPLE)
4+
# On Apple, libunwind is built into the system. Headers are available via the SDK, no library is needed.
5+
set(Libunwind_FOUND TRUE)
6+
if(NOT TARGET Libunwind::Libunwind)
7+
add_library(Libunwind::Libunwind INTERFACE IMPORTED)
8+
endif()
9+
else()
10+
# Use pkg-config for hints
11+
find_package(PkgConfig QUIET)
12+
if(PkgConfig_FOUND)
13+
pkg_check_modules(_LIBUNWIND QUIET libunwind)
14+
endif()
15+
16+
find_path(Libunwind_INCLUDE_DIR NAMES libunwind.h HINTS ${_LIBUNWIND_INCLUDE_DIRS})
17+
find_library(Libunwind_LIBRARY NAMES unwind libunwind HINTS ${_LIBUNWIND_LIBRARY_DIRS})
18+
19+
include(FindPackageHandleStandardArgs)
20+
find_package_handle_standard_args(
21+
Libunwind DEFAULT_MSG
22+
Libunwind_LIBRARY Libunwind_INCLUDE_DIR
23+
)
24+
25+
if(Libunwind_FOUND)
26+
message(STATUS "Found Libunwind: ${Libunwind_LIBRARY}")
27+
endif()
28+
29+
mark_as_advanced(Libunwind_INCLUDE_DIR Libunwind_LIBRARY)
30+
31+
if(Libunwind_FOUND AND NOT TARGET Libunwind::Libunwind)
32+
add_library(Libunwind::Libunwind UNKNOWN IMPORTED)
33+
set_target_properties(
34+
Libunwind::Libunwind
35+
PROPERTIES
36+
IMPORTED_LOCATION "${Libunwind_LIBRARY}"
37+
INTERFACE_INCLUDE_DIRECTORIES "${Libunwind_INCLUDE_DIR}"
38+
)
39+
endif()
40+
endif()

cmake/InstallRules.cmake

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,13 @@ if(CPPTRACE_PROVIDE_EXPORT_SET)
8181
)
8282
endif()
8383

84-
# Findzstd.cmake
84+
# Find modules for dependencies
8585
# vcpkg doesn't like anything being put in share/, which is where this goes apparently on their setup
8686
if(NOT CPPTRACE_VCPKG)
8787
install(
88-
FILES "${PROJECT_SOURCE_DIR}/cmake/Findzstd.cmake"
88+
FILES
89+
"${PROJECT_SOURCE_DIR}/cmake/Findzstd.cmake"
90+
"${PROJECT_SOURCE_DIR}/cmake/FindLibunwind.cmake"
8991
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}"
9092
)
9193
endif()

cmake/in/cpptrace-config-cmake.in

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,28 @@
22
@PACKAGE_INIT@
33

44
# Dependencies
5+
include(CMakeFindDependencyMacro)
6+
set(CMAKE_MODULE_PATH_OLD "${CMAKE_MODULE_PATH}")
7+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
8+
59
if(@CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF@)
6-
include(CMakeFindDependencyMacro)
7-
# we don't go the Findzstd.cmake route on vcpkg
810
if(@CPPTRACE_VCPKG@)
911
find_dependency(zstd CONFIG REQUIRED)
1012
else()
11-
set(CMAKE_MODULE_PATH_OLD "${CMAKE_MODULE_PATH}")
12-
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_LIST_DIR}")
1313
find_dependency(zstd)
14-
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH_OLD}")
15-
unset(CMAKE_MODULE_PATH_OLD)
1614
endif()
1715
if(NOT @CPPTRACE_FIND_LIBDWARF_WITH_PKGCONFIG@)
1816
find_dependency(libdwarf REQUIRED)
1917
endif()
2018
endif()
2119

20+
if(@CPPTRACE_UNWIND_WITH_LIBUNWIND@)
21+
find_dependency(Libunwind)
22+
endif()
23+
24+
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH_OLD}")
25+
unset(CMAKE_MODULE_PATH_OLD)
26+
2227
# We cannot modify an existing IMPORT target
2328
if(NOT TARGET cpptrace::cpptrace)
2429

0 commit comments

Comments
 (0)