2022-07-25 07:48:17 +00:00
|
|
|
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
|
|
|
# This file is part of GNSS-SDR.
|
|
|
|
#
|
|
|
|
# SPDX-FileCopyrightText: 2022 C. Fernandez-Prades cfernandez(at)cttc.es
|
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
|
|
|
# Find the libunwind library
|
|
|
|
#
|
|
|
|
# LIBUNWIND_FOUND - True if libunwind was found.
|
|
|
|
# LIBUNWIND_LIBRARIES - The libraries needed to use libunwind
|
|
|
|
# LIBUNWIND_INCLUDE_DIR - Location of libunwind.h
|
|
|
|
|
|
|
|
# INPUT (Optional):
|
|
|
|
# LIBUNWIND_ROOT - path where include + lib of libunwind install is located
|
|
|
|
|
|
|
|
if(NOT COMMAND feature_summary)
|
|
|
|
include(FeatureSummary)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
find_path(LIBUNWIND_INCLUDE_DIR
|
|
|
|
NAMES
|
|
|
|
libunwind.h
|
|
|
|
unwind.h
|
|
|
|
HINTS
|
|
|
|
/usr
|
|
|
|
/usr/local
|
|
|
|
/opt/local
|
|
|
|
PATH_SUFFIXES include
|
|
|
|
PATHS "${LIBUNWIND_ROOT}/include"
|
|
|
|
)
|
|
|
|
|
|
|
|
find_library(LIBUNWIND_GENERIC_LIBRARY
|
|
|
|
NAMES
|
2022-07-27 11:19:36 +00:00
|
|
|
libunwind
|
2022-07-25 07:48:17 +00:00
|
|
|
unwind
|
|
|
|
HINTS
|
|
|
|
/usr
|
|
|
|
/usr/local
|
|
|
|
/opt/local
|
|
|
|
PATH_SUFFIXES lib lib64
|
|
|
|
PATHS
|
2022-07-25 08:13:46 +00:00
|
|
|
"${LIBUNWIND_ROOT}/lib"
|
|
|
|
"${LIBUNWIND_ROOT}/lib64"
|
2022-07-25 07:48:17 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
if(LIBUNWIND_INCLUDE_DIR)
|
|
|
|
if(LIBUNWIND_GENERIC_LIBRARY)
|
|
|
|
set(LIBUNWIND_LIBRARIES ${LIBUNWIND_GENERIC_LIBRARY})
|
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)")
|
|
|
|
set(LIBUNWIND_ARCH "aarch64")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
|
|
|
|
set(LIBUNWIND_ARCH "arm")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(corei7-64)")
|
|
|
|
set(LIBUNWIND_ARCH "x86_64")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
|
|
|
|
set(LIBUNWIND_ARCH "x86")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64")
|
|
|
|
set(LIBUNWIND_ARCH "ppc64")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc")
|
|
|
|
set(LIBUNWIND_ARCH "ppc32")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
|
|
|
|
set(LIBUNWIND_ARCH "mips")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^hppa")
|
|
|
|
set(LIBUNWIND_ARCH "hppa")
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^ia64")
|
|
|
|
set(LIBUNWIND_ARCH "ia64")
|
|
|
|
endif()
|
|
|
|
if(LIBUNWIND_ARCH)
|
|
|
|
find_library(LIBUNWIND_SPECIFIC_LIBRARY
|
|
|
|
NAMES
|
2022-07-27 11:19:36 +00:00
|
|
|
libunwind-${LIBUNWIND_ARCH}
|
2022-07-25 07:48:17 +00:00
|
|
|
"unwind-${LIBUNWIND_ARCH}"
|
|
|
|
HINTS
|
|
|
|
/usr
|
|
|
|
/usr/local
|
|
|
|
/opt/local
|
2022-07-25 08:13:46 +00:00
|
|
|
PATH_SUFFIXES lib lib64
|
2022-07-25 07:48:17 +00:00
|
|
|
PATHS "${LIBUNWIND_ROOT}"
|
|
|
|
)
|
|
|
|
if(NOT LIBUNWIND_SPECIFIC_LIBRARY)
|
|
|
|
message(STATUS " -- Failed to find unwind-${LIBUNWIND_ARCH}")
|
|
|
|
else()
|
|
|
|
set(LIBUNWIND_LIBRARIES ${LIBUNWIND_LIBRARIES} ${LIBUNWIND_SPECIFIC_LIBRARY})
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
message(STATUS " -- Could NOT find libunwind.h")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
|
|
find_package_handle_standard_args(LIBUNWIND DEFAULT_MSG LIBUNWIND_INCLUDE_DIR)
|
|
|
|
|
|
|
|
if(LIBUNWIND_FOUND)
|
|
|
|
set(_Unwind_VERSION_HEADER ${LIBUNWIND_INCLUDE_DIR}/libunwind-common.h)
|
|
|
|
if(EXISTS ${_Unwind_VERSION_HEADER})
|
|
|
|
file(READ ${_Unwind_VERSION_HEADER} _Unwind_VERSION_CONTENTS)
|
|
|
|
string(REGEX REPLACE ".*#define UNW_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1"
|
|
|
|
LIBUNWIND_VERSION_MAJOR "${_Unwind_VERSION_CONTENTS}")
|
|
|
|
string(REGEX REPLACE ".*#define UNW_VERSION_MINOR[ \t]+([0-9]+).*" "\\1"
|
|
|
|
LIBUNWIND_VERSION_MINOR "${_Unwind_VERSION_CONTENTS}")
|
|
|
|
string(REGEX REPLACE ".*#define UNW_VERSION_EXTRA[ \t]+([0-9]+).*" "\\1"
|
|
|
|
LIBUNWIND_VERSION_PATCH "${_Unwind_VERSION_CONTENTS}")
|
|
|
|
set(LIBUNWIND_VERSION ${LIBUNWIND_VERSION_MAJOR}.${LIBUNWIND_VERSION_MINOR})
|
|
|
|
if(CMAKE_MATCH_0)
|
|
|
|
# Third version component may be empty
|
|
|
|
set(LIBUNWIND_VERSION ${LIBUNWIND_VERSION}.${LIBUNWIND_VERSION_PATCH})
|
|
|
|
set(LIBUNWIND_VERSION_COMPONENTS 3)
|
|
|
|
else()
|
|
|
|
set(LIBUNWIND_VERSION_COMPONENTS 2)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(LIBUNWIND_FOUND AND NOT TARGET Libunwind::libunwind)
|
2022-07-27 11:19:36 +00:00
|
|
|
if(LIBUNWIND_GENERIC_LIBRARY)
|
|
|
|
add_library(Libunwind::libunwind SHARED IMPORTED)
|
|
|
|
set_target_properties(Libunwind::libunwind PROPERTIES
|
|
|
|
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
|
|
|
IMPORTED_LOCATION "${LIBUNWIND_GENERIC_LIBRARY}"
|
|
|
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBUNWIND_INCLUDE_DIR}"
|
|
|
|
INTERFACE_LINK_LIBRARIES "${LIBUNWIND_LIBRARIES}"
|
|
|
|
)
|
|
|
|
else()
|
|
|
|
add_library(Libunwind::libunwind INTERFACE IMPORTED)
|
|
|
|
set_target_properties(Libunwind::libunwind PROPERTIES
|
|
|
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBUNWIND_INCLUDE_DIR}"
|
|
|
|
)
|
|
|
|
endif()
|
2022-07-25 07:48:17 +00:00
|
|
|
endif()
|
|
|
|
|
|
|
|
set_package_properties(LIBUNWIND PROPERTIES
|
|
|
|
URL "https://www.nongnu.org/libunwind/"
|
|
|
|
)
|
|
|
|
if(LIBUNWIND_VERSION)
|
|
|
|
set_package_properties(LIBUNWIND PROPERTIES
|
|
|
|
DESCRIPTION "Portable and efficient C programming interface to determine the call-chain of a program (found: v${LIBUNWIND_VERSION})"
|
|
|
|
)
|
|
|
|
else()
|
|
|
|
set_package_properties(LIBUNWIND PROPERTIES
|
|
|
|
DESCRIPTION "Portable and efficient C programming interface to determine the call-chain of a program"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
mark_as_advanced(LIBUNWIND_LIBRARIES LIBUNWIND_INCLUDE_DIR)
|