File: FindLibunwind.cmake

package info (click to toggle)
simgrid 3.25%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 23,308 kB
  • sloc: cpp: 100,922; ansic: 68,086; fortran: 6,061; xml: 5,176; f90: 5,123; java: 4,094; python: 2,623; perl: 1,843; sh: 1,241; makefile: 47; javascript: 7; sed: 6
file content (99 lines) | stat: -rw-r--r-- 3,362 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Search for libunwind and components, both includes and libraries
#
# Copyright (C) 2003-2020 The SimGrid Team.
# This is distributed under the LGPL licence but please contact us for
# relicensing if you need. This is merely free software, no matter the licence.
#
#
# Input environment variables:
#    LIBUNWIND_HINT: path to libunwind installation (e.g., /usr)
#                    (only needed for non-standard installs)
#
# You can tune the needed components here.
# TODO: we should take this as a parameter if I knew how to do so.

# SimGrid needs unwind-ptrace on Linux and FreeBSD
if("${CMAKE_SYSTEM}" MATCHES "Linux|FreeBSD")
  set(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} unwind-ptrace unwind-generic)
endif()

#
#  Output variables:
#     HAVE_LIBUNWIND     : if all components were found was found
#     LIBUNWIND_LIBRARIES: List of all libraries to load (-lunwind -lunwind-x86_64 and such)
#
#  Other effects:
#    - Calls include_directories() on where libunwind.h lives
#    - Calls link_directories() on where the libs live

# Of course also need the core lib
set(LIBUNWIND_COMPONENTS ${LIBUNWIND_COMPONENTS} "unwind")

message(STATUS "Looking for libunwind:")
# Let's assume we have it, and invalidate if parts are missing
SET(HAVE_LIBUNWIND 1)

#
# Search for the header file
#

find_path(PATH_LIBUNWIND_H "libunwind.h"
  HINTS
    $ENV{LIBUNWIND_HINT}
    $ENV{LD_LIBRARY_PATH}
  PATH_SUFFIXES include/ GnuWin32/include
  PATHS /opt /opt/local /opt/csw /sw /usr)
if(PATH_LIBUNWIND_H)
  string(REGEX REPLACE "/libunwind.h"               "" PATH_LIBUNWIND_H   "${PATH_LIBUNWIND_H}")
  message("   Found libunwind.h in ${PATH_LIBUNWIND_H}")
  include_directories(${PATH_LIBUNWIND_H})
else()
  message("   NOT FOUND libunwind.h")
  SET(HAVE_LIBUNWIND 0)
endif()
mark_as_advanced(PATH_LIBUNWIND_H)

#
# Search for the library components
#

foreach(component ${LIBUNWIND_COMPONENTS})
  find_library(PATH_LIBUNWIND_LIB_${component}
    NAMES ${component}
    HINTS
      $ENV{LIBUNWIND_HINT}
      $ENV{LD_LIBRARY_PATH}
    PATH_SUFFIXES lib/ GnuWin32/lib lib/system
    PATHS /opt /opt/local /opt/csw /sw /usr /usr/lib/)
  if(PATH_LIBUNWIND_LIB_${component})
    # message("     ${component}  ${PATH_LIBUNWIND_LIB_${component}}")
    string(REGEX REPLACE "/lib${component}.*[.]${LIB_EXE}$" "" PATH_LIBUNWIND_LIB_${component} "${PATH_LIBUNWIND_LIB_${component}}")
    message("   Found lib${component}.${LIB_EXE} in ${PATH_LIBUNWIND_LIB_${component}}")
    link_directories(${PATH_LIBUNWIND_LIB_${component}})

    if(${component} STREQUAL "unwind" AND APPLE)
        # Apple forbids to link directly against its libunwind implementation
        # So let's comply to that stupid restriction and link against the System framework
        SET(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES} -lSystem")
    else()
        SET(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES} -l${component}")
    endif()
	
  else()
    message("   Looking for lib${component}.${LIB_EXE} - not found")
    SET(HAVE_LIBUNWIND 0)
  endif()
  mark_as_advanced(PATH_LIBUNWIND_LIB_${component})
endforeach()
unset(component)
unset(LIBUNWIND_COMPONENTS)

#
# Conclude and cleanup
#
if(HAVE_LIBUNWIND)
  message(STATUS "Dependencies induced by libunwind: ${LIBUNWIND_LIBRARIES}")
else()
  message(STATUS "Some libunwind components are missing")
  set(LIBUNWIND_LIBRARIES "")
endif()