Files
gnss-sdr/cmake/Modules/FindLIBBLADERF.cmake
T

167 lines
6.2 KiB
CMake

# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
# Tries to find libbladeRF.
#
# Usage of this module as follows:
#
# find_package(LIBBLADERF)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# LIBBLADERF_ROOT Set this variable to the root installation of
# libbladeRF if the module has problems finding
# the proper installation path.
#
# Variables defined by this module:
#
# LIBBLADERF_FOUND System has libbladeRF libs/headers
# LIBBLADERF_LIBRARIES The libbladeRF libraries (bladeRF)
# LIBBLADERF_INCLUDE_DIRS The location of libbladeRF headers
# LIBBLADERF_VERSION The detected libbladeRF version
#
# Provides the following imported target:
# Bladerf::bladerf
#
if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
pkg_check_modules(PC_LIBBLADERF libbladeRF)
if(NOT LIBBLADERF_ROOT)
set(LIBBLADERF_ROOT_USER_DEFINED /usr)
else()
set(LIBBLADERF_ROOT_USER_DEFINED ${LIBBLADERF_ROOT})
endif()
if(DEFINED ENV{LIBBLADERF_ROOT})
set(LIBBLADERF_ROOT_USER_DEFINED
${LIBBLADERF_ROOT_USER_DEFINED}
$ENV{LIBBLADERF_ROOT}
)
endif()
set(LIBBLADERF_ROOT_USER_DEFINED
${LIBBLADERF_ROOT_USER_DEFINED}
${CMAKE_INSTALL_PREFIX}
)
find_path(LIBBLADERF_INCLUDE_DIRS
NAMES libbladeRF.h
HINTS ${PC_LIBBLADERF_INCLUDEDIR}
PATHS ${LIBBLADERF_ROOT_USER_DEFINED}/include
${GNSSSDR_INCLUDE_PATHS}
)
find_library(LIBBLADERF_LIBRARIES
NAMES bladeRF
HINTS ${PC_LIBBLADERF_LIBDIR}
PATHS ${LIBBLADERF_ROOT_USER_DEFINED}/lib
${LIBBLADERF_ROOT_USER_DEFINED}/lib64
${GNSSSDR_LIB_PATHS}
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LIBBLADERF DEFAULT_MSG LIBBLADERF_LIBRARIES LIBBLADERF_INCLUDE_DIRS)
if(PC_LIBBLADERF_VERSION)
set(LIBBLADERF_VERSION ${PC_LIBBLADERF_VERSION})
elseif(LIBBLADERF_INCLUDE_DIRS)
set(_LIBBLADERF_VERSION_HEADER "${LIBBLADERF_INCLUDE_DIRS}/libbladeRF.h")
if(EXISTS "${_LIBBLADERF_VERSION_HEADER}")
file(STRINGS "${_LIBBLADERF_VERSION_HEADER}"
_LIBBLADERF_API_VERSION_LINE
REGEX "^#[ \t]*define[ \t]+LIBBLADERF_API_VERSION[ \t]+\\(?0[xX][0-9A-Fa-f]+\\)?"
)
if(_LIBBLADERF_API_VERSION_LINE MATCHES "0[xX]([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])[0-9A-Fa-f][0-9A-Fa-f]")
# LIBBLADERF_API_VERSION encodes major, minor, patch, and reserved
# components in one byte each, starting with the most significant.
set(_LIBBLADERF_VERSION_HEX_DIGITS "0123456789ABCDEF")
foreach(_LIBBLADERF_VERSION_COMPONENT MAJOR MINOR PATCH)
if(_LIBBLADERF_VERSION_COMPONENT STREQUAL "MAJOR")
set(_LIBBLADERF_VERSION_HIGH_NIBBLE "${CMAKE_MATCH_1}")
set(_LIBBLADERF_VERSION_LOW_NIBBLE "${CMAKE_MATCH_2}")
elseif(_LIBBLADERF_VERSION_COMPONENT STREQUAL "MINOR")
set(_LIBBLADERF_VERSION_HIGH_NIBBLE "${CMAKE_MATCH_3}")
set(_LIBBLADERF_VERSION_LOW_NIBBLE "${CMAKE_MATCH_4}")
else()
set(_LIBBLADERF_VERSION_HIGH_NIBBLE "${CMAKE_MATCH_5}")
set(_LIBBLADERF_VERSION_LOW_NIBBLE "${CMAKE_MATCH_6}")
endif()
string(TOUPPER "${_LIBBLADERF_VERSION_HIGH_NIBBLE}"
_LIBBLADERF_VERSION_HIGH_NIBBLE
)
string(TOUPPER "${_LIBBLADERF_VERSION_LOW_NIBBLE}"
_LIBBLADERF_VERSION_LOW_NIBBLE
)
string(FIND "${_LIBBLADERF_VERSION_HEX_DIGITS}"
"${_LIBBLADERF_VERSION_HIGH_NIBBLE}"
_LIBBLADERF_VERSION_HIGH_NIBBLE
)
string(FIND "${_LIBBLADERF_VERSION_HEX_DIGITS}"
"${_LIBBLADERF_VERSION_LOW_NIBBLE}"
_LIBBLADERF_VERSION_LOW_NIBBLE
)
math(EXPR _LIBBLADERF_VERSION_${_LIBBLADERF_VERSION_COMPONENT}
"${_LIBBLADERF_VERSION_HIGH_NIBBLE} * 16 + ${_LIBBLADERF_VERSION_LOW_NIBBLE}"
)
endforeach()
set(LIBBLADERF_VERSION
"${_LIBBLADERF_VERSION_MAJOR}.${_LIBBLADERF_VERSION_MINOR}.${_LIBBLADERF_VERSION_PATCH}"
)
endif()
endif()
endif()
if(LIBBLADERF_FOUND AND DEFINED GNSSSDR_LIBBLADERF_MIN_VERSION)
if(NOT LIBBLADERF_VERSION)
message(STATUS "libbladeRF was found, but its version could not be determined. GNSS-SDR requires at least v${GNSSSDR_LIBBLADERF_MIN_VERSION}")
set(LIBBLADERF_FOUND FALSE)
unset(LIBBLADERF_LIBRARIES CACHE)
unset(LIBBLADERF_INCLUDE_DIRS CACHE)
elseif(LIBBLADERF_VERSION VERSION_LESS GNSSSDR_LIBBLADERF_MIN_VERSION)
message(STATUS "libbladeRF v${LIBBLADERF_VERSION} was found, but GNSS-SDR requires at least v${GNSSSDR_LIBBLADERF_MIN_VERSION}. Please upgrade libbladeRF: https://github.com/Nuand/bladeRF")
set(LIBBLADERF_FOUND FALSE)
unset(LIBBLADERF_LIBRARIES CACHE)
unset(LIBBLADERF_INCLUDE_DIRS CACHE)
endif()
endif()
if(LIBBLADERF_FOUND AND LIBBLADERF_VERSION)
set_package_properties(LIBBLADERF PROPERTIES
DESCRIPTION "Nuand bladeRF library (found: v${LIBBLADERF_VERSION})"
)
else()
set_package_properties(LIBBLADERF PROPERTIES
DESCRIPTION "Nuand bladeRF library"
)
endif()
set_package_properties(LIBBLADERF PROPERTIES
URL "https://github.com/Nuand/bladeRF"
)
if(LIBBLADERF_FOUND AND NOT TARGET Bladerf::bladerf)
add_library(Bladerf::bladerf SHARED IMPORTED)
set_target_properties(Bladerf::bladerf PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${LIBBLADERF_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${LIBBLADERF_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${LIBBLADERF_LIBRARIES}"
)
endif()
mark_as_advanced(LIBBLADERF_LIBRARIES LIBBLADERF_INCLUDE_DIRS)