CMake: improve portability and robustness

Refactor Python detection
Improve imported target handling
Improve version detection
Improve naming consistency
This commit is contained in:
Carles Fernandez
2026-04-19 15:28:57 +02:00
parent 830a6ff336
commit e82624d981
44 changed files with 2106 additions and 986 deletions
+48 -36
View File
@@ -264,7 +264,7 @@ endif()
# Enable optimization options in GCC for Release and RelWithDebInfo build types
if((${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU") AND (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
if(NOT (${LINUX_DISTRIBUTION} MATCHES "Fedora") AND NOT (${LINUX_DISTRIBUTION} MATCHES "Gentoo"))
if(NOT ("${LINUX_DISTRIBUTION}" MATCHES "Fedora") AND NOT ("${LINUX_DISTRIBUTION}" MATCHES "Gentoo"))
# flag -O3 enables tree vectorization
# See https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
@@ -603,7 +603,7 @@ if(CMAKE_VERSION VERSION_LESS 3.1)
set_property(TARGET Threads::Threads PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX")
include(GNUInstallDirs)
# Fix bug in Debian 8.11
if(${LINUX_DISTRIBUTION} MATCHES "Debian")
if("${LINUX_DISTRIBUTION}" MATCHES "Debian")
if(${LINUX_VER} VERSION_LESS 8.12)
if(ARCH_64BITS)
set(FIX_PTHREADS_LOCATION "x86_64-linux-gnu/")
@@ -790,7 +790,7 @@ endif()
if(NOT BOOST_ROOT)
# Workaround for Macports
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(${DETECT_MACPORTS} EQUAL 0)
if(DEFINED MACPORTS_PREFIX AND NOT "${MACPORTS_PREFIX}" STREQUAL "")
if(EXISTS "${MACPORTS_PREFIX}/libexec/boost/1.76")
set(BOOST_ROOT "${MACPORTS_PREFIX}/libexec/boost/1.76")
elseif(EXISTS "${MACPORTS_PREFIX}/libexec/boost/1.71")
@@ -1180,9 +1180,9 @@ if(NOT VOLKGNSSSDR_FOUND)
message(STATUS "Mako template library not found. See https://www.makotemplates.org/")
message(STATUS " You can try to install it by typing:")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(STATUS " sudo yum install ${PYTHON_NAME}-mako")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(STATUS " sudo zypper install ${PYTHON_NAME}-Mako")
else()
message(STATUS " sudo apt install ${PYTHON_NAME}-mako")
@@ -1197,9 +1197,9 @@ if(NOT VOLKGNSSSDR_FOUND)
message(STATUS "python-six not found. See https://pythonhosted.org/six/")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
message(STATUS " You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(STATUS " sudo yum install ${PYTHON_NAME}-six")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(STATUS " sudo zypper install ${PYTHON_NAME}-six")
else()
message(STATUS " sudo apt install ${PYTHON_NAME}-six")
@@ -1450,15 +1450,21 @@ if(NOT VOLKGNSSSDR_FOUND)
set_target_properties(Volkgnsssdr::volkgnsssdr PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNSSSDR_BINARY_DIR}/volk_gnsssdr_module/install/${CMAKE_INSTALL_LIBDIR}/libvolk_gnsssdr${CMAKE_STATIC_LIBRARY_SUFFIX}"
INCLUDE_DIRECTORIES "${VOLK_GNSSSDR_INCLUDE_DIRS}"
INTERFACE_INCLUDE_DIRECTORIES "${VOLK_GNSSSDR_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${VOLK_GNSSSDR_LIBRARIES}"
)
if(CMAKE_VERSION VERSION_GREATER 3.0 AND SUPPORTED_CPU_FEATURES_ARCH)
if(NOT CPUFEATURES_FOUND AND ENABLE_CPUFEATURES)
set_target_properties(Volkgnsssdr::volkgnsssdr PROPERTIES
INTERFACE_LINK_LIBRARIES ${GNSSSDR_BINARY_DIR}/volk_gnsssdr_module/install/${CMAKE_INSTALL_LIBDIR}/${CMAKE_FIND_LIBRARY_PREFIXES}cpu_features${CMAKE_STATIC_LIBRARY_SUFFIX}
get_target_property(_volkgnsssdr_link_libraries
Volkgnsssdr::volkgnsssdr INTERFACE_LINK_LIBRARIES
)
list(APPEND _volkgnsssdr_link_libraries
"${GNSSSDR_BINARY_DIR}/volk_gnsssdr_module/install/${CMAKE_INSTALL_LIBDIR}/${CMAKE_FIND_LIBRARY_PREFIXES}cpu_features${CMAKE_STATIC_LIBRARY_SUFFIX}"
)
set_target_properties(Volkgnsssdr::volkgnsssdr PROPERTIES
INTERFACE_LINK_LIBRARIES "${_volkgnsssdr_link_libraries}"
)
unset(_volkgnsssdr_link_libraries)
endif()
endif()
endif()
@@ -1848,9 +1854,9 @@ if(NOT absl_FOUND)
else()
message(" aclocal has not been found.")
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum groupinstall 'Development Tools'")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install automake")
else()
message(" sudo apt install automake")
@@ -1860,9 +1866,9 @@ if(NOT absl_FOUND)
else()
message(" libtool has not been found.")
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum groupinstall 'Development Tools'")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install libtoool")
else()
message(" sudo apt install libtool")
@@ -2065,7 +2071,7 @@ if(NOT BLAS_FOUND)
message(" 'sudo port install lapack' if you are using Macports, or")
message(" 'brew install lapack' if you are using Homebrew.")
else()
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum install blas-devel")
else()
message(" sudo apt install libblas-dev")
@@ -2100,9 +2106,9 @@ if(NOT LAPACK_FOUND)
message(" The LAPACK library has not been found.")
if(LINUX_DISTRIBUTION)
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum install lapack-devel")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install lapack-devel")
else()
message(" sudo apt install liblapack-dev")
@@ -2179,9 +2185,9 @@ if(NOT ARMADILLO_FOUND OR ENABLE_OWN_ARMADILLO)
if(NOT GFORTRAN)
message(STATUS "The gfortran library has not been found.")
message(STATUS " You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(STATUS " sudo yum install gcc-fortran")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(STATUS " sudo zypper install gcc-fortran")
else()
message(STATUS " sudo apt install gfortran")
@@ -2385,9 +2391,9 @@ if(NOT MATIO_FOUND OR MATIO_VERSION_STRING VERSION_LESS ${GNSSSDR_MATIO_MIN_VERS
message(STATUS " $ brew install hdf5")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat" OR ${LINUX_DISTRIBUTION} MATCHES "CentOS")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat" OR "${LINUX_DISTRIBUTION}" MATCHES "CentOS")
message(STATUS " sudo yum install hdf5-devel")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(STATUS " sudo zypper install hdf5-devel")
else()
message(STATUS " sudo apt install libhdf5-dev")
@@ -2402,9 +2408,9 @@ if(NOT MATIO_FOUND OR MATIO_VERSION_STRING VERSION_LESS ${GNSSSDR_MATIO_MIN_VERS
if(NOT EXISTS "/usr/bin/libtoolize")
message(" libtool has not been found.")
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum groupinstall 'Development Tools'")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install libtoool")
else()
message(" sudo apt install libtool")
@@ -2422,9 +2428,9 @@ if(NOT MATIO_FOUND OR MATIO_VERSION_STRING VERSION_LESS ${GNSSSDR_MATIO_MIN_VERS
else()
message(" aclocal has not been found.")
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum groupinstall 'Development Tools'")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install automake")
else()
message(" sudo apt install automake")
@@ -2457,9 +2463,13 @@ if(NOT MATIO_FOUND OR MATIO_VERSION_STRING VERSION_LESS ${GNSSSDR_MATIO_MIN_VERS
endif()
endif()
list(GET HDF5_LIBRARIES 0 HDF5_FIRST_DIR)
get_filename_component(HDF5_BASE_DIR2 ${HDF5_FIRST_DIR} DIRECTORY)
get_filename_component(HDF5_BASE_DIR ${HDF5_BASE_DIR2} DIRECTORY)
if(HDF5_LIBRARIES)
list(GET HDF5_LIBRARIES 0 HDF5_FIRST_DIR)
get_filename_component(HDF5_BASE_DIR2 ${HDF5_FIRST_DIR} DIRECTORY)
get_filename_component(HDF5_BASE_DIR ${HDF5_BASE_DIR2} DIRECTORY)
else()
message(FATAL_ERROR "HDF5 was found but HDF5_LIBRARIES is empty.")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(EXISTS ${MACOS_PACKAGES_PREFIX}/include/hdf5.h)
set(HDF5_BASE_DIR ${MACOS_PACKAGES_PREFIX})
@@ -2813,9 +2823,9 @@ if((NOT Protobuf_FOUND) OR (NOT Protobuf_PROTOC_EXECUTABLE) OR (${Protobuf_VERSI
if(NOT EXISTS "/usr/bin/libtoolize")
message(" libtool has not been found.")
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum groupinstall 'Development Tools'")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install libtoool")
else()
message(" sudo apt install libtool")
@@ -2833,9 +2843,9 @@ if((NOT Protobuf_FOUND) OR (NOT Protobuf_PROTOC_EXECUTABLE) OR (${Protobuf_VERSI
else()
message(" aclocal has not been found.")
message(" You can try to install it by typing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum groupinstall 'Development Tools'")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(" sudo zypper install automake")
else()
message(" sudo apt install automake")
@@ -3097,7 +3107,7 @@ else()
message(STATUS " You can get nice code documentation by using it!")
message(STATUS " Get it from https://www.doxygen.nl/download.html")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(STATUS " or simply by doing 'sudo yum install doxygen-latex'.")
else()
message(STATUS " or simply by doing 'sudo apt install doxygen-latex'.")
@@ -3523,8 +3533,10 @@ if(ENABLE_DMA_PROXY)
endif()
endif()
file(GLOB_RECURSE DMA_PROXY_FILES "${TARGET_ROOTFS_PATH}/*/dma-proxy.ko")
list(GET DMA_PROXY_FILES 0 DMA_PROXY_FILE)
if(EXISTS "${DMA_PROXY_FILE}")
if(DMA_PROXY_FILES)
list(GET DMA_PROXY_FILES 0 DMA_PROXY_FILE)
endif()
if(DMA_PROXY_FILES AND EXISTS "${DMA_PROXY_FILE}")
message(STATUS "Found dma-proxy.ko file: ${DMA_PROXY_FILE}")
set(ENABLE_FPGA ON)
else()
@@ -3797,7 +3809,7 @@ else()
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
message(STATUS "Building on ${MACOS_DISTRIBUTION}")
if(${DETECT_MACPORTS} EQUAL 0)
if(DEFINED MACPORTS_PREFIX AND NOT "${MACPORTS_PREFIX}" STREQUAL "")
message(STATUS "Found Macports v${MACPORTS_VERSION} installed at ${MACPORTS_PREFIX}")
endif()
if(${DETECT_HOMEBREW} EQUAL 0)
+1 -1
View File
@@ -7,7 +7,7 @@
# Avoid using the BLAS and LAPACK implementations that comes with the Accelerate
# framework, which causes a bug when the BeiDou constellation is enabled
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+58 -48
View File
@@ -15,68 +15,78 @@ else()
endif()
if(EXISTS "/etc/lsb-release")
execute_process(COMMAND cat /etc/lsb-release
COMMAND grep DISTRIB_ID
COMMAND awk -F= "{ print $2 }"
COMMAND tr "\n" " "
COMMAND sed "s/ //"
OUTPUT_VARIABLE LINUX_DISTRIBUTION
RESULT_VARIABLE LINUX_ID_RESULT
file(STRINGS "/etc/lsb-release" _lsb_distrib_id_line
REGEX "^DISTRIB_ID="
LIMIT_COUNT 1
)
execute_process(COMMAND cat /etc/lsb-release
COMMAND grep DISTRIB_RELEASE
COMMAND awk -F= "{ print $2 }"
COMMAND tr "\n" " "
COMMAND sed "s/ //"
OUTPUT_VARIABLE LINUX_VER
RESULT_VARIABLE LINUX_VER_RESULT
file(STRINGS "/etc/lsb-release" _lsb_distrib_release_line
REGEX "^DISTRIB_RELEASE="
LIMIT_COUNT 1
)
if(_lsb_distrib_id_line)
string(REGEX REPLACE "^DISTRIB_ID=" "" LINUX_DISTRIBUTION "${_lsb_distrib_id_line}")
string(REPLACE "\"" "" LINUX_DISTRIBUTION "${LINUX_DISTRIBUTION}")
string(STRIP "${LINUX_DISTRIBUTION}" LINUX_DISTRIBUTION)
set(LINUX_ID_RESULT 0)
else()
set(LINUX_ID_RESULT 1)
endif()
if(_lsb_distrib_release_line)
string(REGEX REPLACE "^DISTRIB_RELEASE=" "" LINUX_VER "${_lsb_distrib_release_line}")
string(REPLACE "\"" "" LINUX_VER "${LINUX_VER}")
string(STRIP "${LINUX_VER}" LINUX_VER)
set(LINUX_VER_RESULT 0)
else()
set(LINUX_VER_RESULT 1)
endif()
unset(_lsb_distrib_id_line)
unset(_lsb_distrib_release_line)
endif()
if(NOT LINUX_DISTRIBUTION)
if(EXISTS "/etc/linuxmint/info")
set(LINUX_DISTRIBUTION "LinuxMint")
execute_process(COMMAND cat /etc/linuxmint/info
COMMAND grep -m1 RELEASE
COMMAND awk -F= "{ print $2 }"
COMMAND tr "\n" " "
COMMAND sed "s/ //"
OUTPUT_VARIABLE LINUX_VER
RESULT_VARIABLE LINUX_VER_RESULT
file(STRINGS "/etc/linuxmint/info" _linuxmint_release_line
REGEX "^RELEASE="
LIMIT_COUNT 1
)
if(_linuxmint_release_line)
string(REGEX REPLACE "^RELEASE=" "" LINUX_VER "${_linuxmint_release_line}")
string(REPLACE "\"" "" LINUX_VER "${LINUX_VER}")
string(STRIP "${LINUX_VER}" LINUX_VER)
set(LINUX_VER_RESULT 0)
else()
set(LINUX_VER_RESULT 1)
endif()
unset(_linuxmint_release_line)
endif()
endif()
if(NOT LINUX_DISTRIBUTION)
if(EXISTS "/etc/os-release")
execute_process(COMMAND cat /etc/os-release
COMMAND grep -m1 NAME
COMMAND awk -F= "{ print $2 }"
COMMAND tr "\n" " "
COMMAND sed "s/ //"
OUTPUT_VARIABLE LINUX_DISTRIBUTION_
RESULT_VARIABLE LINUX_ID_RESULT
)
execute_process(COMMAND cat /etc/os-release
COMMAND grep VERSION_ID
COMMAND awk -F= "{ print $2 }"
COMMAND tr "\n" " "
COMMAND sed "s/ //"
OUTPUT_VARIABLE LINUX_VER_
RESULT_VARIABLE LINUX_VER_RESULT
)
if(LINUX_DISTRIBUTION_)
string(REPLACE "\"" "" LINUX_DISTRIBUTION__ ${LINUX_DISTRIBUTION_})
string(STRIP ${LINUX_DISTRIBUTION__} LINUX_DISTRIBUTION)
file(STRINGS "/etc/os-release" _os_release_name_line REGEX "^NAME=" LIMIT_COUNT 1)
file(STRINGS "/etc/os-release" _os_release_version_line REGEX "^VERSION_ID=" LIMIT_COUNT 1)
if(_os_release_name_line)
string(REGEX REPLACE "^NAME=" "" LINUX_DISTRIBUTION "${_os_release_name_line}")
string(REPLACE "\"" "" LINUX_DISTRIBUTION "${LINUX_DISTRIBUTION}")
string(STRIP "${LINUX_DISTRIBUTION}" LINUX_DISTRIBUTION)
endif()
if(LINUX_VER_)
string(REPLACE "\"" "" LINUX_VER ${LINUX_VER_})
if(_os_release_version_line)
string(REGEX REPLACE "^VERSION_ID=" "" LINUX_VER "${_os_release_version_line}")
string(REPLACE "\"" "" LINUX_VER "${LINUX_VER}")
string(STRIP "${LINUX_VER}" LINUX_VER)
endif()
if(${LINUX_DISTRIBUTION} MATCHES "Debian")
set(LINUX_DISTRIBUTION "Debian")
file(READ /etc/debian_version LINUX_VER_)
string(REPLACE "\n" "" LINUX_VER ${LINUX_VER_})
if("${LINUX_DISTRIBUTION}" STREQUAL "Debian" AND EXISTS "/etc/debian_version")
file(READ "/etc/debian_version" LINUX_VER_)
string(STRIP "${LINUX_VER_}" LINUX_VER)
endif()
unset(_os_release_name_line)
unset(_os_release_version_line)
endif()
endif()
@@ -84,7 +94,7 @@ if(NOT LINUX_DISTRIBUTION)
if(EXISTS "/etc/redhat-release")
set(LINUX_DISTRIBUTION "Red Hat")
file(READ /etc/redhat-release LINUX_VER_)
string(REPLACE "\n" "" LINUX_VER ${LINUX_VER_})
string(REPLACE "\n" "" LINUX_VER "${LINUX_VER_}")
endif()
endif()
@@ -92,7 +102,7 @@ if(NOT LINUX_DISTRIBUTION)
if(EXISTS "/etc/debian_version")
set(LINUX_DISTRIBUTION "Debian")
file(READ /etc/debian_version LINUX_VER_)
string(REPLACE "\n" "" LINUX_VER ${LINUX_VER_})
string(REPLACE "\n" "" LINUX_VER "${LINUX_VER_}")
endif()
endif()
+6 -5
View File
@@ -80,13 +80,13 @@ endif()
set(MACOS_PACKAGES_PREFIX "")
# Detect if MacPorts is installed on this system; if so, return base path and version
execute_process(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${DETECT_MACPORTS} EQUAL 0)
find_program(MACPORTS_EXECUTABLE port)
if(MACPORTS_EXECUTABLE)
# "/opt/local/bin/port", so we get the parent directory
get_filename_component(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
get_filename_component(MACPORTS_PREFIX "${MACPORTS_EXECUTABLE}" DIRECTORY)
# "/opt/local/bin", so we get the parent directory
get_filename_component(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
execute_process(COMMAND port version RESULT_VARIABLE DETECT_MACPORTS_VERSION OUTPUT_VARIABLE MACPORTS_VERSION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
get_filename_component(MACPORTS_PREFIX "${MACPORTS_PREFIX}" DIRECTORY)
execute_process(COMMAND "${MACPORTS_EXECUTABLE}" version RESULT_VARIABLE DETECT_MACPORTS_VERSION OUTPUT_VARIABLE MACPORTS_VERSION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" MACPORTS_VERSION "${MACPORTS_VERSION}")
set(MACOS_PACKAGES_PREFIX ${MACPORTS_PREFIX})
endif()
@@ -98,3 +98,4 @@ if(${DETECT_HOMEBREW} EQUAL 0)
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" HOMEBREW_VERSION "${HOMEBREW_VERSION}")
set(MACOS_PACKAGES_PREFIX ${HOMEBREW_PREFIX})
endif()
unset(MACPORTS_EXECUTABLE)
+137 -32
View File
@@ -1,61 +1,166 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2021-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2021-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
set(FPHSA_NAME_MISMATCHED ON)
if(NOT GNSSSDR_LIB_PATHS)
########################################################################
# Find cpu_features
#
# Provides the following imported target:
# CpuFeature::cpu_features
########################################################################
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
find_library(CPUFEATURES_LIBRARIES
########################################################################
# Build candidate root list
########################################################################
set(_CPUFEATURES_ROOT_HINTS)
if(CPUFEATURES_DIR)
list(APPEND _CPUFEATURES_ROOT_HINTS "${CPUFEATURES_DIR}")
endif()
if(DEFINED ENV{CPUFEATURES_DIR} AND NOT "$ENV{CPUFEATURES_DIR}" STREQUAL "")
list(APPEND _CPUFEATURES_ROOT_HINTS "$ENV{CPUFEATURES_DIR}")
endif()
if(CMAKE_INSTALL_PREFIX)
list(APPEND _CPUFEATURES_ROOT_HINTS "${CMAKE_INSTALL_PREFIX}")
endif()
if(DEFINED _CPUFEATURES_ROOT_HINTS)
list(REMOVE_DUPLICATES _CPUFEATURES_ROOT_HINTS)
endif()
########################################################################
# Search paths for headers and libraries
########################################################################
set(_CPUFEATURES_INCLUDE_HINTS)
set(_CPUFEATURES_LIBRARY_HINTS)
foreach(_cpufeatures_prefix ${_CPUFEATURES_ROOT_HINTS})
list(APPEND _CPUFEATURES_INCLUDE_HINTS
"${_cpufeatures_prefix}"
"${_cpufeatures_prefix}/include"
)
list(APPEND _CPUFEATURES_LIBRARY_HINTS
"${_cpufeatures_prefix}/lib"
"${_cpufeatures_prefix}/lib64"
)
endforeach()
list(APPEND _CPUFEATURES_INCLUDE_HINTS ${GNSSSDR_INCLUDE_PATHS})
list(APPEND _CPUFEATURES_LIBRARY_HINTS ${GNSSSDR_LIB_PATHS})
list(REMOVE_DUPLICATES _CPUFEATURES_INCLUDE_HINTS)
list(REMOVE_DUPLICATES _CPUFEATURES_LIBRARY_HINTS)
########################################################################
# Find headers and library
########################################################################
find_library(CPUFEATURES_LIBRARY
NAMES cpu_features
PATHS ${GNSSSDR_LIB_PATHS}
PATHS ${_CPUFEATURES_LIBRARY_HINTS}
)
find_path(CPUFEATURES_INCLUDE_DIR cpu_features_macros.h
PATHS $ENV{CPUFEATURES_DIR}/include
$ENV{CPUFEATURES_DIR}
${GNSSSDR_INCLUDE_PATHS}
find_path(CPUFEATURES_INCLUDE_DIR
NAMES cpu_features_macros.h
PATHS ${_CPUFEATURES_INCLUDE_HINTS}
PATH_SUFFIXES cpu_features
)
if(CPUFEATURES_INCLUDE_DIR AND CPUFEATURES_LIBRARIES)
if(NOT PACKAGE_VERSION)
set(PACKAGE_VERSION "")
endif()
set(OLD_PACKAGE_VERSION ${PACKAGE_VERSION})
unset(PACKAGE_VERSION)
list(GET CPUFEATURES_LIBRARIES 0 FIRST_DIR)
get_filename_component(CPUFEATURES_LIBRARIES_PATH ${FIRST_DIR} DIRECTORY)
if(EXISTS ${CPUFEATURES_LIBRARIES_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake)
include(${CPUFEATURES_LIBRARIES_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake)
endif()
if(PACKAGE_VERSION)
set(CPUFEATURES_VERSION ${PACKAGE_VERSION})
else()
set(CPUFEATURES_VERSION "Unknown")
endif()
set(PACKAGE_VERSION ${OLD_PACKAGE_VERSION})
endif()
########################################################################
# Standard result handling
########################################################################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CPUFEATURES
DEFAULT_MSG
CPUFEATURES_LIBRARIES
CPUFEATURES_LIBRARY
CPUFEATURES_INCLUDE_DIR
)
########################################################################
# Determine version
########################################################################
if(CPUFEATURES_FOUND)
get_filename_component(_CPUFEATURES_LIBRARY_PATH
"${CPUFEATURES_LIBRARY}" DIRECTORY
)
if(EXISTS "${_CPUFEATURES_LIBRARY_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake")
if(DEFINED PACKAGE_VERSION)
set(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED TRUE)
set(_CPUFEATURES_OLD_PACKAGE_VERSION "${PACKAGE_VERSION}")
else()
set(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED FALSE)
endif()
unset(PACKAGE_VERSION)
include(
"${_CPUFEATURES_LIBRARY_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake"
)
if(PACKAGE_VERSION)
set(CPUFEATURES_VERSION "${PACKAGE_VERSION}")
else()
set(CPUFEATURES_VERSION "Unknown")
endif()
unset(PACKAGE_VERSION)
if(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED)
set(PACKAGE_VERSION "${_CPUFEATURES_OLD_PACKAGE_VERSION}")
else()
unset(PACKAGE_VERSION)
endif()
unset(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED)
unset(_CPUFEATURES_OLD_PACKAGE_VERSION)
else()
set(CPUFEATURES_VERSION "Unknown")
endif()
endif()
########################################################################
# Compatibility variables
########################################################################
set(CPUFEATURES_LIBRARIES "${CPUFEATURES_LIBRARY}")
mark_as_advanced(
CPUFEATURES_LIBRARY
CPUFEATURES_LIBRARIES
CPUFEATURES_INCLUDE_DIR
CPUFEATURES_VERSION
)
########################################################################
# Define imported target
########################################################################
if(CPUFEATURES_FOUND AND NOT TARGET CpuFeature::cpu_features)
add_library(CpuFeature::cpu_features STATIC IMPORTED)
add_library(CpuFeature::cpu_features UNKNOWN IMPORTED)
set_target_properties(CpuFeature::cpu_features PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${CPUFEATURES_LIBRARIES}"
IMPORTED_LOCATION "${CPUFEATURES_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${CPUFEATURES_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "${CPUFEATURES_LIBRARIES}"
)
endif()
mark_as_advanced(CPUFEATURES_LIBRARIES)
########################################################################
# Cleanup internal variables
########################################################################
unset(_CPUFEATURES_ROOT_HINTS)
unset(_CPUFEATURES_INCLUDE_HINTS)
unset(_CPUFEATURES_LIBRARY_HINTS)
unset(_CPUFEATURES_LIBRARY_PATH)
unset(_cpufeatures_prefix)
+29 -20
View File
@@ -66,10 +66,6 @@ Imported Targets
Variables
*********
.. variable:: CXX_FILESYSTEM_IS_EXPERIMENTAL
Set to ``TRUE`` when the :find-component:`fs.Experimental` version of C++
filesystem library was found, otherwise ``FALSE``.
.. variable:: CXX_FILESYSTEM_HAVE_FS
@@ -120,24 +116,33 @@ if(FILESYSTEM_FIND_QUIETLY)
endif()
# All of our tests require C++17 or later
set(OLD_CMAKE_CXX_STANDARD ${CMAKE_CXX_STANDARD})
if(DEFINED CMAKE_CXX_STANDARD)
set(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED TRUE)
set(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD "${CMAKE_CXX_STANDARD}")
else()
set(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED FALSE)
endif()
set(CMAKE_CXX_STANDARD 17)
set(_filesystem_required_flag "")
if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "8.0.0"))
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.99")
set(UNDEFINED_BEHAVIOR_WITHOUT_LINKING TRUE)
set(_filesystem_required_flag "-std=c++17")
elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.99"))
set(_filesystem_required_flag "-std=c++17")
elseif((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "11"))
set(_filesystem_required_flag "-std=c++17")
elseif(MSVC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "18"))
set(_filesystem_required_flag "/std:c++17")
endif()
if(_filesystem_required_flag)
if(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${_filesystem_required_flag}")
else()
set(CMAKE_REQUIRED_FLAGS "${_filesystem_required_flag}")
endif()
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
endif()
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.99"))
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
endif()
if((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "11"))
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
endif()
if(MSVC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "18"))
set(CMAKE_REQUIRED_FLAGS "/std:c++17")
endif()
# Normalize and check the component list we were given
set(want_components ${FILESYSTEM_FIND_COMPONENTS})
if(FILESYSTEM_FIND_COMPONENTS STREQUAL "")
@@ -217,7 +222,6 @@ if(CXX_FILESYSTEM_HAVE_FS)
if(NOT CXX_FILESYSTEM_NO_LINK_NEEDED)
set(prev_libraries ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
# Add the libstdc++ flag
set(CMAKE_REQUIRED_LIBRARIES ${prev_libraries} -lstdc++fs)
check_cxx_source_compiles("${code}" CXX_FILESYSTEM_STDCPPFS_NEEDED)
@@ -249,8 +253,10 @@ if(CXX_FILESYSTEM_HAVE_FS)
endif()
endif()
if(NOT ${_found})
set(CMAKE_CXX_STANDARD ${OLD_CMAKE_CXX_STANDARD})
if(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED)
set(CMAKE_CXX_STANDARD "${_FILESYSTEM_OLD_CMAKE_CXX_STANDARD}")
else()
unset(CMAKE_CXX_STANDARD)
endif()
cmake_pop_check_state()
@@ -263,3 +269,6 @@ find_package_handle_standard_args(FILESYSTEM DEFAULT_MSG FILESYSTEM_FOUND)
if(FILESYSTEM_FIND_REQUIRED AND NOT FILESYSTEM_FOUND)
message(FATAL_ERROR "Cannot compile a simple program using std::filesystem")
endif()
unset(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED)
unset(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD)
+1 -1
View File
@@ -25,7 +25,7 @@ if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+18 -15
View File
@@ -1,36 +1,37 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
if(NOT GFORTRAN_ROOT)
set(GFORTRAN_ROOT_USER_DEFINED /usr/lib)
set(GFORTRAN_ROOT_USER_DEFINED "")
if(DEFINED GFORTRAN_ROOT AND NOT "${GFORTRAN_ROOT}" STREQUAL "")
list(APPEND GFORTRAN_ROOT_USER_DEFINED "${GFORTRAN_ROOT}")
else()
set(GFORTRAN_ROOT_USER_DEFINED ${GFORTRAN_ROOT})
list(APPEND GFORTRAN_ROOT_USER_DEFINED "/usr/lib")
endif()
if(DEFINED ENV{GFORTRAN_ROOT})
set(GFORTRAN_ROOT_USER_DEFINED
$ENV{GFORTRAN_ROOT}
${GFORTRAN_ROOT_USER_DEFINED}
)
list(APPEND GFORTRAN_ROOT_USER_DEFINED "$ENV{GFORTRAN_ROOT}")
endif()
set(GCC_MAJOR_SERIES 16 15 14 13 12 11 10 9 8 7 6 5)
set(GCC4_SERIES 4.9.1 4.9 4.8.3 4.8.1 4.7.2 4.7 4.8.2 4.8 4.7 4.6 4.5 4.4.4 4.4)
set(GCC4_SERIES 4.9.1 4.9 4.8.3 4.8.2 4.8.1 4.8 4.7.2 4.7 4.6 4.5 4.4.4 4.4)
set(GCC_SERIES ${GCC_MAJOR_SERIES} ${GCC4_SERIES})
find_library(GFORTRAN NAMES gfortran
PATHS ${GFORTRAN_ROOT_USER_DEFINED}
/usr/lib/gcc/x86_64-linux-gnu # Debian
find_library(GFORTRAN
NAMES gfortran
PATHS
${GFORTRAN_ROOT_USER_DEFINED}
/usr/lib/gcc/x86_64-linux-gnu
/usr/lib/gcc/i386-linux-gnu
/usr/lib/gcc/i486-linux-gnu
/usr/lib/gcc/i586-linux-gnu
@@ -56,14 +57,14 @@ find_library(GFORTRAN NAMES gfortran
/usr/lib/gcc/sparc64-linux-gnu
/usr/lib/gcc/x86_64-linux-gnux32
/usr/lib/gcc/sh4-linux-gnu
/usr/lib/gcc/i686-redhat-linux # Fedora
/usr/lib/gcc/i686-redhat-linux
/usr/lib64/gcc/x86_64-redhat-linux
/usr/lib/gcc/x86_64-redhat-linux
/usr/lib/gcc/armv7hl-redhat-linux-gnueabi
/usr/lib/gcc/aarch64-redhat-linux
/usr/lib/gcc/ppc64le-redhat-linux
/usr/lib/gcc/s390x-redhat-linux
/usr/lib64/gcc/x86_64-suse-linux # openSUSE
/usr/lib64/gcc/x86_64-suse-linux
/usr/lib/gcc/i586-suse-linux
/usr/lib/gcc/x86_64-suse-linux
/usr/lib/gcc/armv6hl-suse-linux-gnueabi
@@ -86,3 +87,5 @@ set_package_properties(GFORTRAN PROPERTIES
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GFORTRAN DEFAULT_MSG GFORTRAN)
mark_as_advanced(GFORTRAN)
+1 -1
View File
@@ -28,7 +28,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -13,7 +13,7 @@ if(NOT PKG_CONFIG_FOUND)
endif()
pkg_check_modules(PC_GMP "gmp")
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+20 -4
View File
@@ -4,16 +4,22 @@
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
if(GNSSSIMULATOR_ROOT)
set(GNSSSIMULATOR_ROOT_USER_DEFINED ${GNSSSIMULATOR_ROOT})
else()
set(GNSSSIMULATOR_ROOT_USER_DEFINED /usr/local/bin)
set(GNSSSIMULATOR_ROOT_USER_DEFINED /usr/local)
endif()
if(DEFINED ENV{GNSSSIMULATOR_ROOT})
set(GNSSSIMULATOR_ROOT_USER_DEFINED
${GNSSSIMULATOR_ROOT_USER_DEFINED}
$ENV{GNSSSIMULATOR_ROOT}
)
endif()
if(DEFINED ENV{GNSSSIMULATOR})
set(GNSSSIMULATOR_ROOT_USER_DEFINED
${GNSSSIMULATOR_ROOT_USER_DEFINED}
$ENV{GNSSSIMULATOR}
@@ -37,12 +43,22 @@ find_program(SW_GENERATOR_BIN gnss_sim
if(SW_GENERATOR_BIN AND CMAKE_CROSSCOMPILING)
if(CMAKE_SYSROOT)
string(REGEX REPLACE "${CMAKE_SYSROOT}" "" SW_GENERATOR_BIN "${SW_GENERATOR_BIN}")
string(LENGTH "${CMAKE_SYSROOT}" _gnsssimulator_sysroot_len)
string(SUBSTRING "${SW_GENERATOR_BIN}" 0 ${_gnsssimulator_sysroot_len} _gnsssimulator_sysroot_prefix)
if(_gnsssimulator_sysroot_prefix STREQUAL "${CMAKE_SYSROOT}")
string(SUBSTRING "${SW_GENERATOR_BIN}" ${_gnsssimulator_sysroot_len} -1 SW_GENERATOR_BIN)
endif()
elseif(DEFINED ENV{OECORE_TARGET_SYSROOT})
string(REGEX REPLACE "$ENV{OECORE_TARGET_SYSROOT}" "" SW_GENERATOR_BIN "${SW_GENERATOR_BIN}")
string(LENGTH "$ENV{OECORE_TARGET_SYSROOT}" _gnsssimulator_sysroot_len)
string(SUBSTRING "${SW_GENERATOR_BIN}" 0 ${_gnsssimulator_sysroot_len} _gnsssimulator_sysroot_prefix)
if(_gnsssimulator_sysroot_prefix STREQUAL "$ENV{OECORE_TARGET_SYSROOT}")
string(SUBSTRING "${SW_GENERATOR_BIN}" ${_gnsssimulator_sysroot_len} -1 SW_GENERATOR_BIN)
endif()
endif()
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GNSSSIMULATOR DEFAULT_MSG SW_GENERATOR_BIN)
mark_as_advanced(SW_GENERATOR_BIN)
unset(_gnsssimulator_sysroot_len)
unset(_gnsssimulator_sysroot_prefix)
+1 -1
View File
@@ -19,7 +19,7 @@ if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+13 -3
View File
@@ -4,7 +4,7 @@
# SPDX-FileCopyrightText: 2021-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
@@ -31,9 +31,17 @@ if(NOT CMAKE_CROSSCOMPILING)
else()
if(GNUPLOT_EXECUTABLE)
if(CMAKE_SYSROOT)
string(REGEX REPLACE "${CMAKE_SYSROOT}" "" GNUPLOT_EXECUTABLE "${GNUPLOT_EXECUTABLE}")
string(LENGTH "${CMAKE_SYSROOT}" _gnuplot_sysroot_len)
string(SUBSTRING "${GNUPLOT_EXECUTABLE}" 0 ${_gnuplot_sysroot_len} _gnuplot_sysroot_prefix)
if(_gnuplot_sysroot_prefix STREQUAL "${CMAKE_SYSROOT}")
string(SUBSTRING "${GNUPLOT_EXECUTABLE}" ${_gnuplot_sysroot_len} -1 GNUPLOT_EXECUTABLE)
endif()
elseif(DEFINED ENV{OECORE_TARGET_SYSROOT})
string(REGEX REPLACE "$ENV{OECORE_TARGET_SYSROOT}" "" GNUPLOT_EXECUTABLE "${GNUPLOT_EXECUTABLE}")
string(LENGTH "$ENV{OECORE_TARGET_SYSROOT}" _gnuplot_sysroot_len)
string(SUBSTRING "${GNUPLOT_EXECUTABLE}" 0 ${_gnuplot_sysroot_len} _gnuplot_sysroot_prefix)
if(_gnuplot_sysroot_prefix STREQUAL "$ENV{OECORE_TARGET_SYSROOT}")
string(SUBSTRING "${GNUPLOT_EXECUTABLE}" ${_gnuplot_sysroot_len} -1 GNUPLOT_EXECUTABLE)
endif()
endif()
else()
message(STATUS "Warning: Gnuplot is not found, you can install it later.")
@@ -44,3 +52,5 @@ endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GNUPLOT DEFAULT_MSG GNUPLOT_EXECUTABLE)
unset(_gnuplot_sysroot_len)
unset(_gnuplot_sysroot_prefix)
+130 -53
View File
@@ -1,7 +1,7 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
########################################################################
@@ -16,28 +16,30 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
include(FindPackageHandleStandardArgs)
# if GR_REQUIRED_COMPONENTS is not defined, it will be set to the following list
if(NOT GR_REQUIRED_COMPONENTS)
if(NOT DEFINED GR_REQUIRED_COMPONENTS OR
"${GR_REQUIRED_COMPONENTS}" STREQUAL "")
set(GR_REQUIRED_COMPONENTS RUNTIME PMT BLOCKS FFT FILTER ANALOG)
endif()
# Allows us to use all .cmake files in this directory
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_LIST_DIR})
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}")
# Easily access all libraries and includes of GNU Radio
set(GNURADIO_ALL_LIBRARIES "")
set(GNURADIO_ALL_INCLUDE_DIRS "")
set(GNURADIO_REQUIRED_COMPONENTS_FOUND TRUE)
macro(LIST_CONTAINS var value)
set(${var})
set(${var} FALSE)
foreach(value2 ${ARGN})
if(${value} STREQUAL ${value2})
if("${value}" STREQUAL "${value2}")
set(${var} TRUE)
endif()
endforeach()
@@ -72,9 +74,8 @@ set(GNURADIO_INSTALL_PREFIX_USER_PROVIDED
)
function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE)
list_contains(REQUIRED_MODULE ${EXTVAR} ${GR_REQUIRED_COMPONENTS})
list_contains(REQUIRED_MODULE "${EXTVAR}" ${GR_REQUIRED_COMPONENTS})
if(NOT REQUIRED_MODULE)
#message("Ignoring GNU Radio Module ${EXTVAR}")
return()
endif()
@@ -92,6 +93,8 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE)
set(PC_INCDIR ${PC_GNURADIO_${EXTVAR}_INCLUDEDIR})
set(PC_LIBDIR ${PC_GNURADIO_${EXTVAR}_LIBDIR})
unset(${LIBVAR_NAME})
# look for include files
find_path(${INCVAR_NAME}
NAMES ${INCFILE}
@@ -108,7 +111,9 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE)
PATHS ${GNURADIO_INSTALL_PREFIX_USER_PROVIDED}/${CMAKE_INSTALL_LIBDIR}
${GNSSSDR_LIB_PATHS}
)
list(APPEND ${LIBVAR_NAME} ${${LIBVAR_NAME}_${libname}})
if(${LIBVAR_NAME}_${libname})
list(APPEND ${LIBVAR_NAME} ${${LIBVAR_NAME}_${libname}})
endif()
endforeach()
set(${LIBVAR_NAME} ${${LIBVAR_NAME}} PARENT_SCOPE)
@@ -118,11 +123,15 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE)
message(STATUS " * LIBS=${GNURADIO_${EXTVAR}_LIBRARIES}")
# append to all includes and libs list
set(GNURADIO_ALL_INCLUDE_DIRS ${GNURADIO_ALL_INCLUDE_DIRS} ${GNURADIO_${EXTVAR}_INCLUDE_DIRS} PARENT_SCOPE)
set(GNURADIO_ALL_LIBRARIES ${GNURADIO_ALL_LIBRARIES} ${GNURADIO_${EXTVAR}_LIBRARIES} PARENT_SCOPE)
set(GNURADIO_ALL_INCLUDE_DIRS ${GNURADIO_ALL_INCLUDE_DIRS}
${GNURADIO_${EXTVAR}_INCLUDE_DIRS} PARENT_SCOPE)
set(GNURADIO_ALL_LIBRARIES ${GNURADIO_ALL_LIBRARIES}
${GNURADIO_${EXTVAR}_LIBRARIES} PARENT_SCOPE)
if(GNURADIO_${EXTVAR}_LIBRARIES AND GNURADIO_${EXTVAR}_INCLUDE_DIRS)
set(GNURADIO_${EXTVAR}_FOUND TRUE)
else()
set(GNURADIO_${EXTVAR}_FOUND FALSE)
endif()
message(STATUS "GNURADIO_${EXTVAR}_FOUND = ${GNURADIO_${EXTVAR}_FOUND}")
set(GNURADIO_${EXTVAR}_FOUND ${GNURADIO_${EXTVAR}_FOUND} PARENT_SCOPE)
@@ -130,25 +139,28 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE)
# generate an error if the module is missing
if(NOT GNURADIO_${EXTVAR}_FOUND)
message(STATUS "Required GNU Radio Component: ${EXTVAR} missing!")
set(GNURADIO_FOUND FALSE) # Trick for feature_summary
set(GNURADIO_FOUND FALSE PARENT_SCOPE) # Trick for feature_summary
set(GNURADIO_REQUIRED_COMPONENTS_FOUND FALSE PARENT_SCOPE)
endif()
# Create imported target
string(TOLOWER ${EXTVAR} gnuradio_component)
if(NOT TARGET Gnuradio::${gnuradio_component})
add_library(Gnuradio::${gnuradio_component} SHARED IMPORTED)
string(TOLOWER "${EXTVAR}" gnuradio_component)
if(NOT TARGET Gnuradio::${gnuradio_component}
AND GNURADIO_${EXTVAR}_LIBRARIES)
add_library(Gnuradio::${gnuradio_component} UNKNOWN IMPORTED)
set(GNURADIO_LIBRARY ${GNURADIO_${EXTVAR}_LIBRARIES})
list(GET GNURADIO_LIBRARY 0 FIRST_DIR)
get_filename_component(GNURADIO_DIR ${FIRST_DIR} ABSOLUTE)
list(GET GNURADIO_LIBRARY 0 FIRST_LIBRARY)
set_target_properties(Gnuradio::${gnuradio_component} PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_DIR}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_${EXTVAR}_INCLUDE_DIRS}"
IMPORTED_LOCATION "${FIRST_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES
"${GNURADIO_${EXTVAR}_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_LIBRARY}"
)
endif()
mark_as_advanced(GNURADIO_${EXTVAR}_LIBRARIES GNURADIO_${EXTVAR}_INCLUDE_DIRS)
mark_as_advanced(GNURADIO_${EXTVAR}_LIBRARIES
GNURADIO_${EXTVAR}_INCLUDE_DIRS)
endfunction()
gr_module(RUNTIME gnuradio-runtime gnuradio/top_block.h gnuradio-runtime)
@@ -168,25 +180,74 @@ gr_module(VOCODER gnuradio-vocoder gnuradio/vocoder/api.h gnuradio-vocoder)
gr_module(WAVELET gnuradio-wavelet gnuradio/wavelet/api.h gnuradio-wavelet)
gr_module(ZEROMQ gnuradio-zeromq gnuradio/zeromq/api.h gnuradio-zeromq)
list(REMOVE_DUPLICATES GNURADIO_ALL_INCLUDE_DIRS)
list(REMOVE_DUPLICATES GNURADIO_ALL_LIBRARIES)
if(NOT PC_GNURADIO_RUNTIME_VERSION)
set(OLD_PACKAGE_VERSION ${PACKAGE_VERSION})
if(DEFINED PACKAGE_VERSION)
set(OLD_PACKAGE_VERSION "${PACKAGE_VERSION}")
set(_HAD_PACKAGE_VERSION TRUE)
else()
unset(OLD_PACKAGE_VERSION)
set(_HAD_PACKAGE_VERSION FALSE)
endif()
if(DEFINED PACKAGE_FIND_VERSION_MAJOR)
set(OLD_PACKAGE_FIND_VERSION_MAJOR "${PACKAGE_FIND_VERSION_MAJOR}")
set(_HAD_PACKAGE_FIND_VERSION_MAJOR TRUE)
else()
set(_HAD_PACKAGE_FIND_VERSION_MAJOR FALSE)
endif()
if(DEFINED PACKAGE_FIND_VERSION_MINOR)
set(OLD_PACKAGE_FIND_VERSION_MINOR "${PACKAGE_FIND_VERSION_MINOR}")
set(_HAD_PACKAGE_FIND_VERSION_MINOR TRUE)
else()
set(_HAD_PACKAGE_FIND_VERSION_MINOR FALSE)
endif()
if(DEFINED PACKAGE_FIND_VERSION_PATCH)
set(OLD_PACKAGE_FIND_VERSION_PATCH "${PACKAGE_FIND_VERSION_PATCH}")
set(_HAD_PACKAGE_FIND_VERSION_PATCH TRUE)
else()
set(_HAD_PACKAGE_FIND_VERSION_PATCH FALSE)
endif()
unset(PACKAGE_VERSION)
list(GET GNURADIO_BLOCKS_LIBRARIES 0 FIRST_DIR)
get_filename_component(GNURADIO_BLOCKS_DIR ${FIRST_DIR} DIRECTORY)
if(EXISTS ${GNURADIO_BLOCKS_DIR}/cmake/gnuradio/GnuradioConfigVersion.cmake)
set(PACKAGE_FIND_VERSION_MAJOR 3)
set(PACKAGE_FIND_VERSION_MINOR 7)
set(PACKAGE_FIND_VERSION_PATCH 4)
include(${GNURADIO_BLOCKS_DIR}/cmake/gnuradio/GnuradioConfigVersion.cmake)
if(GNURADIO_BLOCKS_LIBRARIES)
list(GET GNURADIO_BLOCKS_LIBRARIES 0 FIRST_LIBRARY)
get_filename_component(GNURADIO_BLOCKS_DIR "${FIRST_LIBRARY}" DIRECTORY)
if(EXISTS "${GNURADIO_BLOCKS_DIR}/cmake/gnuradio/GnuradioConfigVersion.cmake")
set(PACKAGE_FIND_VERSION_MAJOR 3)
set(PACKAGE_FIND_VERSION_MINOR 7)
set(PACKAGE_FIND_VERSION_PATCH 4)
include("${GNURADIO_BLOCKS_DIR}/cmake/gnuradio/GnuradioConfigVersion.cmake")
endif()
endif()
if(PACKAGE_VERSION)
set(PC_GNURADIO_RUNTIME_VERSION ${PACKAGE_VERSION})
set(PC_GNURADIO_RUNTIME_VERSION "${PACKAGE_VERSION}")
endif()
if(_HAD_PACKAGE_VERSION)
set(PACKAGE_VERSION "${OLD_PACKAGE_VERSION}")
else()
unset(PACKAGE_VERSION)
endif()
if(_HAD_PACKAGE_FIND_VERSION_MAJOR)
set(PACKAGE_FIND_VERSION_MAJOR "${OLD_PACKAGE_FIND_VERSION_MAJOR}")
else()
unset(PACKAGE_FIND_VERSION_MAJOR)
endif()
if(_HAD_PACKAGE_FIND_VERSION_MINOR)
set(PACKAGE_FIND_VERSION_MINOR "${OLD_PACKAGE_FIND_VERSION_MINOR}")
else()
unset(PACKAGE_FIND_VERSION_MINOR)
endif()
if(_HAD_PACKAGE_FIND_VERSION_PATCH)
set(PACKAGE_FIND_VERSION_PATCH "${OLD_PACKAGE_FIND_VERSION_PATCH}")
else()
unset(PACKAGE_FIND_VERSION_PATCH)
endif()
set(PACKAGE_VERSION ${OLD_PACKAGE_VERSION})
endif()
# Trick to find out that GNU Radio is >= 3.7.4 if pkgconfig is not present
@@ -220,11 +281,11 @@ if(GNURADIO_VERSION)
if(GNURADIO_VERSION VERSION_LESS ${GNSSSDR_GNURADIO_MIN_VERSION})
unset(GNURADIO_RUNTIME_FOUND)
message(STATUS "The GNU Radio version installed in your system (v${GNURADIO_VERSION}) is too old.")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux|kFreeBSD|GNU")
message("Go to https://wiki.gnuradio.org/index.php/InstallingGR")
message("and follow the instructions to install a newer GNU Radio version in your system.")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin")
message("You can install it easily via Macports:")
message(" sudo port install gnuradio ")
message("Alternatively, you can use homebrew:")
@@ -241,12 +302,13 @@ else()
)
endif()
find_package_handle_standard_args(GNURADIO DEFAULT_MSG GNURADIO_RUNTIME_FOUND)
find_package_handle_standard_args(GNURADIO DEFAULT_MSG
GNURADIO_RUNTIME_FOUND GNURADIO_REQUIRED_COMPONENTS_FOUND)
# Detect if using standard pointers
set(GNURADIO_USES_STD_POINTERS FALSE)
if(GNURADIO_VERSION VERSION_GREATER 3.8.99)
file(STRINGS ${GNURADIO_RUNTIME_INCLUDE_DIRS}/gnuradio/basic_block.h _basic_block)
file(STRINGS "${GNURADIO_RUNTIME_INCLUDE_DIRS}/gnuradio/basic_block.h" _basic_block)
foreach(_loop_var IN LISTS _basic_block)
string(STRIP "${_loop_var}" _file_line)
if("public std::enable_shared_from_this<basic_block>" STREQUAL "${_file_line}")
@@ -256,7 +318,7 @@ if(GNURADIO_VERSION VERSION_GREATER 3.8.99)
endif()
# Detect if FFT are templates
if(EXISTS ${GNURADIO_FFT_INCLUDE_DIRS}/gnuradio/fft/fft_vfc.h)
if(EXISTS "${GNURADIO_FFT_INCLUDE_DIRS}/gnuradio/fft/fft_vfc.h")
set(GNURADIO_FFT_USES_TEMPLATES FALSE)
else()
set(GNURADIO_FFT_USES_TEMPLATES TRUE)
@@ -300,13 +362,12 @@ if(GNURADIO_VERSION VERSION_GREATER 3.8.99)
# Create imported target
if(NOT TARGET Gnuradio::iio)
add_library(Gnuradio::iio SHARED IMPORTED)
add_library(Gnuradio::iio UNKNOWN IMPORTED)
set(GNURADIO_LIBRARY ${GNURADIO_IIO_LIBRARIES})
list(GET GNURADIO_LIBRARY 0 FIRST_DIR)
get_filename_component(GNURADIO_DIR ${FIRST_DIR} ABSOLUTE)
list(GET GNURADIO_LIBRARY 0 FIRST_LIBRARY)
set_target_properties(Gnuradio::iio PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${GNURADIO_DIR}"
IMPORTED_LOCATION "${FIRST_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_IIO_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${GNURADIO_LIBRARY}"
)
@@ -321,7 +382,7 @@ endif()
# Check if PMT uses boost::any or std::any
if(GNURADIO_PMT_INCLUDE_DIRS)
file(STRINGS ${GNURADIO_PMT_INCLUDE_DIRS}/pmt/pmt.h _pmt_content)
file(STRINGS "${GNURADIO_PMT_INCLUDE_DIRS}/pmt/pmt.h" _pmt_content)
set(_uses_boost TRUE)
foreach(_loop_var IN LISTS _pmt_content)
string(STRIP "${_loop_var}" _file_line)
@@ -329,7 +390,7 @@ if(GNURADIO_PMT_INCLUDE_DIRS)
set(_uses_boost FALSE)
endif()
endforeach()
if(${_uses_boost})
if(_uses_boost)
set(PMT_USES_BOOST_ANY TRUE)
endif()
endif()
@@ -337,7 +398,7 @@ endif()
# Check if GNU Radio uses log4cpp or spdlog
if(GNURADIO_RUNTIME_INCLUDE_DIRS)
if(EXISTS "${GNURADIO_RUNTIME_INCLUDE_DIRS}/gnuradio/logger.h")
file(STRINGS ${GNURADIO_RUNTIME_INCLUDE_DIRS}/gnuradio/logger.h _logger_content)
file(STRINGS "${GNURADIO_RUNTIME_INCLUDE_DIRS}/gnuradio/logger.h" _logger_content)
set(_uses_log4cpp FALSE)
set(_uses_spdlog FALSE)
foreach(_loop_var IN LISTS _logger_content)
@@ -349,21 +410,29 @@ if(GNURADIO_RUNTIME_INCLUDE_DIRS)
set(_uses_spdlog TRUE)
endif()
endforeach()
if(${_uses_log4cpp})
if(_uses_log4cpp)
find_package(LOG4CPP)
set_package_properties(LOG4CPP PROPERTIES
PURPOSE "Required by GNU Radio."
TYPE REQUIRED
)
if(CMAKE_VERSION VERSION_GREATER 3.13)
target_link_libraries(Gnuradio::filter INTERFACE Log4cpp::log4cpp)
target_link_libraries(Gnuradio::runtime INTERFACE Log4cpp::log4cpp)
if(TARGET Gnuradio::filter)
target_link_libraries(Gnuradio::filter INTERFACE Log4cpp::log4cpp)
endif()
if(TARGET Gnuradio::runtime)
target_link_libraries(Gnuradio::runtime INTERFACE Log4cpp::log4cpp)
endif()
else()
set_target_properties(Gnuradio::filter PROPERTIES INTERFACE_LINK_LIBRARIES Log4cpp::log4cpp)
set_target_properties(Gnuradio::runtime PROPERTIES INTERFACE_LINK_LIBRARIES Log4cpp::log4cpp)
if(TARGET Gnuradio::filter)
set_target_properties(Gnuradio::filter PROPERTIES INTERFACE_LINK_LIBRARIES Log4cpp::log4cpp)
endif()
if(TARGET Gnuradio::runtime)
set_target_properties(Gnuradio::runtime PROPERTIES INTERFACE_LINK_LIBRARIES Log4cpp::log4cpp)
endif()
endif()
endif()
if(${_uses_spdlog})
if(_uses_spdlog)
find_package(spdlog REQUIRED CONFIG)
set_package_properties(spdlog PROPERTIES
URL "https://github.com/gabime/spdlog"
@@ -373,11 +442,19 @@ if(GNURADIO_RUNTIME_INCLUDE_DIRS)
)
set(GNURADIO_USES_SPDLOG TRUE)
if(CMAKE_VERSION VERSION_GREATER 3.13)
target_link_libraries(Gnuradio::runtime INTERFACE spdlog::spdlog)
target_link_libraries(Gnuradio::blocks INTERFACE spdlog::spdlog)
if(TARGET Gnuradio::runtime)
target_link_libraries(Gnuradio::runtime INTERFACE spdlog::spdlog)
endif()
if(TARGET Gnuradio::blocks)
target_link_libraries(Gnuradio::blocks INTERFACE spdlog::spdlog)
endif()
else()
set_target_properties(Gnuradio::runtime PROPERTIES INTERFACE_LINK_LIBRARIES spdlog::spdlog)
set_target_properties(Gnuradio::blocks PROPERTIES INTERFACE_LINK_LIBRARIES spdlog::spdlog)
if(TARGET Gnuradio::runtime)
set_target_properties(Gnuradio::runtime PROPERTIES INTERFACE_LINK_LIBRARIES spdlog::spdlog)
endif()
if(TARGET Gnuradio::blocks)
set_target_properties(Gnuradio::blocks PROPERTIES INTERFACE_LINK_LIBRARIES spdlog::spdlog)
endif()
endif()
endif()
endif()
+1 -1
View File
@@ -23,7 +23,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -33,7 +33,7 @@ if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -17,7 +17,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -17,7 +17,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -35,7 +35,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -35,7 +35,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -17,7 +17,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -17,7 +17,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -17,7 +17,7 @@ if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -23,7 +23,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+124 -86
View File
@@ -1,7 +1,7 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
# FindMATIO
@@ -10,139 +10,166 @@
#
# Once done this will define:
#
# MATIO_FOUND - True if MATIO found.
# MATIO_LIBRARIES - MATIO libraries.
# MATIO_INCLUDE_DIRS - where to find matio.h, etc..
# MATIO_VERSION_STRING - version number as a string (e.g.: "1.3.4")
# MATIO_FOUND - True if MATIO found.
# MATIO_LIBRARIES - MATIO libraries.
# MATIO_INCLUDE_DIRS - Where to find matio.h, etc.
# MATIO_VERSION_STRING - Version number as a string (e.g. "1.5.28")
#
# Provides the following imported target:
# Matio::matio
#
#=============================================================================
# Copyright 2015 Avtech Scientific <http://avtechscientific.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the names of Kitware, Inc., the Insight Software Consortium,
# nor the names of their contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#=============================================================================
# Matio::matio
#
if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
if(NOT MATIO_ROOT)
set(MATIO_ROOT_USER_DEFINED /usr)
else()
set(MATIO_ROOT_USER_DEFINED ${MATIO_ROOT})
endif()
if(DEFINED ENV{MATIO_ROOT})
set(MATIO_ROOT_USER_DEFINED
${MATIO_ROOT_USER_DEFINED}
$ENV{MATIO_ROOT}
)
########################################################################
# Build candidate root list
########################################################################
set(_MATIO_ROOT_HINTS)
if(MATIO_ROOT)
list(APPEND _MATIO_ROOT_HINTS "${MATIO_ROOT}")
endif()
# Look for the header file.
if(DEFINED ENV{MATIO_ROOT} AND NOT "$ENV{MATIO_ROOT}" STREQUAL "")
list(APPEND _MATIO_ROOT_HINTS "$ENV{MATIO_ROOT}")
endif()
if(CMAKE_INSTALL_PREFIX)
list(APPEND _MATIO_ROOT_HINTS "${CMAKE_INSTALL_PREFIX}")
endif()
if(VCPKG_INSTALLED_DIR AND VCPKG_TARGET_TRIPLET)
list(APPEND _MATIO_ROOT_HINTS
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}")
endif()
list(REMOVE_DUPLICATES _MATIO_ROOT_HINTS)
########################################################################
# Search paths for headers and libraries
########################################################################
set(_MATIO_INCLUDE_HINTS)
set(_MATIO_LIBRARY_HINTS)
foreach(_matio_prefix ${_MATIO_ROOT_HINTS})
list(APPEND _MATIO_INCLUDE_HINTS
"${_matio_prefix}"
"${_matio_prefix}/include"
)
list(APPEND _MATIO_LIBRARY_HINTS
"${_matio_prefix}/lib"
"${_matio_prefix}/lib64"
)
endforeach()
list(APPEND _MATIO_INCLUDE_HINTS ${GNSSSDR_INCLUDE_PATHS})
list(APPEND _MATIO_LIBRARY_HINTS ${GNSSSDR_LIB_PATHS})
list(REMOVE_DUPLICATES _MATIO_INCLUDE_HINTS)
list(REMOVE_DUPLICATES _MATIO_LIBRARY_HINTS)
########################################################################
# Find headers and library
########################################################################
find_path(MATIO_INCLUDE_DIR
NAMES matio.h
PATHS
${MATIO_ROOT_USER_DEFINED}/include
${GNSSSDR_INCLUDE_PATHS}
${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include
PATHS ${_MATIO_INCLUDE_HINTS}
DOC "The MATIO include directory"
)
# Look for the library.
find_library(MATIO_LIBRARY
NAMES matio libmatio
PATHS
${MATIO_ROOT_USER_DEFINED}/lib
${MATIO_ROOT_USER_DEFINED}/lib64
${GNSSSDR_LIB_PATHS}
${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib
PATHS ${_MATIO_LIBRARY_HINTS}
DOC "The MATIO library"
)
if(MATIO_INCLUDE_DIR)
# ---------------------------------------------------
# Extract version information from MATIO
# ---------------------------------------------------
# If the file is missing, set all values to 0
########################################################################
# Extract version information from MATIO
########################################################################
if(MATIO_INCLUDE_DIR)
set(MATIO_MAJOR_VERSION 0)
set(MATIO_MINOR_VERSION 0)
set(MATIO_RELEASE_LEVEL 0)
unset(MATIO_CONFIG_FILE)
# new versions of MATIO have `matio_pubconf.h`
if(EXISTS ${MATIO_INCLUDE_DIR}/matio_pubconf.h)
if(EXISTS "${MATIO_INCLUDE_DIR}/matio_pubconf.h")
set(MATIO_CONFIG_FILE "matio_pubconf.h")
else()
elseif(EXISTS "${MATIO_INCLUDE_DIR}/matioConfig.h")
set(MATIO_CONFIG_FILE "matioConfig.h")
endif()
if(MATIO_CONFIG_FILE)
# Read and parse MATIO config header file for version number
file(STRINGS "${MATIO_INCLUDE_DIR}/${MATIO_CONFIG_FILE}" _matio_HEADER_CONTENTS REGEX "#define MATIO_((MAJOR|MINOR)_VERSION)|(RELEASE_LEVEL) ")
file(STRINGS
"${MATIO_INCLUDE_DIR}/${MATIO_CONFIG_FILE}"
_matio_header_contents
REGEX
"#define MATIO_((MAJOR|MINOR)_VERSION|RELEASE_LEVEL) "
)
foreach(line ${_matio_HEADER_CONTENTS})
foreach(line ${_matio_header_contents})
if(line MATCHES "#define ([A-Z_]+) ([0-9]+)")
set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
endif()
endforeach()
unset(_matio_HEADER_CONTENTS)
unset(_matio_header_contents)
endif()
set(MATIO_VERSION_STRING "${MATIO_MAJOR_VERSION}.${MATIO_MINOR_VERSION}.${MATIO_RELEASE_LEVEL}")
set(MATIO_VERSION_STRING
"${MATIO_MAJOR_VERSION}.${MATIO_MINOR_VERSION}.${MATIO_RELEASE_LEVEL}"
)
endif()
mark_as_advanced(MATIO_INCLUDE_DIR MATIO_LIBRARY)
# handle the QUIETLY and REQUIRED arguments and set MATIO_FOUND to TRUE if
# all listed variables are TRUE
########################################################################
# Standard result handling
########################################################################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MATIO REQUIRED_VARS MATIO_LIBRARY MATIO_INCLUDE_DIR VERSION_VAR MATIO_VERSION_STRING)
find_package_handle_standard_args(MATIO
REQUIRED_VARS
MATIO_LIBRARY
MATIO_INCLUDE_DIR
VERSION_VAR
MATIO_VERSION_STRING
)
########################################################################
# Compatibility variables
########################################################################
if(MATIO_FOUND)
set(MATIO_LIBRARIES ${MATIO_LIBRARY})
set(MATIO_INCLUDE_DIRS ${MATIO_INCLUDE_DIR})
set(MATIO_LIBRARIES "${MATIO_LIBRARY}")
set(MATIO_INCLUDE_DIRS "${MATIO_INCLUDE_DIR}")
else()
set(MATIO_LIBRARIES)
set(MATIO_INCLUDE_DIRS)
set(MATIO_LIBRARIES "")
set(MATIO_INCLUDE_DIRS "")
endif()
mark_as_advanced(
MATIO_INCLUDE_DIR
MATIO_LIBRARY
MATIO_LIBRARIES
MATIO_INCLUDE_DIRS
MATIO_VERSION_STRING
)
########################################################################
# Package metadata
########################################################################
if(MATIO_FOUND AND MATIO_VERSION_STRING)
set_package_properties(MATIO PROPERTIES
DESCRIPTION "MATLAB MAT File I/O Library (found: v${MATIO_VERSION_STRING})"
DESCRIPTION
"MATLAB MAT File I/O Library (found: v${MATIO_VERSION_STRING})"
)
else()
set_package_properties(MATIO PROPERTIES
@@ -154,13 +181,24 @@ set_package_properties(MATIO PROPERTIES
URL "https://github.com/tbeu/matio"
)
########################################################################
# Imported target
########################################################################
if(MATIO_FOUND AND NOT TARGET Matio::matio)
add_library(Matio::matio SHARED IMPORTED)
add_library(Matio::matio UNKNOWN IMPORTED)
set_target_properties(Matio::matio PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${MATIO_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${MATIO_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "${MATIO_LIBRARY}"
IMPORTED_IMPLIB "${MATIO_LIBRARY}"
)
endif()
########################################################################
# Cleanup internal variables
########################################################################
unset(_MATIO_ROOT_HINTS)
unset(_MATIO_INCLUDE_HINTS)
unset(_MATIO_LIBRARY_HINTS)
unset(_matio_prefix)
unset(MATIO_CONFIG_FILE)
+147 -54
View File
@@ -1,9 +1,13 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
########################################################################
# Find ORC (Optimized Inner Loops Runtime Compiler)
########################################################################
if(DEFINED __INCLUDED_GNSSSDR_CMAKE_FIND_ORC)
return()
endif()
@@ -17,92 +21,142 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
pkg_check_modules(PC_ORC "orc-0.4 > 0.4.22")
pkg_check_modules(PC_ORC QUIET "orc-0.4 > 0.4.22")
if(NOT ORC_ROOT)
set(ORC_ROOT_USER_PROVIDED /usr/local)
else()
set(ORC_ROOT_USER_PROVIDED ${ORC_ROOT})
########################################################################
# Build candidate root list
########################################################################
set(_ORC_ROOT_HINTS)
if(ORC_ROOT)
list(APPEND _ORC_ROOT_HINTS "${ORC_ROOT}")
endif()
if(DEFINED ENV{ORC_ROOT})
set(ORC_ROOT_USER_PROVIDED
${ORC_ROOT_USER_PROVIDED}
$ENV{ORC_ROOT}
)
if(DEFINED ENV{ORC_ROOT} AND NOT "$ENV{ORC_ROOT}" STREQUAL "")
list(APPEND _ORC_ROOT_HINTS "$ENV{ORC_ROOT}")
endif()
set(ORC_ROOT_USER_PROVIDED
${ORC_ROOT_USER_PROVIDED}
${CMAKE_INSTALL_PREFIX}
)
if(CMAKE_INSTALL_PREFIX)
list(APPEND _ORC_ROOT_HINTS "${CMAKE_INSTALL_PREFIX}")
endif()
if(DEFINED _ORC_ROOT_HINTS)
list(REMOVE_DUPLICATES _ORC_ROOT_HINTS)
endif()
########################################################################
# Search paths for binaries, headers, and libraries
########################################################################
set(_ORC_BIN_HINTS)
set(_ORC_INCLUDE_HINTS)
set(_ORC_LIBRARY_HINTS)
if(PC_ORC_PREFIX)
list(APPEND _ORC_BIN_HINTS "${PC_ORC_PREFIX}/bin")
endif()
if(PC_ORC_TOOLSDIR)
set(ORC_ROOT_USER_PROVIDED
${ORC_ROOT_USER_PROVIDED}
${PC_ORC_TOOLSDIR}
)
list(APPEND _ORC_BIN_HINTS "${PC_ORC_TOOLSDIR}")
endif()
find_program(ORCC_EXECUTABLE orcc
HINTS ${ORC_ROOT_USER_PROVIDED}/bin
PATHS ${CMAKE_SYSTEM_PREFIX_PATH}/bin
if(PC_ORC_INCLUDEDIR)
list(APPEND _ORC_INCLUDE_HINTS "${PC_ORC_INCLUDEDIR}")
endif()
if(PC_ORC_LIBDIR)
list(APPEND _ORC_LIBRARY_HINTS "${PC_ORC_LIBDIR}")
endif()
foreach(_orc_prefix ${_ORC_ROOT_HINTS})
list(APPEND _ORC_BIN_HINTS "${_orc_prefix}/bin")
list(APPEND _ORC_INCLUDE_HINTS "${_orc_prefix}/include")
list(APPEND _ORC_LIBRARY_HINTS
"${_orc_prefix}/lib"
"${_orc_prefix}/lib64"
)
endforeach()
foreach(_orc_system_prefix ${CMAKE_SYSTEM_PREFIX_PATH})
list(APPEND _ORC_BIN_HINTS "${_orc_system_prefix}/bin")
endforeach()
list(APPEND _ORC_INCLUDE_HINTS ${GNSSSDR_INCLUDE_PATHS})
list(APPEND _ORC_LIBRARY_HINTS ${GNSSSDR_LIB_PATHS})
list(REMOVE_DUPLICATES _ORC_BIN_HINTS)
list(REMOVE_DUPLICATES _ORC_INCLUDE_HINTS)
list(REMOVE_DUPLICATES _ORC_LIBRARY_HINTS)
########################################################################
# Find executable, headers, and libraries
########################################################################
find_program(ORCC_EXECUTABLE
NAMES orcc
PATHS ${_ORC_BIN_HINTS}
)
find_path(ORC_INCLUDE_DIR
NAMES orc/orc.h
HINTS ${PC_ORC_INCLUDEDIR}
PATHS ${ORC_ROOT_USER_PROVIDED}/include
${GNSSSDR_INCLUDE_PATHS}
PATHS ${_ORC_INCLUDE_HINTS}
PATH_SUFFIXES orc-0.4
)
find_path(ORC_LIBRARY_DIR
NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}orc-0.4${CMAKE_SHARED_LIBRARY_SUFFIX}
HINTS ${PC_ORC_LIBDIR}
PATHS ${ORC_ROOT_USER_PROVIDED}/lib
${ORC_ROOT_USER_PROVIDED}/lib64
${GNSSSDR_LIB_PATHS}
find_library(ORC_LIBRARY
NAMES orc-0.4
HINTS ${PC_ORC_LIBDIR} ${PC_ORC_LIBRARY_DIRS}
PATHS ${_ORC_LIBRARY_HINTS}
)
find_library(ORC_LIB orc-0.4
HINTS ${PC_ORC_LIBRARY_DIRS}
PATHS ${ORC_ROOT_USER_PROVIDED}/lib
${ORC_ROOT_USER_PROVIDED}/lib64
${GNSSSDR_LIB_PATHS}
find_library(ORC_LIBRARY_STATIC
NAMES
${CMAKE_STATIC_LIBRARY_PREFIX}orc-0.4${CMAKE_STATIC_LIBRARY_SUFFIX}
HINTS ${PC_ORC_LIBDIR} ${PC_ORC_LIBRARY_DIRS}
PATHS ${_ORC_LIBRARY_HINTS}
)
find_library(ORC_LIBRARY_STATIC ${CMAKE_STATIC_LIBRARY_PREFIX}orc-0.4${CMAKE_STATIC_LIBRARY_SUFFIX}
HINTS ${PC_ORC_LIBRARY_DIRS}
PATHS ${ORC_ROOT}/lib
${ORC_ROOT}/lib64
${ORC_ROOT_USER_PROVIDED}/lib
${ORC_ROOT_USER_PROVIDED}/lib64
${GNSSSDR_LIB_PATHS}
)
if(PC_ORC_VERSION)
set(ORC_VERSION ${PC_ORC_VERSION})
########################################################################
# Derive library directory and version
########################################################################
if(ORC_LIBRARY)
get_filename_component(ORC_LIBRARY_DIR "${ORC_LIBRARY}" DIRECTORY)
endif()
list(APPEND ORC_LIBRARY ${ORC_LIB})
if(PC_ORC_VERSION)
set(ORC_VERSION "${PC_ORC_VERSION}")
endif()
set(ORC_INCLUDE_DIRS ${ORC_INCLUDE_DIR})
set(ORC_LIBRARIES ${ORC_LIBRARY})
set(ORC_LIBRARY_DIRS ${ORC_LIBRARY_DIR})
set(ORC_LIBRARIES_STATIC ${ORC_LIBRARY_STATIC})
########################################################################
# Standard result handling
########################################################################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ORC "orc files" ORC_LIBRARY ORC_INCLUDE_DIR ORCC_EXECUTABLE)
find_package_handle_standard_args(ORC
"orc files"
ORC_LIBRARY
ORC_INCLUDE_DIR
ORCC_EXECUTABLE
)
########################################################################
# Package metadata
########################################################################
set_package_properties(ORC PROPERTIES
URL "https://gstreamer.freedesktop.org/modules/orc.html"
)
if(ORC_FOUND AND ORC_VERSION)
set_package_properties(ORC PROPERTIES
DESCRIPTION "The Optimized Inner Loops Runtime Compiler (found: v${ORC_VERSION})"
DESCRIPTION
"The Optimized Inner Loops Runtime Compiler (found: v${ORC_VERSION})"
)
else()
set_package_properties(ORC PROPERTIES
@@ -110,4 +164,43 @@ else()
)
endif()
mark_as_advanced(ORC_INCLUDE_DIR ORC_LIBRARY ORCC_EXECUTABLE)
########################################################################
# Compatibility variables
########################################################################
set(ORC_INCLUDE_DIRS "${ORC_INCLUDE_DIR}")
set(ORC_LIBRARIES "${ORC_LIBRARY}")
set(ORC_LIBRARY_DIRS "${ORC_LIBRARY_DIR}")
set(ORC_LIBRARIES_STATIC "${ORC_LIBRARY_STATIC}")
if(ORC_FOUND AND NOT TARGET ORC::orc)
add_library(ORC::orc UNKNOWN IMPORTED)
set_target_properties(ORC::orc PROPERTIES
IMPORTED_LOCATION "${ORC_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${ORC_INCLUDE_DIR}"
)
endif()
mark_as_advanced(
ORCC_EXECUTABLE
ORC_INCLUDE_DIR
ORC_INCLUDE_DIRS
ORC_LIBRARY
ORC_LIBRARIES
ORC_LIBRARY_DIR
ORC_LIBRARY_DIRS
ORC_LIBRARY_STATIC
ORC_LIBRARIES_STATIC
ORC_VERSION
)
########################################################################
# Cleanup internal variables
########################################################################
unset(_ORC_ROOT_HINTS)
unset(_ORC_BIN_HINTS)
unset(_ORC_INCLUDE_HINTS)
unset(_ORC_LIBRARY_HINTS)
unset(_orc_prefix)
unset(_orc_system_prefix)
+1 -1
View File
@@ -27,7 +27,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+35 -30
View File
@@ -1,7 +1,7 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
# Find the pugixml XML parsing library.
@@ -24,63 +24,68 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
pkg_check_modules(PC_PUGIXML pugixml QUIET)
if(NOT PUGIXML_ROOT)
set(PUGIXML_ROOT_USER_DEFINED /usr)
set(PUGIXML_ROOT_USER_DEFINED "")
if(DEFINED PUGIXML_ROOT AND NOT "${PUGIXML_ROOT}" STREQUAL "")
list(APPEND PUGIXML_ROOT_USER_DEFINED "${PUGIXML_ROOT}")
else()
set(PUGIXML_ROOT_USER_DEFINED ${PUGIXML_ROOT})
list(APPEND PUGIXML_ROOT_USER_DEFINED "/usr")
endif()
if(DEFINED ENV{PUGIXML_ROOT})
set(PUGIXML_ROOT_USER_DEFINED
${PUGIXML_ROOT_USER_DEFINED}
$ENV{PUGIXML_ROOT}
)
list(APPEND PUGIXML_ROOT_USER_DEFINED "$ENV{PUGIXML_ROOT}")
endif()
if(PUGIXML_HOME)
set(PUGIXML_ROOT_USER_DEFINED
${PUGIXML_ROOT_USER_DEFINED}
${PUGIXML_HOME}
)
if(DEFINED PUGIXML_HOME AND NOT "${PUGIXML_HOME}" STREQUAL "")
list(APPEND PUGIXML_ROOT_USER_DEFINED "${PUGIXML_HOME}")
endif()
find_path(PUGIXML_INCLUDE_DIR
NAMES pugixml.hpp
HINTS ${PC_PUGIXML_INCLUDEDIR}
PATHS ${PUGIXML_ROOT_USER_DEFINED}/include
${GNSSSDR_INCLUDE_PATHS}
PATH_SUFFIXES pugixml-${PC_PUGIXML_VERSION} pugixml-1.9
PATHS
${PUGIXML_ROOT_USER_DEFINED}/include
${GNSSSDR_INCLUDE_PATHS}
PATH_SUFFIXES
pugixml-${PC_PUGIXML_VERSION}
pugixml-1.9
)
find_library(PUGIXML_LIBRARY
NAMES pugixml
HINTS ${PC_PUGIXML_LIBDIR}
PATHS ${PUGIXML_ROOT_USER_DEFINED}/lib
${PUGIXML_ROOT_USER_DEFINED}/lib64
${GNSSSDR_LIB_PATHS}
PATH_SUFFIXES pugixml-${PC_PUGIXML_VERSION} pugixml-1.9
PATHS
${PUGIXML_ROOT_USER_DEFINED}/lib
${PUGIXML_ROOT_USER_DEFINED}/lib64
${GNSSSDR_LIB_PATHS}
PATH_SUFFIXES
pugixml-${PC_PUGIXML_VERSION}
pugixml-1.9
)
# Support the REQUIRED and QUIET arguments, and set PUGIXML_FOUND if found.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PUGIXML DEFAULT_MSG PUGIXML_LIBRARY
PUGIXML_INCLUDE_DIR)
find_package_handle_standard_args(PUGIXML DEFAULT_MSG
PUGIXML_LIBRARY
PUGIXML_INCLUDE_DIR
)
if(PUGIXML_FOUND)
set(PUGIXML_LIBRARIES ${PUGIXML_LIBRARY})
set(PUGIXML_LIBRARIES "${PUGIXML_LIBRARY}")
if(NOT PUGIXML_FIND_QUIETLY)
message(STATUS "PugiXML include = ${PUGIXML_INCLUDE_DIR}")
message(STATUS "PugiXML library = ${PUGIXML_LIBRARY}")
endif()
if(PC_PUGIXML_VERSION)
set(PUGIXML_VERSION ${PC_PUGIXML_VERSION})
set(PUGIXML_VERSION "${PC_PUGIXML_VERSION}")
endif()
else()
message(STATUS "PugiXML not found.")
endif()
set_package_properties(PUGIXML PROPERTIES
@@ -89,7 +94,8 @@ set_package_properties(PUGIXML PROPERTIES
if(PUGIXML_FOUND AND PUGIXML_VERSION)
set_package_properties(PUGIXML PROPERTIES
DESCRIPTION "Light-weight, simple and fast XML parser for C++ (found: v${PUGIXML_VERSION})"
DESCRIPTION
"Light-weight, simple and fast XML parser for C++ (found: v${PUGIXML_VERSION})"
)
else()
set_package_properties(PUGIXML PROPERTIES
@@ -100,11 +106,10 @@ endif()
mark_as_advanced(PUGIXML_LIBRARY PUGIXML_INCLUDE_DIR)
if(PUGIXML_FOUND AND NOT TARGET Pugixml::pugixml)
add_library(Pugixml::pugixml SHARED IMPORTED)
add_library(Pugixml::pugixml UNKNOWN IMPORTED)
set_target_properties(Pugixml::pugixml PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${PUGIXML_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${PUGIXML_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "${PUGIXML_LIBRARY}"
)
endif()
+2 -2
View File
@@ -17,7 +17,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
@@ -62,7 +62,7 @@ if(PC_TELEORBIT_VERSION)
set(TELEORBIT_VERSION ${PC_TELEORBIT_VERSION})
endif()
if(NOT TELEORBIT_VERSION)
if(TELEORBIT_FOUND AND NOT TELEORBIT_VERSION)
set(OLD_PACKAGE_VERSION ${PACKAGE_VERSION})
unset(PACKAGE_VERSION)
list(GET TELEORBIT_LIBRARIES 0 FIRST_DIR)
+129 -32
View File
@@ -1,7 +1,7 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
#
@@ -20,69 +20,167 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
pkg_check_modules(PC_UHD uhd)
if(NOT UHD_ROOT)
set(UHD_ROOT_USER_PROVIDED /usr/local)
set(UHD_ROOT_USER_PROVIDED "")
if(DEFINED UHD_ROOT AND NOT "${UHD_ROOT}" STREQUAL "")
list(APPEND UHD_ROOT_USER_PROVIDED "${UHD_ROOT}")
else()
set(UHD_ROOT_USER_PROVIDED ${UHD_ROOT})
list(APPEND UHD_ROOT_USER_PROVIDED "/usr/local")
endif()
if(GNURADIO_INSTALL_PREFIX)
set(UHD_ROOT_USER_PROVIDED
${UHD_ROOT_USER_PROVIDED}
${GNURADIO_INSTALL_PREFIX}
list(APPEND UHD_ROOT_USER_PROVIDED
"${GNURADIO_INSTALL_PREFIX}"
)
endif()
if(DEFINED ENV{UHD_ROOT})
set(UHD_ROOT_USER_PROVIDED
${UHD_ROOT_USER_PROVIDED}
$ENV{UHD_ROOT}
list(APPEND UHD_ROOT_USER_PROVIDED
"$ENV{UHD_ROOT}"
)
endif()
if(DEFINED ENV{UHD_DIR})
set(UHD_ROOT_USER_PROVIDED
${UHD_ROOT_USER_PROVIDED}
$ENV{UHD_DIR}
list(APPEND UHD_ROOT_USER_PROVIDED
"$ENV{UHD_DIR}"
)
endif()
find_path(UHD_INCLUDE_DIRS
NAMES uhd/config.hpp
HINTS ${PC_UHD_INCLUDEDIR}
PATHS ${UHD_ROOT_USER_PROVIDED}/include
${GNSSSDR_INCLUDE_PATHS}
PATHS
${UHD_ROOT_USER_PROVIDED}/include
${GNSSSDR_INCLUDE_PATHS}
)
find_library(UHD_LIBRARIES
NAMES uhd
HINTS ${PC_UHD_LIBDIR}
PATHS ${UHD_ROOT_USER_PROVIDED}/lib
${UHD_ROOT_USER_PROVIDED}/lib64
${GNSSSDR_LIB_PATHS}
PATHS
${UHD_ROOT_USER_PROVIDED}/lib
${UHD_ROOT_USER_PROVIDED}/lib64
${GNSSSDR_LIB_PATHS}
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(UHD DEFAULT_MSG UHD_LIBRARIES UHD_INCLUDE_DIRS)
find_package_handle_standard_args(UHD DEFAULT_MSG
UHD_LIBRARIES
UHD_INCLUDE_DIRS
)
if(PC_UHD_VERSION)
set(UHD_VERSION ${PC_UHD_VERSION})
endif()
if(NOT PC_UHD_VERSION)
set(OLD_PACKAGE_VERSION ${PACKAGE_VERSION})
set(UHD_VERSION "${PC_UHD_VERSION}")
else()
if(DEFINED PACKAGE_VERSION)
set(_UHD_OLD_PACKAGE_VERSION "${PACKAGE_VERSION}")
set(_UHD_HAD_PACKAGE_VERSION TRUE)
else()
unset(_UHD_OLD_PACKAGE_VERSION)
set(_UHD_HAD_PACKAGE_VERSION FALSE)
endif()
unset(PACKAGE_VERSION)
list(GET UHD_LIBRARIES 0 FIRST_DIR)
get_filename_component(UHD_LIBRARIES_DIR ${FIRST_DIR} DIRECTORY)
if(EXISTS ${UHD_LIBRARIES_DIR}/cmake/uhd/UHDConfigVersion.cmake)
include(${UHD_LIBRARIES_DIR}/cmake/uhd/UHDConfigVersion.cmake)
unset(_UHD_VERSION_CMAKE_FILES)
unset(_UHD_VERSION_HEADER)
unset(_UHD_VERSION_FROM_HEADER)
if(UHD_LIBRARIES)
get_filename_component(UHD_LIBRARIES_DIR "${UHD_LIBRARIES}" DIRECTORY)
get_filename_component(UHD_PREFIX_DIR "${UHD_LIBRARIES_DIR}" DIRECTORY)
set(_UHD_VERSION_CMAKE_FILES
"${UHD_LIBRARIES_DIR}/cmake/uhd/UHDConfigVersion.cmake"
"${UHD_LIBRARIES_DIR}/cmake/UHD/UHDConfigVersion.cmake"
"${UHD_PREFIX_DIR}/lib/cmake/uhd/UHDConfigVersion.cmake"
"${UHD_PREFIX_DIR}/lib/cmake/UHD/UHDConfigVersion.cmake"
"${UHD_PREFIX_DIR}/lib64/cmake/uhd/UHDConfigVersion.cmake"
"${UHD_PREFIX_DIR}/lib64/cmake/UHD/UHDConfigVersion.cmake"
"${UHD_PREFIX_DIR}/share/uhd/cmake/UHDConfigVersion.cmake"
"${UHD_PREFIX_DIR}/share/UHD/cmake/UHDConfigVersion.cmake"
)
foreach(_uhd_version_file IN LISTS _UHD_VERSION_CMAKE_FILES)
if(EXISTS "${_uhd_version_file}")
include("${_uhd_version_file}")
if(PACKAGE_VERSION)
break()
endif()
endif()
endforeach()
endif()
if(PACKAGE_VERSION)
set(UHD_VERSION ${PACKAGE_VERSION})
set(UHD_VERSION "${PACKAGE_VERSION}")
elseif(UHD_INCLUDE_DIRS)
set(_UHD_VERSION_HEADER "${UHD_INCLUDE_DIRS}/uhd/version.hpp")
if(EXISTS "${_UHD_VERSION_HEADER}")
file(STRINGS "${_UHD_VERSION_HEADER}"
_uhd_version_major_line
REGEX "^#define[ \t]+UHD_VERSION_MAJOR[ \t]+[0-9]+"
)
file(STRINGS "${_UHD_VERSION_HEADER}"
_uhd_version_api_line
REGEX "^#define[ \t]+UHD_VERSION_API[ \t]+[0-9]+"
)
file(STRINGS "${_UHD_VERSION_HEADER}"
_uhd_version_abi_line
REGEX "^#define[ \t]+UHD_VERSION_ABI[ \t]+[0-9]+"
)
file(STRINGS "${_UHD_VERSION_HEADER}"
_uhd_version_abi_string_line
REGEX "^#define[ \t]+UHD_VERSION_ABI_STRING[ \t]+\"[^\"]+\""
)
if(_uhd_version_abi_string_line)
string(REGEX REPLACE
"^#define[ \t]+UHD_VERSION_ABI_STRING[ \t]+\"([^\"]+)\"$"
"\\1"
_uhd_version_abi_string
"${_uhd_version_abi_string_line}"
)
set(_UHD_VERSION_FROM_HEADER "${_uhd_version_abi_string}")
elseif(_uhd_version_major_line AND _uhd_version_api_line
AND _uhd_version_abi_line)
string(REGEX REPLACE
"^#define[ \t]+UHD_VERSION_MAJOR[ \t]+([0-9]+)$"
"\\1"
_uhd_version_major
"${_uhd_version_major_line}"
)
string(REGEX REPLACE
"^#define[ \t]+UHD_VERSION_API[ \t]+([0-9]+)$"
"\\1"
_uhd_version_api
"${_uhd_version_api_line}"
)
string(REGEX REPLACE
"^#define[ \t]+UHD_VERSION_ABI[ \t]+([0-9]+)$"
"\\1"
_uhd_version_abi
"${_uhd_version_abi_line}"
)
set(_UHD_VERSION_FROM_HEADER
"${_uhd_version_major}.${_uhd_version_api}.${_uhd_version_abi}")
endif()
endif()
if(_UHD_VERSION_FROM_HEADER)
set(UHD_VERSION "${_UHD_VERSION_FROM_HEADER}")
endif()
endif()
if(_UHD_HAD_PACKAGE_VERSION)
set(PACKAGE_VERSION "${_UHD_OLD_PACKAGE_VERSION}")
else()
unset(PACKAGE_VERSION)
endif()
set(PACKAGE_VERSION ${OLD_PACKAGE_VERSION})
endif()
set_package_properties(UHD PROPERTIES
@@ -100,12 +198,11 @@ else()
endif()
if(UHD_FOUND AND NOT TARGET Uhd::uhd)
add_library(Uhd::uhd SHARED IMPORTED)
add_library(Uhd::uhd UNKNOWN IMPORTED)
set_target_properties(Uhd::uhd PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${UHD_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${UHD_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${UHD_LIBRARIES}"
)
endif()
+172 -58
View File
@@ -1,7 +1,7 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
#
@@ -20,78 +20,145 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
pkg_check_modules(PC_VOLK volk QUIET)
if(NOT VOLK_ROOT)
set(VOLK_ROOT_USER_PROVIDED /usr)
else()
set(VOLK_ROOT_USER_PROVIDED ${VOLK_ROOT})
endif()
if(DEFINED ENV{VOLK_ROOT})
set(VOLK_ROOT_USER_PROVIDED
${VOLK_ROOT_USER_PROVIDED}
$ENV{VOLK_ROOT}
)
endif()
if(DEFINED ENV{VOLK_DIR})
set(VOLK_ROOT_USER_PROVIDED
${VOLK_ROOT_USER_PROVIDED}
$ENV{VOLK_DIR}
)
endif()
set(VOLK_ROOT_USER_PROVIDED
${VOLK_ROOT_USER_PROVIDED}
${CMAKE_INSTALL_PREFIX}
)
find_path(VOLK_INCLUDE_DIRS
########################################################################
# Build candidate root list
########################################################################
set(_VOLK_ROOT_HINTS)
if(VOLK_ROOT)
list(APPEND _VOLK_ROOT_HINTS "${VOLK_ROOT}")
endif()
if(DEFINED ENV{VOLK_ROOT} AND NOT "$ENV{VOLK_ROOT}" STREQUAL "")
list(APPEND _VOLK_ROOT_HINTS "$ENV{VOLK_ROOT}")
endif()
if(DEFINED ENV{VOLK_DIR} AND NOT "$ENV{VOLK_DIR}" STREQUAL "")
list(APPEND _VOLK_ROOT_HINTS "$ENV{VOLK_DIR}")
endif()
if(CMAKE_INSTALL_PREFIX)
list(APPEND _VOLK_ROOT_HINTS "${CMAKE_INSTALL_PREFIX}")
endif()
if(DEFINED _VOLK_ROOT_HINTS)
list(REMOVE_DUPLICATES _VOLK_ROOT_HINTS)
endif()
########################################################################
# Search paths for headers and libraries
########################################################################
set(_VOLK_INCLUDE_HINTS)
set(_VOLK_LIBRARY_HINTS)
if(PC_VOLK_INCLUDEDIR)
list(APPEND _VOLK_INCLUDE_HINTS "${PC_VOLK_INCLUDEDIR}")
endif()
if(PC_VOLK_LIBDIR)
list(APPEND _VOLK_LIBRARY_HINTS "${PC_VOLK_LIBDIR}")
endif()
foreach(_volk_prefix ${_VOLK_ROOT_HINTS})
list(APPEND _VOLK_INCLUDE_HINTS "${_volk_prefix}/include")
list(APPEND _VOLK_LIBRARY_HINTS
"${_volk_prefix}/lib"
"${_volk_prefix}/lib64"
)
endforeach()
list(APPEND _VOLK_INCLUDE_HINTS ${GNSSSDR_INCLUDE_PATHS})
list(APPEND _VOLK_LIBRARY_HINTS ${GNSSSDR_LIB_PATHS})
list(REMOVE_DUPLICATES _VOLK_INCLUDE_HINTS)
list(REMOVE_DUPLICATES _VOLK_LIBRARY_HINTS)
########################################################################
# Find headers and library
########################################################################
find_path(VOLK_INCLUDE_DIR
NAMES volk/volk.h
HINTS ${PC_VOLK_INCLUDEDIR}
PATHS ${VOLK_ROOT_USER_PROVIDED}/include
${GNSSSDR_INCLUDE_PATHS}
PATHS ${_VOLK_INCLUDE_HINTS}
)
find_library(VOLK_LIBRARIES
find_library(VOLK_LIBRARY
NAMES volk
HINTS ${PC_VOLK_LIBDIR}
PATHS ${VOLK_ROOT_USER_PROVIDED}/lib
${VOLK_ROOT_USER_PROVIDED}/lib64
${GNSSSDR_LIB_PATHS}
PATHS ${_VOLK_LIBRARY_HINTS}
)
########################################################################
# Standard result handling
########################################################################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(VOLK DEFAULT_MSG VOLK_LIBRARIES VOLK_INCLUDE_DIRS)
find_package_handle_standard_args(VOLK DEFAULT_MSG
VOLK_LIBRARY
VOLK_INCLUDE_DIR
)
########################################################################
# Determine version
########################################################################
if(PC_VOLK_VERSION)
set(VOLK_VERSION ${PC_VOLK_VERSION})
set(VOLK_VERSION "${PC_VOLK_VERSION}")
endif()
if(NOT VOLK_VERSION)
set(OLD_PACKAGE_VERSION ${PACKAGE_VERSION})
unset(PACKAGE_VERSION)
list(GET VOLK_LIBRARIES 0 FIRST_DIR)
get_filename_component(VOLK_LIB_DIR ${FIRST_DIR} DIRECTORY)
if(EXISTS ${VOLK_LIB_DIR}/cmake/volk/VolkConfigVersion.cmake)
if(VOLK_FOUND AND NOT VOLK_VERSION)
get_filename_component(_VOLK_LIB_DIR "${VOLK_LIBRARY}" DIRECTORY)
if(EXISTS "${_VOLK_LIB_DIR}/cmake/volk/VolkConfigVersion.cmake")
if(DEFINED PACKAGE_VERSION)
set(_VOLK_PACKAGE_VERSION_WAS_DEFINED TRUE)
set(_VOLK_OLD_PACKAGE_VERSION "${PACKAGE_VERSION}")
else()
set(_VOLK_PACKAGE_VERSION_WAS_DEFINED FALSE)
endif()
unset(PACKAGE_VERSION)
set(PACKAGE_FIND_VERSION_MAJOR 0)
include(${VOLK_LIB_DIR}/cmake/volk/VolkConfigVersion.cmake)
include("${_VOLK_LIB_DIR}/cmake/volk/VolkConfigVersion.cmake")
if(PACKAGE_VERSION)
set(VOLK_VERSION "${PACKAGE_VERSION}")
endif()
unset(PACKAGE_VERSION)
unset(PACKAGE_FIND_VERSION_MAJOR)
if(_VOLK_PACKAGE_VERSION_WAS_DEFINED)
set(PACKAGE_VERSION "${_VOLK_OLD_PACKAGE_VERSION}")
else()
unset(PACKAGE_VERSION)
endif()
unset(_VOLK_PACKAGE_VERSION_WAS_DEFINED)
unset(_VOLK_OLD_PACKAGE_VERSION)
endif()
if(PACKAGE_VERSION)
set(VOLK_VERSION ${PACKAGE_VERSION})
endif()
set(PACKAGE_VERSION ${OLD_PACKAGE_VERSION})
endif()
########################################################################
# Package metadata
########################################################################
set_package_properties(VOLK PROPERTIES
URL "https://www.libvolk.org"
)
if(VOLK_FOUND AND VOLK_VERSION)
set_package_properties(VOLK PROPERTIES
DESCRIPTION "Vector-Optimized Library of Kernels (found: v${VOLK_VERSION})"
DESCRIPTION
"Vector-Optimized Library of Kernels (found: v${VOLK_VERSION})"
)
else()
set_package_properties(VOLK PROPERTIES
@@ -99,24 +166,71 @@ else()
)
endif()
mark_as_advanced(VOLK_LIBRARIES VOLK_INCLUDE_DIRS VOLK_VERSION)
########################################################################
# ORC support
########################################################################
if(NOT ORC_FOUND)
find_package(ORC QUIET)
endif()
if(ORC_LIBRARIES_STATIC)
set(VOLK_LINK_LIBRARIES ${VOLK_LIBRARIES} ${ORC_LIBRARIES_STATIC})
set(VOLK_INCLUDE_DIRS ${VOLK_INCLUDE_DIRS} ${ORC_INCLUDE_DIRS})
else()
set(VOLK_LINK_LIBRARIES ${VOLK_LIBRARIES})
set(VOLK_LINK_LIBRARIES)
set(VOLK_INTERFACE_INCLUDE_DIRS "${VOLK_INCLUDE_DIR}")
if(ORC_FOUND AND ORC_LIBRARIES_STATIC)
list(APPEND VOLK_LINK_LIBRARIES ${ORC_LIBRARIES_STATIC})
if(VOLK_VERSION AND VOLK_VERSION VERSION_LESS "2.3.0")
if(ORC_INCLUDE_DIRS)
list(APPEND VOLK_INTERFACE_INCLUDE_DIRS ${ORC_INCLUDE_DIRS})
endif()
endif()
endif()
if(VOLK_FOUND AND NOT TARGET Volk::volk)
add_library(Volk::volk SHARED IMPORTED)
set_target_properties(Volk::volk PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${VOLK_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${VOLK_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${VOLK_LINK_LIBRARIES}"
)
list(REMOVE_DUPLICATES VOLK_INTERFACE_INCLUDE_DIRS)
if(DEFINED VOLK_LINK_LIBRARIES)
list(REMOVE_DUPLICATES VOLK_LINK_LIBRARIES)
endif()
########################################################################
# Compatibility variables
########################################################################
set(VOLK_LIBRARIES "${VOLK_LIBRARY}")
set(VOLK_INCLUDE_DIRS "${VOLK_INTERFACE_INCLUDE_DIRS}")
mark_as_advanced(
VOLK_LIBRARY
VOLK_INCLUDE_DIR
VOLK_LIBRARIES
VOLK_INCLUDE_DIRS
VOLK_VERSION
)
########################################################################
# Define imported target
########################################################################
if(VOLK_FOUND AND NOT TARGET Volk::volk)
add_library(Volk::volk UNKNOWN IMPORTED)
set_target_properties(Volk::volk PROPERTIES
IMPORTED_LOCATION "${VOLK_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${VOLK_INTERFACE_INCLUDE_DIRS}"
)
if(VOLK_LINK_LIBRARIES)
set_target_properties(Volk::volk PROPERTIES
INTERFACE_LINK_LIBRARIES "${VOLK_LINK_LIBRARIES}"
)
endif()
endif()
########################################################################
# Cleanup internal variables
########################################################################
unset(_VOLK_ROOT_HINTS)
unset(_VOLK_INCLUDE_HINTS)
unset(_VOLK_LIBRARY_HINTS)
unset(_VOLK_LIB_DIR)
unset(_volk_prefix)
unset(VOLK_INTERFACE_INCLUDE_DIRS)
unset(VOLK_LINK_LIBRARIES)
+1 -1
View File
@@ -21,7 +21,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+1 -1
View File
@@ -17,7 +17,7 @@ if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
+2 -2
View File
@@ -8,7 +8,7 @@ if(NOT COMMAND feature_summary)
include(FeatureSummary)
endif()
if(NOT GNSSSDR_LIB_PATHS)
if(NOT DEFINED GNSSSDR_LIB_PATHS)
include(GnsssdrFindPaths)
endif()
@@ -73,7 +73,7 @@ else()
message(" The GnuTLS library with openssl compatibility enabled has not been found.")
message(" You can try to install the required libraries by typing:")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(" sudo yum install openssl-devel")
else()
message(" sudo apt install libgnutls28-dev")
+334 -153
View File
@@ -1,33 +1,137 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2011-2020 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2011-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
########################################################################
# Check for the existence of a python module:
# - desc a string description of the check
# - mod the name of the module to import
# - cmd an additional command to run
# - have the result variable to set
# Internal helper:
# Run a Python snippet with the selected interpreter.
#
# Usage:
# gnsssdr_python_run("<python code>" result_var)
#
# The Python code must exit with code 0 on success and non-zero on failure.
########################################################################
macro(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have)
message(STATUS "Python checking for ${desc}")
macro(GNSSSDR_PYTHON_RUN code result_var)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c "
#########################################
try: import ${mod}
except:
try: ${mod}
except: exit(-1)
try: assert ${cmd}
except: exit(-1)
#########################################"
OUTPUT_QUIET ERROR_QUIET
RESULT_VARIABLE ${have}
COMMAND ${PYTHON_EXECUTABLE} -c "${code}"
OUTPUT_QUIET
ERROR_QUIET
RESULT_VARIABLE _gnsssdr_python_run_result
)
if(${have} EQUAL 0)
set(${result_var} ${_gnsssdr_python_run_result})
endmacro()
########################################################################
# Internal helper:
# Read Python version information from the selected interpreter.
#
# Sets:
# PYTHON_VERSION_STRING
# PYTHON_VERSION_MAJOR
########################################################################
macro(GNSSSDR_PYTHON_GET_VERSION)
unset(PYTHON_VERSION_STRING)
unset(PYTHON_VERSION_MAJOR)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
"import sys; sys.stdout.write(sys.version.split()[0])"
OUTPUT_VARIABLE PYTHON_VERSION_STRING
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${PYTHON_VERSION_STRING}" STREQUAL "")
string(SUBSTRING "${PYTHON_VERSION_STRING}" 0 1 PYTHON_VERSION_MAJOR)
endif()
endmacro()
########################################################################
# Check that Python satisfies a minimum version.
#
# Arguments:
# minver Minimum version string, e.g. 2.7 or 3.6
# have Output variable set to TRUE/FALSE
########################################################################
macro(GNSSSDR_PYTHON_CHECK_MIN_VERSION minver have)
message(STATUS "Python checking for python >= ${minver}")
gnsssdr_python_run(
"import sys
def norm(v):
out = []
for p in str(v).split('.'):
n = ''.join([c for c in p if '0' <= c <= '9'])
out.append(int(n or '0'))
while len(out) < 3:
out.append(0)
return tuple(out)
sys.exit(0 if norm(sys.version.split()[0]) >= norm('${minver}') else 1)"
_gnsssdr_python_minver_result
)
if(_gnsssdr_python_minver_result EQUAL 0)
message(STATUS "Python checking for python >= ${minver} - found")
set(${have} TRUE)
else()
message(STATUS "Python checking for python >= ${minver} - not found")
set(${have} FALSE)
endif()
endmacro()
########################################################################
# Check for a Python module, optionally with a minimum version.
#
# Arguments:
# desc Human-readable description
# mod Module name to import
# minver Minimum module version, or empty string to skip version check
# have Output variable set to TRUE/FALSE
#
########################################################################
macro(GNSSSDR_PYTHON_CHECK_MODULE desc mod minver have)
message(STATUS "Python checking for ${desc}")
if("${minver}" STREQUAL "")
gnsssdr_python_run(
"import sys
try:
import ${mod}
except Exception:
sys.exit(1)
sys.exit(0)"
_gnsssdr_python_module_result
)
else()
gnsssdr_python_run(
"import sys
try:
import ${mod}
except Exception:
sys.exit(1)
def norm(v):
out = []
for p in str(v).split('.'):
n = ''.join([c for c in p if '0' <= c <= '9'])
out.append(int(n or '0'))
while len(out) < 3:
out.append(0)
return tuple(out)
try:
modver = ${mod}.__version__
except Exception:
sys.exit(1)
sys.exit(0 if norm(modver) >= norm('${minver}') else 1)"
_gnsssdr_python_module_result
)
endif()
if(_gnsssdr_python_module_result EQUAL 0)
message(STATUS "Python checking for ${desc} - found")
set(${have} TRUE)
else()
@@ -38,159 +142,236 @@ endmacro()
########################################################################
# Setup the python interpreter:
# This allows the user to specify a specific interpreter,
# or finds the interpreter via the built-in cmake module.
# Internal helper:
# Test whether a given interpreter is suitable.
#
# Conditions:
# - Python version >= GNSSSDR_PYTHON_MIN_VERSION
# - mako >= GNSSSDR_MAKO_MIN_VERSION
# - six present if Python 2
#
# Arguments:
# candidate Full path to Python interpreter
# have Output variable set to TRUE/FALSE
########################################################################
function(GNSSSDR_PYTHON_EVALUATE_CANDIDATE candidate have)
set(${have} FALSE PARENT_SCOPE)
if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING)
if(PYTHON_EXECUTABLE)
message(STATUS "User set python executable ${PYTHON_EXECUTABLE}")
string(FIND "${PYTHON_EXECUTABLE}" "python3" IS_PYTHON3)
if(IS_PYTHON3 EQUAL -1)
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${GNSSSDR_PYTHON_MIN_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python2 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python2_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python2_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
endif()
else()
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${GNSSSDR_PYTHON3_MIN_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python3 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python3_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python3_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
endif()
endif()
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
if(IS_PYTHON3 EQUAL -1)
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
if("${candidate}" STREQUAL "")
return()
endif()
if(NOT EXISTS "${candidate}")
return()
endif()
set(PYTHON_EXECUTABLE "${candidate}")
gnsssdr_python_get_version()
if("${PYTHON_VERSION_STRING}" STREQUAL "")
return()
endif()
gnsssdr_python_check_min_version(
${GNSSSDR_PYTHON_MIN_VERSION}
_GNSSSDR_PYTHON_MIN_VER_FOUND
)
if(NOT _GNSSSDR_PYTHON_MIN_VER_FOUND)
return()
endif()
gnsssdr_python_check_module(
"mako >= ${GNSSSDR_MAKO_MIN_VERSION}"
mako
${GNSSSDR_MAKO_MIN_VERSION}
_GNSSSDR_MAKO_FOUND
)
if(NOT _GNSSSDR_MAKO_FOUND)
return()
endif()
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
gnsssdr_python_check_module(
"six - python 2 and 3 compatibility library"
six
""
_GNSSSDR_SIX_FOUND
)
if(NOT _GNSSSDR_SIX_FOUND)
return()
endif()
else()
message(STATUS "PYTHON_EXECUTABLE not set - trying by default python3")
if(CMAKE_VERSION VERSION_LESS "3.24")
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11)
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
if(NOT PYTHONINTERP_FOUND)
message(STATUS "python3 not found - trying with python2.7")
if(CMAKE_VERSION VERSION_LESS "3.24")
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11)
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python2 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python2_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python2_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python2_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
endif()
endif()
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
set(_GNSSSDR_SIX_FOUND TRUE)
endif()
else()
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(_previous ${CMAKE_FIND_FRAMEWORK})
set(_GNSSSDR_CANDIDATE_VERSION_STRING "${PYTHON_VERSION_STRING}"
PARENT_SCOPE)
set(_GNSSSDR_CANDIDATE_VERSION_MAJOR "${PYTHON_VERSION_MAJOR}"
PARENT_SCOPE)
set(_GNSSSDR_CANDIDATE_PYTHON_MIN_VER_FOUND
"${_GNSSSDR_PYTHON_MIN_VER_FOUND}" PARENT_SCOPE)
set(_GNSSSDR_CANDIDATE_MAKO_FOUND "${_GNSSSDR_MAKO_FOUND}"
PARENT_SCOPE)
set(_GNSSSDR_CANDIDATE_SIX_FOUND "${_GNSSSDR_SIX_FOUND}"
PARENT_SCOPE)
set(${have} TRUE PARENT_SCOPE)
endfunction()
########################################################################
# Select the Python interpreter
#
# Strategy:
# 1) Respect user-provided PYTHON_EXECUTABLE
# 2) On modern CMake, try Python3 then Python2
# 3) On old CMake, collect candidates from PythonInterp and explicit names
# 4) Last resort: find_program()
#
# The selected interpreter must satisfy all required module checks.
########################################################################
set(_GNSSSDR_PYTHON_CANDIDATES "")
set(_GNSSSDR_SELECTED_PYTHON "")
set(_GNSSSDR_USER_PYTHON_EXECUTABLE "")
if(DEFINED PYTHON_EXECUTABLE AND NOT "${PYTHON_EXECUTABLE}" STREQUAL "")
set(_GNSSSDR_USER_PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}")
endif()
set(PYTHONINTERP_FOUND FALSE)
set(PYTHON_MIN_VER_FOUND FALSE)
set(MAKO_FOUND FALSE)
set(SIX_FOUND FALSE)
unset(PYTHON_VERSION_MAJOR)
unset(PYTHON_VERSION_STRING)
unset(PYTHON3)
########################################################################
# Build candidate list
########################################################################
# 1) Respect user-provided interpreter first
if(NOT "${_GNSSSDR_USER_PYTHON_EXECUTABLE}" STREQUAL "")
message(STATUS
"User set python executable ${_GNSSSDR_USER_PYTHON_EXECUTABLE}"
)
list(APPEND _GNSSSDR_PYTHON_CANDIDATES
"${_GNSSSDR_USER_PYTHON_EXECUTABLE}"
)
endif()
# 2) Modern CMake (>= 3.12): prefer Python3, then Python2
if(NOT CMAKE_VERSION VERSION_LESS "3.12" AND NOT CMAKE_CROSSCOMPILING)
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(_GNSSSDR_PREVIOUS_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
set(CMAKE_FIND_FRAMEWORK LAST)
endif()
if(PYTHON_EXECUTABLE)
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
endif()
unset(Python3_EXECUTABLE)
unset(Python2_EXECUTABLE)
unset(Python3_FOUND)
unset(Python2_FOUND)
find_package(Python3 COMPONENTS Interpreter)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_FIND_FRAMEWORK ${_previous})
endif()
if(Python3_FOUND)
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
set(PYTHON_VERSION_MAJOR "${Python3_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
endif()
if(NOT Python3_FOUND OR NOT MAKO_FOUND)
list(APPEND _GNSSSDR_PYTHON_CANDIDATES "${Python3_EXECUTABLE}")
else()
find_package(Python2 COMPONENTS Interpreter)
if(Python2_FOUND)
set(PYTHON_EXECUTABLE ${Python2_EXECUTABLE})
set(PYTHON_VERSION_MAJOR ${Python2_VERSION_MAJOR})
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
if(NOT MAKO_FOUND OR NOT SIX_FOUND)
unset(PYTHON_EXECUTABLE)
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
endif()
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
if(NOT MAKO_FOUND)
unset(PYTHON_EXECUTABLE)
unset(PYTHON_VERSION_STRING)
unset(PYTHON_VERSION_MAJOR)
find_program(PYTHON_EXECUTABLE NAMES python3 python)
if(PYTHON_EXECUTABLE)
set(PYTHONINTERP_FOUND TRUE)
execute_process(COMMAND ${PYTHON_EXECUTABLE} --version OUTPUT_VARIABLE PYTHON_VERSION_STRING_AUX)
string(FIND "${PYTHON_VERSION_STRING_AUX}" " " blank_char_index)
if(blank_char_index GREATER -1)
math(EXPR start_index "${blank_char_index} + 1")
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} -1 PYTHON_VERSION_STRING)
string(STRIP ${PYTHON_VERSION_STRING} PYTHON_VERSION_STRING)
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} 1 PYTHON_VERSION_MAJOR)
message(STATUS "Found Python: ${PYTHON_EXECUTABLE} (found version: ${PYTHON_VERSION_STRING})")
else()
string(FIND ${PYTHON_EXECUTABLE} "python3" is_python3)
if(is_python3 GREATER -1)
set(PYTHON_VERSION_MAJOR "3")
set(PYTHON_VERSION_STRING "3.10") # ?
else()
set(PYTHON_VERSION_MAJOR "2")
set(PYTHON_VERSION_STRING "2.7")
endif()
endif()
endif()
gnsssdr_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
endif()
if(MAKO_FOUND AND PYTHON_VERSION_STRING VERSION_LESS "3.0")
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
list(APPEND _GNSSSDR_PYTHON_CANDIDATES "${Python2_EXECUTABLE}")
endif()
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(CMAKE_FIND_FRAMEWORK ${_GNSSSDR_PREVIOUS_CMAKE_FIND_FRAMEWORK})
endif()
# 3) Old CMake: use PythonInterp as a candidate source,
# but still validate the interpreter before accepting it
else()
set(Python_ADDITIONAL_VERSIONS
3.11 3.10 3.9 3.8 3.7 3.6 3.5 3.4 2.7
)
if(CMAKE_VERSION VERSION_LESS "2.8.12")
find_package(PythonInterp)
else()
find_package(PythonInterp ${GNSSSDR_PYTHON_MIN_VERSION})
endif()
if(PYTHONINTERP_FOUND AND NOT "${PYTHON_EXECUTABLE}" STREQUAL "")
list(APPEND _GNSSSDR_PYTHON_CANDIDATES "${PYTHON_EXECUTABLE}")
endif()
endif()
if("${PYTHON_VERSION_MAJOR}" VERSION_EQUAL 3)
# 4) Last-resort program-name fallbacks, in preferred order
find_program(_GNSSSDR_PYTHON3 NAMES python3)
find_program(_GNSSSDR_PYTHON2 NAMES python2.7 python2)
find_program(_GNSSSDR_PYTHON NAMES python)
foreach(_gnsssdr_python_prog
${_GNSSSDR_PYTHON3}
${_GNSSSDR_PYTHON2}
${_GNSSSDR_PYTHON}
)
if(NOT "${_gnsssdr_python_prog}" STREQUAL "")
list(APPEND _GNSSSDR_PYTHON_CANDIDATES "${_gnsssdr_python_prog}")
endif()
endforeach()
list(REMOVE_DUPLICATES _GNSSSDR_PYTHON_CANDIDATES)
########################################################################
# Evaluate candidates and accept the first fully suitable interpreter
########################################################################
foreach(_GNSSSDR_PYTHON_CANDIDATE IN LISTS _GNSSSDR_PYTHON_CANDIDATES)
message(STATUS
"Trying Python candidate: ${_GNSSSDR_PYTHON_CANDIDATE}")
gnsssdr_python_evaluate_candidate(
"${_GNSSSDR_PYTHON_CANDIDATE}"
_GNSSSDR_PYTHON_CANDIDATE_OK
)
if(_GNSSSDR_PYTHON_CANDIDATE_OK)
set(_GNSSSDR_SELECTED_PYTHON "${_GNSSSDR_PYTHON_CANDIDATE}")
break()
endif()
endforeach()
if(NOT "${_GNSSSDR_SELECTED_PYTHON}" STREQUAL "")
set(PYTHON_EXECUTABLE "${_GNSSSDR_SELECTED_PYTHON}")
set(PYTHONINTERP_FOUND TRUE)
set(PYTHON_VERSION_STRING "${_GNSSSDR_CANDIDATE_VERSION_STRING}")
set(PYTHON_VERSION_MAJOR "${_GNSSSDR_CANDIDATE_VERSION_MAJOR}")
set(PYTHON_MIN_VER_FOUND "${_GNSSSDR_CANDIDATE_PYTHON_MIN_VER_FOUND}")
set(MAKO_FOUND "${_GNSSSDR_CANDIDATE_MAKO_FOUND}")
set(SIX_FOUND "${_GNSSSDR_CANDIDATE_SIX_FOUND}")
else()
set(PYTHONINTERP_FOUND FALSE)
unset(PYTHON_EXECUTABLE)
unset(PYTHON_VERSION_MAJOR)
unset(PYTHON_VERSION_STRING)
set(PYTHON_MIN_VER_FOUND FALSE)
set(MAKO_FOUND FALSE)
set(SIX_FOUND FALSE)
endif()
########################################################################
# Set convenience variables
########################################################################
if(DEFINED PYTHON_VERSION_MAJOR AND "${PYTHON_VERSION_MAJOR}" STREQUAL "3")
set(PYTHON3 TRUE)
endif()
if(CMAKE_CROSSCOMPILING)
set(QA_PYTHON_EXECUTABLE "/usr/bin/python")
else()
set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
set(QA_PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}")
endif()
# make the path to the executable appear in the cmake gui
set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests")
# Make the path to the executable appear in the CMake GUI
set(PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}" CACHE FILEPATH
"python interpreter"
)
set(QA_PYTHON_EXECUTABLE "${QA_PYTHON_EXECUTABLE}" CACHE FILEPATH
"python interpreter for QA tests"
)
+13
View File
@@ -12,6 +12,19 @@ SPDX-FileCopyrightText: 2011-2026 Carles Fernandez-Prades <carles.fernandez@cttc
All notable changes to GNSS-SDR will be documented in this file.
## [Unreleased](https://github.com/gnss-sdr/gnss-sdr/tree/next)
### Improvements in Portability:
- Refactored Python interpreter detection and improved CMake portability and
robustness across dependency discovery, distro detection, and
cross-compilation handling.
See the definitions of concepts and metrics at
https://gnss-sdr.org/design-forces/
&nbsp;
## [GNSS-SDR v0.0.21](https://github.com/gnss-sdr/gnss-sdr/releases/tag/v0.0.21) - 2026-04-14
### Improvements in Availability:
@@ -530,7 +530,7 @@ install(
)
install(EXPORT VOLK_GNSSSDR-export FILE VolkGnsssdrTargets.cmake
NAMESPACE VolkGnsssdr:: DESTINATION ${CMAKE_MODULES_DIR}/volk_gnsssdr
NAMESPACE Volkgnsssdr:: DESTINATION ${CMAKE_MODULES_DIR}/volk_gnsssdr
)
########################################################################
@@ -6,13 +6,13 @@
set(MACOS_PACKAGES_PREFIX "")
# Detect if MacPorts is installed on this system; if so, return base path and version
execute_process(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${DETECT_MACPORTS} EQUAL 0)
find_program(MACPORTS_EXECUTABLE port)
if(MACPORTS_EXECUTABLE)
# "/opt/local/bin/port", so we get the parent directory
get_filename_component(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
get_filename_component(MACPORTS_PREFIX "${MACPORTS_EXECUTABLE}" DIRECTORY)
# "/opt/local/bin", so we get the parent directory
get_filename_component(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
execute_process(COMMAND port version RESULT_VARIABLE DETECT_MACPORTS_VERSION OUTPUT_VARIABLE MACPORTS_VERSION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
get_filename_component(MACPORTS_PREFIX "${MACPORTS_PREFIX}" DIRECTORY)
execute_process(COMMAND "${MACPORTS_EXECUTABLE}" version RESULT_VARIABLE DETECT_MACPORTS_VERSION OUTPUT_VARIABLE MACPORTS_VERSION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" MACPORTS_VERSION "${MACPORTS_VERSION}")
set(MACOS_PACKAGES_PREFIX ${MACPORTS_PREFIX})
endif()
@@ -24,3 +24,4 @@ if(${DETECT_HOMEBREW} EQUAL 0)
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" HOMEBREW_VERSION "${HOMEBREW_VERSION}")
set(MACOS_PACKAGES_PREFIX ${HOMEBREW_PREFIX})
endif()
unset(MACPORTS_EXECUTABLE)
@@ -1,62 +1,167 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# SPDX-FileCopyrightText: 2021-2025 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-FileCopyrightText: 2021-2026 C. Fernandez-Prades cfernandez(at)cttc.es
# SPDX-License-Identifier: BSD-3-Clause
########################################################################
# Find cpu_features
#
# Provides the following imported target:
# CpuFeature::cpu_features
########################################################################
set(FPHSA_NAME_MISMATCHED ON)
if(NOT VOLK_GNSSSDR_LIB_PATHS)
if(NOT DEFINED VOLK_GNSSSDR_LIB_PATHS)
include(VolkGnsssdrFindPaths)
endif()
find_library(CPUFEATURES_LIBRARIES
########################################################################
# Build candidate root list
########################################################################
set(_CPUFEATURES_ROOT_HINTS)
if(CPUFEATURES_DIR)
list(APPEND _CPUFEATURES_ROOT_HINTS "${CPUFEATURES_DIR}")
endif()
if(DEFINED ENV{CPUFEATURES_DIR} AND NOT "$ENV{CPUFEATURES_DIR}" STREQUAL "")
list(APPEND _CPUFEATURES_ROOT_HINTS "$ENV{CPUFEATURES_DIR}")
endif()
if(CMAKE_INSTALL_PREFIX)
list(APPEND _CPUFEATURES_ROOT_HINTS "${CMAKE_INSTALL_PREFIX}")
endif()
if(DEFINED _CPUFEATURES_ROOT_HINTS)
list(REMOVE_DUPLICATES _CPUFEATURES_ROOT_HINTS)
endif()
########################################################################
# Search paths for headers and libraries
########################################################################
set(_CPUFEATURES_INCLUDE_HINTS)
set(_CPUFEATURES_LIBRARY_HINTS)
foreach(_cpufeatures_prefix ${_CPUFEATURES_ROOT_HINTS})
list(APPEND _CPUFEATURES_INCLUDE_HINTS
"${_cpufeatures_prefix}"
"${_cpufeatures_prefix}/include"
)
list(APPEND _CPUFEATURES_LIBRARY_HINTS
"${_cpufeatures_prefix}/lib"
"${_cpufeatures_prefix}/lib64"
)
endforeach()
list(APPEND _CPUFEATURES_INCLUDE_HINTS ${VOLK_GNSSSDR_INCLUDE_PATHS})
list(APPEND _CPUFEATURES_LIBRARY_HINTS ${VOLK_GNSSSDR_LIB_PATHS})
list(REMOVE_DUPLICATES _CPUFEATURES_INCLUDE_HINTS)
list(REMOVE_DUPLICATES _CPUFEATURES_LIBRARY_HINTS)
########################################################################
# Find headers and library
########################################################################
find_library(CPUFEATURES_LIBRARY
NAMES cpu_features
PATHS $ENV{CPUFEATURES_DIR}/lib
${VOLK_GNSSSDR_LIB_PATHS}
PATHS ${_CPUFEATURES_LIBRARY_HINTS}
)
find_path(CPUFEATURES_INCLUDE_DIR cpu_features_macros.h
PATHS $ENV{CPUFEATURES_DIR}/include
$ENV{CPUFEATURES_DIR}
${VOLK_GNSSSDR_INCLUDE_PATHS}
find_path(CPUFEATURES_INCLUDE_DIR
NAMES cpu_features_macros.h
PATHS ${_CPUFEATURES_INCLUDE_HINTS}
PATH_SUFFIXES cpu_features
)
if(CPUFEATURES_INCLUDE_DIR AND CPUFEATURES_LIBRARIES)
if(NOT PACKAGE_VERSION)
set(PACKAGE_VERSION "")
endif()
set(OLD_PACKAGE_VERSION ${PACKAGE_VERSION})
unset(PACKAGE_VERSION)
list(GET CPUFEATURES_LIBRARIES 0 FIRST_DIR)
get_filename_component(CPUFEATURES_LIBRARIES_PATH ${FIRST_DIR} DIRECTORY)
if(EXISTS ${CPUFEATURES_LIBRARIES_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake)
include(${CPUFEATURES_LIBRARIES_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake)
endif()
if(PACKAGE_VERSION)
set(CPUFEATURES_VERSION ${PACKAGE_VERSION})
########################################################################
# Determine version
########################################################################
if(CPUFEATURES_INCLUDE_DIR AND CPUFEATURES_LIBRARY)
get_filename_component(_CPUFEATURES_LIBRARY_PATH
"${CPUFEATURES_LIBRARY}" DIRECTORY
)
if(EXISTS
"${_CPUFEATURES_LIBRARY_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake")
if(DEFINED PACKAGE_VERSION)
set(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED TRUE)
set(_CPUFEATURES_OLD_PACKAGE_VERSION "${PACKAGE_VERSION}")
else()
set(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED FALSE)
endif()
unset(PACKAGE_VERSION)
include(
"${_CPUFEATURES_LIBRARY_PATH}/cmake/CpuFeatures/CpuFeaturesConfigVersion.cmake"
)
if(DEFINED PACKAGE_VERSION AND NOT "${PACKAGE_VERSION}" STREQUAL "")
set(CPUFEATURES_VERSION "${PACKAGE_VERSION}")
else()
set(CPUFEATURES_VERSION "Unknown")
endif()
unset(PACKAGE_VERSION)
if(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED)
set(PACKAGE_VERSION "${_CPUFEATURES_OLD_PACKAGE_VERSION}")
else()
unset(PACKAGE_VERSION)
endif()
unset(_CPUFEATURES_PACKAGE_VERSION_WAS_DEFINED)
unset(_CPUFEATURES_OLD_PACKAGE_VERSION)
else()
set(CPUFEATURES_VERSION "Unknown")
endif()
set(PACKAGE_VERSION ${OLD_PACKAGE_VERSION})
endif()
########################################################################
# Standard result handling
########################################################################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CPUFEATURES
DEFAULT_MSG
CPUFEATURES_LIBRARIES
CPUFEATURES_LIBRARY
CPUFEATURES_INCLUDE_DIR
)
########################################################################
# Compatibility variables
########################################################################
set(CPUFEATURES_LIBRARIES "${CPUFEATURES_LIBRARY}")
mark_as_advanced(
CPUFEATURES_LIBRARY
CPUFEATURES_LIBRARIES
CPUFEATURES_INCLUDE_DIR
CPUFEATURES_VERSION
)
########################################################################
# Define imported target
########################################################################
if(CPUFEATURES_FOUND AND NOT TARGET CpuFeature::cpu_features)
add_library(CpuFeature::cpu_features STATIC IMPORTED)
add_library(CpuFeature::cpu_features UNKNOWN IMPORTED)
set_target_properties(CpuFeature::cpu_features PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${CPUFEATURES_LIBRARIES}"
IMPORTED_LOCATION "${CPUFEATURES_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${CPUFEATURES_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "${CPUFEATURES_LIBRARIES}"
)
endif()
mark_as_advanced(CPUFEATURES_LIBRARIES)
########################################################################
# Cleanup internal variables
########################################################################
unset(_CPUFEATURES_ROOT_HINTS)
unset(_CPUFEATURES_INCLUDE_HINTS)
unset(_CPUFEATURES_LIBRARY_HINTS)
unset(_CPUFEATURES_LIBRARY_PATH)
unset(_cpufeatures_prefix)
@@ -66,11 +66,6 @@ Imported Targets
Variables
*********
.. variable:: CXX_FILESYSTEM_IS_EXPERIMENTAL
Set to ``TRUE`` when the :find-component:`fs.Experimental` version of C++
filesystem library was found, otherwise ``FALSE``.
.. variable:: CXX_FILESYSTEM_HAVE_FS
Set to ``TRUE`` when a filesystem header was found.
@@ -119,21 +114,30 @@ if(FILESYSTEM_FIND_QUIETLY)
set(CMAKE_REQUIRED_QUIET ${FILESYSTEM_FIND_QUIETLY})
endif()
if(DEFINED CMAKE_CXX_STANDARD)
set(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED TRUE)
set(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD "${CMAKE_CXX_STANDARD}")
else()
set(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED FALSE)
endif()
set(CMAKE_CXX_STANDARD 17)
set(_filesystem_required_flag "")
if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "8.0.0"))
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.99")
set(UNDEFINED_BEHAVIOR_WITHOUT_LINKING TRUE)
set(_filesystem_required_flag "-std=c++17")
elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.99"))
set(_filesystem_required_flag "-std=c++17")
elseif((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "11"))
set(_filesystem_required_flag "-std=c++17")
elseif(MSVC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "18"))
set(_filesystem_required_flag "/std:c++17")
endif()
if(_filesystem_required_flag)
if(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${_filesystem_required_flag}")
else()
set(CMAKE_REQUIRED_FLAGS "${_filesystem_required_flag}")
endif()
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
endif()
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.99"))
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
endif()
if((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "11"))
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
endif()
if(MSVC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "18"))
set(CMAKE_REQUIRED_FLAGS "/std:c++17")
endif()
# Normalize and check the component list we were given
@@ -215,7 +219,6 @@ if(CXX_FILESYSTEM_HAVE_FS)
if(NOT CXX_FILESYSTEM_NO_LINK_NEEDED)
set(prev_libraries ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_FLAGS "-std=c++17")
# Add the libstdc++ flag
set(CMAKE_REQUIRED_LIBRARIES ${prev_libraries} -lstdc++fs)
check_cxx_source_compiles("${code}" CXX_FILESYSTEM_STDCPPFS_NEEDED)
@@ -247,8 +250,10 @@ if(CXX_FILESYSTEM_HAVE_FS)
endif()
endif()
if(NOT ${_found})
set(CMAKE_CXX_STANDARD 11)
if(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED)
set(CMAKE_CXX_STANDARD "${_FILESYSTEM_OLD_CMAKE_CXX_STANDARD}")
else()
unset(CMAKE_CXX_STANDARD)
endif()
cmake_pop_check_state()
@@ -261,3 +266,6 @@ find_package_handle_standard_args(FILESYSTEM DEFAULT_MSG FILESYSTEM_FOUND)
if(FILESYSTEM_FIND_REQUIRED AND NOT FILESYSTEM_FOUND)
message(FATAL_ERROR "Cannot compile a simple program using std::filesystem")
endif()
unset(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD_DEFINED)
unset(_FILESYSTEM_OLD_CMAKE_CXX_STANDARD)
@@ -1,96 +1,199 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# Copyright (C) 2015-2025 (see AUTHORS file for a list of contributors)
# Copyright (C) 2015-2026 (see AUTHORS file for a list of contributors)
# SPDX-License-Identifier: BSD-3-Clause
########################################################################
# Find ORC (Optimized Inner Loops Runtime Compiler)
########################################################################
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH TRUE)
set(FPHSA_NAME_MISMATCHED ON)
include(FindPkgConfig)
if(NOT VOLK_GNSSSDR_LIB_PATHS)
if(NOT PKG_CONFIG_FOUND)
include(FindPkgConfig)
endif()
if(NOT DEFINED VOLK_GNSSSDR_LIB_PATHS)
include(VolkGnsssdrFindPaths)
endif()
pkg_check_modules(PC_ORC "orc-0.4 > 0.4.22")
pkg_check_modules(PC_ORC QUIET "orc-0.4 > 0.4.22")
if(NOT ORC_ROOT)
set(ORC_ROOT_USER_PROVIDED /usr/local)
else()
set(ORC_ROOT_USER_PROVIDED ${ORC_ROOT})
########################################################################
# Build candidate root list
########################################################################
set(_ORC_ROOT_HINTS)
if(ORC_ROOT)
list(APPEND _ORC_ROOT_HINTS "${ORC_ROOT}")
endif()
if(DEFINED ENV{ORC_ROOT})
set(ORC_ROOT_USER_PROVIDED
${ORC_ROOT_USER_PROVIDED}
$ENV{ORC_ROOT}
)
if(DEFINED ENV{ORC_ROOT} AND NOT "$ENV{ORC_ROOT}" STREQUAL "")
list(APPEND _ORC_ROOT_HINTS "$ENV{ORC_ROOT}")
endif()
set(ORC_ROOT_USER_PROVIDED
${ORC_ROOT_USER_PROVIDED}
${CMAKE_INSTALL_PREFIX}
)
if(CMAKE_INSTALL_PREFIX)
list(APPEND _ORC_ROOT_HINTS "${CMAKE_INSTALL_PREFIX}")
endif()
if(DEFINED _ORC_ROOT_HINTS)
list(REMOVE_DUPLICATES _ORC_ROOT_HINTS)
endif()
########################################################################
# Search paths for binaries, headers, and libraries
########################################################################
set(_ORC_BIN_HINTS)
set(_ORC_INCLUDE_HINTS)
set(_ORC_LIBRARY_HINTS)
if(PC_ORC_PREFIX)
list(APPEND _ORC_BIN_HINTS "${PC_ORC_PREFIX}/bin")
endif()
if(PC_ORC_TOOLSDIR)
set(ORC_ROOT_USER_PROVIDED
${ORC_ROOT_USER_PROVIDED}
${PC_ORC_TOOLSDIR}
)
list(APPEND _ORC_BIN_HINTS "${PC_ORC_TOOLSDIR}")
endif()
find_program(ORCC_EXECUTABLE orcc
HINTS ${ORC_ROOT_USER_PROVIDED}/bin
PATHS /usr/bin
/usr/local/bin
${CMAKE_SYSTEM_PREFIX_PATH}/bin
if(PC_ORC_INCLUDEDIR)
list(APPEND _ORC_INCLUDE_HINTS "${PC_ORC_INCLUDEDIR}")
endif()
if(PC_ORC_LIBDIR)
list(APPEND _ORC_LIBRARY_HINTS "${PC_ORC_LIBDIR}")
endif()
if(PC_ORC_LIBRARY_DIRS)
list(APPEND _ORC_LIBRARY_HINTS ${PC_ORC_LIBRARY_DIRS})
endif()
foreach(_orc_prefix ${_ORC_ROOT_HINTS})
list(APPEND _ORC_BIN_HINTS "${_orc_prefix}/bin")
list(APPEND _ORC_INCLUDE_HINTS "${_orc_prefix}/include")
list(APPEND _ORC_LIBRARY_HINTS
"${_orc_prefix}/lib"
"${_orc_prefix}/lib64"
)
endforeach()
list(APPEND _ORC_BIN_HINTS
/usr/bin
/usr/local/bin
)
foreach(_orc_system_prefix ${CMAKE_SYSTEM_PREFIX_PATH})
list(APPEND _ORC_BIN_HINTS "${_orc_system_prefix}/bin")
endforeach()
list(APPEND _ORC_INCLUDE_HINTS ${VOLK_GNSSSDR_INCLUDE_PATHS})
list(APPEND _ORC_LIBRARY_HINTS ${VOLK_GNSSSDR_LIB_PATHS})
list(REMOVE_DUPLICATES _ORC_BIN_HINTS)
list(REMOVE_DUPLICATES _ORC_INCLUDE_HINTS)
list(REMOVE_DUPLICATES _ORC_LIBRARY_HINTS)
########################################################################
# Find executable, headers, and libraries
########################################################################
find_program(ORCC_EXECUTABLE
NAMES orcc
PATHS ${_ORC_BIN_HINTS}
)
find_path(ORC_INCLUDE_DIR
NAMES orc/orc.h
HINTS ${PC_ORC_INCLUDEDIR}
PATHS ${ORC_ROOT_USER_PROVIDED}/include
${VOLK_GNSSSDR_INCLUDE_PATHS}
PATHS ${_ORC_INCLUDE_HINTS}
PATH_SUFFIXES orc-0.4
)
find_path(ORC_LIBRARY_DIR
NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}orc-0.4${CMAKE_SHARED_LIBRARY_SUFFIX}
HINTS ${PC_ORC_LIBDIR}
PATHS ${ORC_ROOT_USER_PROVIDED}/lib
${ORC_ROOT_USER_PROVIDED}/lib64
${VOLK_GNSSSDR_LIB_PATHS}
find_library(ORC_LIBRARY
NAMES orc-0.4
HINTS ${PC_ORC_LIBDIR} ${PC_ORC_LIBRARY_DIRS}
PATHS ${_ORC_LIBRARY_HINTS}
)
find_library(ORC_LIB orc-0.4
HINTS ${PC_ORC_LIBRARY_DIRS}
PATHS ${ORC_ROOT_USER_PROVIDED}/lib
${ORC_ROOT_USER_PROVIDED}/lib64
${VOLK_GNSSSDR_LIB_PATHS}
find_library(ORC_LIBRARY_STATIC
NAMES
${CMAKE_STATIC_LIBRARY_PREFIX}orc-0.4${CMAKE_STATIC_LIBRARY_SUFFIX}
HINTS ${PC_ORC_LIBDIR} ${PC_ORC_LIBRARY_DIRS}
PATHS ${_ORC_LIBRARY_HINTS}
)
find_library(ORC_LIBRARY_STATIC ${CMAKE_STATIC_LIBRARY_PREFIX}orc-0.4${CMAKE_STATIC_LIBRARY_SUFFIX}
HINTS ${PC_ORC_LIBRARY_DIRS}
PATHS ${ORC_ROOT}/lib
${ORC_ROOT}/lib64
${ORC_ROOT_USER_PROVIDED}/lib
${ORC_ROOT_USER_PROVIDED}/lib64
${VOLK_GNSSSDR_LIB_PATHS}
)
########################################################################
# Derive library directory and version
########################################################################
if(ORC_LIBRARY)
get_filename_component(ORC_LIBRARY_DIR "${ORC_LIBRARY}" DIRECTORY)
endif()
if(PC_ORC_VERSION)
set(ORC_VERSION ${PC_ORC_VERSION})
set(ORC_VERSION "${PC_ORC_VERSION}")
endif()
list(APPEND ORC_LIBRARY ${ORC_LIB})
set(ORC_INCLUDE_DIRS ${ORC_INCLUDE_DIR})
set(ORC_LIBRARIES ${ORC_LIBRARY})
set(ORC_LIBRARY_DIRS ${ORC_LIBRARY_DIR})
set(ORC_LIBRARIES_STATIC ${ORC_LIBRARY_STATIC})
########################################################################
# Compatibility variables
########################################################################
set(ORC_INCLUDE_DIRS "${ORC_INCLUDE_DIR}")
set(ORC_LIBRARIES "${ORC_LIBRARY}")
set(ORC_LIBRARY_DIRS "${ORC_LIBRARY_DIR}")
set(ORC_LIBRARIES_STATIC "${ORC_LIBRARY_STATIC}")
########################################################################
# Standard result handling
########################################################################
include(FindPackageHandleStandardArgs)
if(ENABLE_STATIC_LIBS)
find_package_handle_standard_args(ORC "orc files" ORC_LIBRARY ORC_INCLUDE_DIR ORCC_EXECUTABLE ORC_LIBRARY_STATIC)
find_package_handle_standard_args(ORC
"orc files"
ORC_LIBRARY
ORC_INCLUDE_DIR
ORCC_EXECUTABLE
ORC_LIBRARY_STATIC
)
else()
find_package_handle_standard_args(ORC "orc files" ORC_LIBRARY ORC_INCLUDE_DIR ORCC_EXECUTABLE)
find_package_handle_standard_args(ORC
"orc files"
ORC_LIBRARY
ORC_INCLUDE_DIR
ORCC_EXECUTABLE
)
endif()
mark_as_advanced(ORC_INCLUDE_DIR ORC_LIBRARY ORCC_EXECUTABLE ORC_LIBRARY_STATIC)
if(ORC_FOUND AND NOT TARGET ORC::orc)
add_library(ORC::orc UNKNOWN IMPORTED)
set_target_properties(ORC::orc PROPERTIES
IMPORTED_LOCATION "${ORC_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${ORC_INCLUDE_DIR}"
)
endif()
mark_as_advanced(
ORCC_EXECUTABLE
ORC_INCLUDE_DIR
ORC_INCLUDE_DIRS
ORC_LIBRARY
ORC_LIBRARIES
ORC_LIBRARY_DIR
ORC_LIBRARY_DIRS
ORC_LIBRARY_STATIC
ORC_LIBRARIES_STATIC
ORC_VERSION
)
########################################################################
# Cleanup internal variables
########################################################################
unset(_ORC_ROOT_HINTS)
unset(_ORC_BIN_HINTS)
unset(_ORC_INCLUDE_HINTS)
unset(_ORC_LIBRARY_HINTS)
unset(_orc_prefix)
unset(_orc_system_prefix)
@@ -6,7 +6,7 @@
get_filename_component(VOLK_GNSSSDR_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
if(NOT TARGET VolkGnsssdr::volkgnsssdr)
if(NOT TARGET Volkgnsssdr::volkgnsssdr)
include("${VOLK_GNSSSDR_CMAKE_DIR}/VolkGnsssdrTargets.cmake")
endif()
@@ -19,19 +19,14 @@ else()
set(VOLKGNSSSDR_FOUND TRUE)
endif()
# cache whether a compatible VolkGnsssdr was found for
# use anywhere in the calling project
set(VOLKGNSSSDR_FOUND ${VOLKGNSSSDR_FOUND} CACHE BOOL "Whether a compatible Volk GNSS-SDR was found" FORCE)
if(VOLKGNSSSDR_FOUND)
# use the new target library, regardless of whether new or old style
# we still need to set a variable with the library name so that there
# is a variable to reference in the using-project's cmake scripts!
set(VOLK_GNSSSDR_LIBRARIES Volkgnsssdr::volkgnsssdr CACHE STRING "Volk GNSS-SDR Library" FORCE)
set(VOLK_GNSSSDR_LIBRARIES Volkgnsssdr::volkgnsssdr)
# INTERFACE_INCLUDE_DIRECTORIES should always be set
get_target_property(VOLK_GNSSSDR_INCLUDE_DIRS Volkgnsssdr::volkgnsssdr INTERFACE_INCLUDE_DIRECTORIES)
set(VOLK_GNSSSDR_INCLUDE_DIRS ${VOLK_GNSSSDR_INCLUDE_DIRS} CACHE STRING "Volk GNSS-SDR Include Directories" FORCE)
# for backward compatibility with old-CMake non-target project finding
include(FindPackageHandleStandardArgs)
@@ -1,7 +1,7 @@
# GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
# This file is part of GNSS-SDR.
#
# Copyright (C) 2015-2020 (see AUTHORS file for a list of contributors)
# Copyright (C) 2015-2026 (see AUTHORS file for a list of contributors)
# SPDX-License-Identifier: BSD-3-Clause
if(DEFINED __INCLUDED_VOLK_PYTHON_CMAKE)
@@ -10,7 +10,7 @@ endif()
set(__INCLUDED_VOLK_PYTHON_CMAKE TRUE)
########################################################################
# Check for the existence of a python module:
# Check for the existence of a Python module:
# - desc a string description of the check
# - mod the name of the module to import
# - cmd an additional command to run
@@ -19,19 +19,27 @@ set(__INCLUDED_VOLK_PYTHON_CMAKE TRUE)
macro(VOLK_PYTHON_CHECK_MODULE desc mod cmd have)
message(STATUS "Python checking for ${desc}")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c "
#########################################
try: import ${mod}
except:
try: ${mod}
except: exit(-1)
try: assert ${cmd}
except: exit(-1)
#########################################"
OUTPUT_QUIET ERROR_QUIET
RESULT_VARIABLE ${have}
COMMAND ${PYTHON_EXECUTABLE} -c
"import sys
try:
import ${mod}
except Exception:
try:
${mod}
except Exception:
sys.exit(1)
try:
assert ${cmd}
except Exception:
sys.exit(1)
sys.exit(0)"
OUTPUT_QUIET
ERROR_QUIET
RESULT_VARIABLE _volk_python_check_module_result
)
if(${have} EQUAL 0)
if(_volk_python_check_module_result EQUAL 0)
message(STATUS "Python checking for ${desc} - found")
set(${have} TRUE)
else()
@@ -42,302 +50,418 @@ endmacro()
########################################################################
# Setup the python interpreter:
# This allows the user to specify a specific interpreter,
# or finds the interpreter via the built-in cmake module.
# Check that Python itself satisfies a minimum version
########################################################################
macro(VOLK_PYTHON_CHECK_MIN_VERSION minver have)
message(STATUS "Python checking for python >= ${minver}")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
"import sys
def norm(v):
out = []
for p in str(v).split('.'):
n = ''.join([c for c in p if '0' <= c <= '9'])
out.append(int(n or '0'))
while len(out) < 3:
out.append(0)
return tuple(out)
sys.exit(0 if norm(sys.version.split()[0]) >= norm('${minver}') else 1)"
OUTPUT_QUIET
ERROR_QUIET
RESULT_VARIABLE _volk_python_minver_result
)
if(_volk_python_minver_result EQUAL 0)
message(STATUS "Python checking for python >= ${minver} - found")
set(${have} TRUE)
else()
message(STATUS "Python checking for python >= ${minver} - not found")
set(${have} FALSE)
endif()
endmacro()
########################################################################
# Get version information for the selected interpreter
########################################################################
macro(VOLK_PYTHON_GET_VERSION)
unset(PYTHON_VERSION_MAJOR)
unset(PYTHON_VERSION_STRING)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
"import sys; sys.stdout.write(sys.version.split()[0])"
OUTPUT_VARIABLE PYTHON_VERSION_STRING
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${PYTHON_VERSION_STRING}" STREQUAL "")
string(SUBSTRING "${PYTHON_VERSION_STRING}" 0 1
PYTHON_VERSION_MAJOR)
endif()
endmacro()
########################################################################
# Evaluate whether a candidate interpreter is suitable
#
# Conditions:
# - Python version >= VOLK_PYTHON_MIN_VERSION
# - mako >= VOLK_MAKO_MIN_VERSION
# - six present if Python 2
########################################################################
function(VOLK_PYTHON_EVALUATE_CANDIDATE candidate have)
set(${have} FALSE PARENT_SCOPE)
if("${candidate}" STREQUAL "")
return()
endif()
if(NOT EXISTS "${candidate}")
return()
endif()
set(PYTHON_EXECUTABLE "${candidate}")
volk_python_get_version()
if("${PYTHON_VERSION_STRING}" STREQUAL "")
return()
endif()
volk_python_check_min_version(${VOLK_PYTHON_MIN_VERSION}
_VOLK_PYTHON_MIN_VER_FOUND)
if(NOT _VOLK_PYTHON_MIN_VER_FOUND)
return()
endif()
volk_python_check_module(
"mako >= ${VOLK_MAKO_MIN_VERSION}"
mako
"tuple(int(x) for x in mako.__version__.split('.')) >= tuple(int(x) for x in '${VOLK_MAKO_MIN_VERSION}'.split('.'))"
_VOLK_MAKO_FOUND
)
if(NOT _VOLK_MAKO_FOUND)
return()
endif()
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
volk_python_check_module(
"six - python 2 and 3 compatibility library"
six
"True"
_VOLK_SIX_FOUND
)
if(NOT _VOLK_SIX_FOUND)
return()
endif()
else()
set(_VOLK_SIX_FOUND TRUE)
endif()
set(_VOLK_CANDIDATE_VERSION_STRING "${PYTHON_VERSION_STRING}"
PARENT_SCOPE)
set(_VOLK_CANDIDATE_VERSION_MAJOR "${PYTHON_VERSION_MAJOR}"
PARENT_SCOPE)
set(_VOLK_CANDIDATE_PYTHON_MIN_VER_FOUND
"${_VOLK_PYTHON_MIN_VER_FOUND}" PARENT_SCOPE)
set(_VOLK_CANDIDATE_MAKO_FOUND "${_VOLK_MAKO_FOUND}"
PARENT_SCOPE)
set(_VOLK_CANDIDATE_SIX_FOUND "${_VOLK_SIX_FOUND}"
PARENT_SCOPE)
set(${have} TRUE PARENT_SCOPE)
endfunction()
########################################################################
# Setup the Python interpreter
########################################################################
set(VOLK_PYTHON_MIN_VERSION "2.7")
set(VOLK_PYTHON3_MIN_VERSION "3.4")
set(VOLK_MAKO_MIN_VERSION "0.4.2")
if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING)
if(PYTHON_EXECUTABLE)
message(STATUS "User set python executable ${PYTHON_EXECUTABLE}")
if(CMAKE_VERSION VERSION_LESS "3.24") # For cross-compiling
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
set(PYTHONINTERP_FOUND FALSE)
set(PYTHON_MIN_VER_FOUND FALSE)
set(MAKO_FOUND FALSE)
set(SIX_FOUND FALSE)
unset(PYTHON_VERSION_MAJOR)
unset(PYTHON_VERSION_STRING)
unset(PYTHON3)
set(_VOLK_USER_PYTHON_EXECUTABLE "")
set(_VOLK_PYTHON_CANDIDATES "")
set(_VOLK_SELECTED_PYTHON "")
if(DEFINED PYTHON_EXECUTABLE AND NOT "${PYTHON_EXECUTABLE}" STREQUAL "")
set(_VOLK_USER_PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}")
endif()
########################################################################
# Build candidate list
########################################################################
# 1) User-provided interpreter first
if(NOT "${_VOLK_USER_PYTHON_EXECUTABLE}" STREQUAL "")
message(STATUS "User set python executable ${_VOLK_USER_PYTHON_EXECUTABLE}")
list(APPEND _VOLK_PYTHON_CANDIDATES "${_VOLK_USER_PYTHON_EXECUTABLE}")
endif()
# 2) Modern CMake: prefer Python3, then Python2
if(NOT CMAKE_VERSION VERSION_LESS "3.12" AND NOT CMAKE_CROSSCOMPILING)
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(_volk_previous_cmake_find_framework ${CMAKE_FIND_FRAMEWORK})
set(CMAKE_FIND_FRAMEWORK LAST)
endif()
find_package(Python3 COMPONENTS Interpreter)
if(Python3_FOUND)
list(APPEND _VOLK_PYTHON_CANDIDATES "${Python3_EXECUTABLE}")
else()
message(STATUS "PYTHON_EXECUTABLE not set - trying by default python3")
message(STATUS "Use -DPYTHON_EXECUTABLE=/path/to/python to build for python 2.7")
if(CMAKE_VERSION VERSION_LESS "3.24") # For cross-compiling
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11)
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION} REQUIRED)
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
if(NOT PYTHONINTERP_FOUND)
message(STATUS "python3 not found - trying with python2.7")
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION} REQUIRED)
else()
find_package(Python2 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python2_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python2_VERSION_MAJOR}")
set(PYTHON_EXECUTABLE "${Python2_EXECUTABLE}")
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
find_package(Python2 COMPONENTS Interpreter)
if(Python2_FOUND)
list(APPEND _VOLK_PYTHON_CANDIDATES "${Python2_EXECUTABLE}")
endif()
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(CMAKE_FIND_FRAMEWORK ${_volk_previous_cmake_find_framework})
endif()
# 3) Old CMake or cross-compiling: use PythonInterp as a candidate source,
# but still validate the interpreter before accepting it
else()
if(PYTHON_EXECUTABLE)
message(STATUS "User set python executable ${PYTHON_EXECUTABLE}")
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
set(Python_ADDITIONAL_VERSIONS
3.11 3.10 3.9 3.8 3.7 3.6 3.5 3.4 2.7
)
if(CMAKE_VERSION VERSION_LESS "2.8.12")
find_package(PythonInterp)
else()
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(_previous ${CMAKE_FIND_FRAMEWORK})
set(CMAKE_FIND_FRAMEWORK LAST)
endif()
find_package(Python3 COMPONENTS Interpreter)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_FIND_FRAMEWORK ${_previous})
endif()
if(Python3_FOUND)
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
set(PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR})
set(PYTHON_VERSION_STRING ${Python3_VERSION})
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
endif()
if(NOT Python3_FOUND OR NOT MAKO_FOUND)
find_package(Python2 COMPONENTS Interpreter)
if(Python2_FOUND)
set(PYTHON_EXECUTABLE ${Python2_EXECUTABLE})
set(PYTHON_VERSION_MAJOR ${Python2_VERSION_MAJOR})
set(PYTHON_VERSION_STRING ${Python2_VERSION})
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
if(NOT MAKO_FOUND OR NOT SIX_FOUND)
unset(PYTHON_EXECUTABLE)
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(NOT MAKO_FOUND)
unset(PYTHON_EXECUTABLE)
unset(PYTHON_VERSION_STRING)
find_program(PYTHON_EXECUTABLE NAMES python3 python)
if(PYTHON_EXECUTABLE)
set(PYTHONINTERP_FOUND TRUE)
execute_process(COMMAND ${PYTHON_EXECUTABLE} --version OUTPUT_VARIABLE PYTHON_VERSION_STRING_AUX)
string(FIND "${PYTHON_VERSION_STRING_AUX}" " " blank_char_index)
if(blank_char_index GREATER -1)
math(EXPR start_index "${blank_char_index} + 1")
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} -1 PYTHON_VERSION_STRING)
string(STRIP ${PYTHON_VERSION_STRING} PYTHON_VERSION_STRING)
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} 1 PYTHON_VERSION_MAJOR)
message(STATUS "Found Python: ${PYTHON_EXECUTABLE} (found version: ${PYTHON_VERSION_STRING})")
else()
string(FIND ${PYTHON_EXECUTABLE} "python3" is_python3)
if(is_python3 GREATER -1)
set(PYTHON_VERSION_MAJOR "3")
set(PYTHON_VERSION_STRING "3.10") # ?
else()
set(PYTHON_VERSION_MAJOR "2")
set(PYTHON_VERSION_STRING "2.7")
endif()
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(MAKO_FOUND AND PYTHON_VERSION_STRING VERSION_LESS "3.0")
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
endif()
endif()
endif()
endif()
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
endif()
if(PYTHONINTERP_FOUND AND NOT "${PYTHON_EXECUTABLE}" STREQUAL "")
list(APPEND _VOLK_PYTHON_CANDIDATES "${PYTHON_EXECUTABLE}")
endif()
endif()
if("${PYTHON_VERSION_MAJOR}" VERSION_EQUAL 3)
# 4) Generic last-resort program-name fallbacks
find_program(_VOLK_PYTHON3 NAMES python3)
find_program(_VOLK_PYTHON2 NAMES python2.7 python2)
find_program(_VOLK_PYTHON NAMES python)
foreach(_volk_python_prog
${_VOLK_PYTHON3}
${_VOLK_PYTHON2}
${_VOLK_PYTHON}
)
if(NOT "${_volk_python_prog}" STREQUAL "")
list(APPEND _VOLK_PYTHON_CANDIDATES "${_volk_python_prog}")
endif()
endforeach()
list(REMOVE_DUPLICATES _VOLK_PYTHON_CANDIDATES)
########################################################################
# Evaluate candidates and accept the first fully suitable interpreter
########################################################################
foreach(_VOLK_PYTHON_CANDIDATE IN LISTS _VOLK_PYTHON_CANDIDATES)
message(STATUS "Trying Python candidate: ${_VOLK_PYTHON_CANDIDATE}")
volk_python_evaluate_candidate("${_VOLK_PYTHON_CANDIDATE}"
_VOLK_PYTHON_CANDIDATE_OK)
if(_VOLK_PYTHON_CANDIDATE_OK)
set(_VOLK_SELECTED_PYTHON "${_VOLK_PYTHON_CANDIDATE}")
break()
endif()
endforeach()
if(NOT "${_VOLK_SELECTED_PYTHON}" STREQUAL "")
set(PYTHON_EXECUTABLE "${_VOLK_SELECTED_PYTHON}")
set(PYTHONINTERP_FOUND TRUE)
set(PYTHON_VERSION_STRING "${_VOLK_CANDIDATE_VERSION_STRING}")
set(PYTHON_VERSION_MAJOR "${_VOLK_CANDIDATE_VERSION_MAJOR}")
set(PYTHON_MIN_VER_FOUND "${_VOLK_CANDIDATE_PYTHON_MIN_VER_FOUND}")
set(MAKO_FOUND "${_VOLK_CANDIDATE_MAKO_FOUND}")
set(SIX_FOUND "${_VOLK_CANDIDATE_SIX_FOUND}")
else()
set(PYTHONINTERP_FOUND FALSE)
unset(PYTHON_EXECUTABLE)
unset(PYTHON_VERSION_MAJOR)
unset(PYTHON_VERSION_STRING)
set(PYTHON_MIN_VER_FOUND FALSE)
set(MAKO_FOUND FALSE)
set(SIX_FOUND FALSE)
endif()
if("${PYTHON_VERSION_MAJOR}" STREQUAL "3")
set(PYTHON3 TRUE)
endif()
########################################################################
# Sets the python installation directory VOLK_PYTHON_DIR
# Sets the Python installation directory VOLK_PYTHON_DIR
########################################################################
if(NOT DEFINED VOLK_PYTHON_DIR)
if(PYTHON_VERSION_STRING VERSION_GREATER "3.9.99")
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
import os
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
"import os
import sys
if os.name == 'posix':
print(os.path.join('lib', 'python' + sys.version[:4], 'dist-packages'))
if os.name == 'nt':
print(os.path.join('Lib', 'site-packages'))
" OUTPUT_VARIABLE VOLK_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)
else()
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
import os
import sys
if os.name == 'posix':
print(os.path.join('lib', 'python' + sys.version[:3], 'dist-packages'))
if os.name == 'nt':
print(os.path.join('Lib', 'site-packages'))
" OUTPUT_VARIABLE VOLK_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
print(os.path.join(
'lib',
'python{0}.{1}'.format(sys.version_info[0], sys.version_info[1]),
'dist-packages'))
elif os.name == 'nt':
print(os.path.join('Lib', 'site-packages'))"
OUTPUT_VARIABLE VOLK_PYTHON_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
file(TO_CMAKE_PATH ${VOLK_PYTHON_DIR} VOLK_PYTHON_DIR)
file(TO_CMAKE_PATH "${VOLK_PYTHON_DIR}" VOLK_PYTHON_DIR)
########################################################################
# Create an always-built target with a unique name
# Usage: VOLK_UNIQUE_TARGET(<description> <dependencies list>)
# Usage: volk_unique_target(<description> <dependencies list>)
########################################################################
function(VOLK_UNIQUE_TARGET desc)
file(RELATIVE_PATH reldir ${PROJECT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
file(RELATIVE_PATH reldir "${PROJECT_BINARY_DIR}"
"${CMAKE_CURRENT_BINARY_DIR}")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
"import re, hashlib
unique = hashlib.sha256(b'${reldir}${ARGN}').hexdigest()[:5]
print(re.sub(r'\\W', '_', '${desc} ${reldir} ' + unique))"
OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
OUTPUT_VARIABLE _target
OUTPUT_STRIP_TRAILING_WHITESPACE
)
add_custom_target(${_target} ALL DEPENDS ${ARGN})
endfunction()
########################################################################
# Install python sources (also builds and installs byte-compiled python)
# Install Python sources (also builds and installs byte-compiled Python)
########################################################################
function(VOLK_PYTHON_INSTALL)
include(CMakeParseArgumentsCopy)
cmake_parse_arguments(VOLK_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
cmake_parse_arguments(
VOLK_PYTHON_INSTALL
""
"DESTINATION;COMPONENT"
"FILES;PROGRAMS"
${ARGN}
)
####################################################################
if(VOLK_PYTHON_INSTALL_FILES)
####################################################################
install(${ARGN}) #installs regular python files
install(${ARGN})
#create a list of all generated files
unset(pysrcfiles)
unset(pycfiles)
unset(pyofiles)
foreach(pyfile ${VOLK_PYTHON_INSTALL_FILES})
get_filename_component(pyfile ${pyfile} ABSOLUTE)
list(APPEND pysrcfiles ${pyfile})
#determine if this file is in the source or binary directory
file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
foreach(pyfile ${VOLK_PYTHON_INSTALL_FILES})
get_filename_component(pyfile "${pyfile}" ABSOLUTE)
list(APPEND pysrcfiles "${pyfile}")
file(RELATIVE_PATH source_rel_path
"${CMAKE_CURRENT_SOURCE_DIR}" "${pyfile}")
string(LENGTH "${source_rel_path}" source_rel_path_len)
file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
file(RELATIVE_PATH binary_rel_path
"${CMAKE_CURRENT_BINARY_DIR}" "${pyfile}")
string(LENGTH "${binary_rel_path}" binary_rel_path_len)
#and set the generated path appropriately
if(${source_rel_path_len} GREATER ${binary_rel_path_len})
set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
set(pygenfile "${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path}")
else()
set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
set(pygenfile "${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path}")
endif()
list(APPEND pycfiles ${pygenfile}c)
list(APPEND pyofiles ${pygenfile}o)
#ensure generation path exists
get_filename_component(pygen_path ${pygenfile} PATH)
file(MAKE_DIRECTORY ${pygen_path})
list(APPEND pycfiles "${pygenfile}c")
list(APPEND pyofiles "${pygenfile}o")
get_filename_component(pygen_path "${pygenfile}" PATH)
file(MAKE_DIRECTORY "${pygen_path}")
endforeach()
#the command to generate the pyc files
add_custom_command(
DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
DEPENDS ${pysrcfiles}
OUTPUT ${pycfiles}
COMMAND ${PYTHON_EXECUTABLE}
${PROJECT_BINARY_DIR}/python_compile_helper.py
${pysrcfiles} ${pycfiles}
)
#the command to generate the pyo files
add_custom_command(
DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
COMMAND ${PYTHON_EXECUTABLE} -O ${PROJECT_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
DEPENDS ${pysrcfiles}
OUTPUT ${pyofiles}
COMMAND ${PYTHON_EXECUTABLE} -O
${PROJECT_BINARY_DIR}/python_compile_helper.py
${pysrcfiles} ${pyofiles}
)
#create install rule and add generated files to target list
set(python_install_gen_targets ${pycfiles} ${pyofiles})
install(FILES ${python_install_gen_targets}
DESTINATION ${VOLK_PYTHON_INSTALL_DESTINATION}
COMPONENT ${VOLK_PYTHON_INSTALL_COMPONENT}
)
####################################################################
elseif(VOLK_PYTHON_INSTALL_PROGRAMS)
####################################################################
file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
file(TO_NATIVE_PATH "${PYTHON_EXECUTABLE}" pyexe_native)
if(CMAKE_CROSSCOMPILING)
set(pyexe_native "/usr/bin/env python")
endif()
foreach(pyfile ${VOLK_PYTHON_INSTALL_PROGRAMS})
get_filename_component(pyfile_name ${pyfile} NAME)
get_filename_component(pyfile ${pyfile} ABSOLUTE)
string(REPLACE "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" pyexefile "${pyfile}.exe")
list(APPEND python_install_gen_targets ${pyexefile})
get_filename_component(pyfile_name "${pyfile}" NAME)
get_filename_component(pyfile "${pyfile}" ABSOLUTE)
get_filename_component(pyexefile_path ${pyexefile} PATH)
file(MAKE_DIRECTORY ${pyexefile_path})
string(REPLACE "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}"
pyexefile "${pyfile}.exe")
list(APPEND python_install_gen_targets "${pyexefile}")
get_filename_component(pyexefile_path "${pyexefile}" PATH)
file(MAKE_DIRECTORY "${pyexefile_path}")
add_custom_command(
OUTPUT ${pyexefile} DEPENDS ${pyfile}
OUTPUT ${pyexefile}
DEPENDS ${pyfile}
COMMAND ${PYTHON_EXECUTABLE} -c
"open('${pyexefile}','w').write(r'\#!${pyexe_native}'+'\\n'+open('${pyfile}').read())"
"open('${pyexefile}','w').write(r'\#!${pyexe_native}'+'\\n'+open('${pyfile}').read())"
COMMENT "Shebangin ${pyfile_name}"
VERBATIM
)
#on windows, python files need an extension to execute
get_filename_component(pyfile_ext ${pyfile} EXT)
get_filename_component(pyfile_ext "${pyfile}" EXT)
if(WIN32 AND NOT pyfile_ext)
set(pyfile_name "${pyfile_name}.py")
endif()
install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
install(PROGRAMS ${pyexefile}
RENAME ${pyfile_name}
DESTINATION ${VOLK_PYTHON_INSTALL_DESTINATION}
COMPONENT ${VOLK_PYTHON_INSTALL_COMPONENT}
)
endforeach()
endif()
volk_unique_target("pygen" ${python_install_gen_targets})
endfunction()
########################################################################
# Write the python helper script that generates byte code files
# Write the Python helper script that generates byte code files
########################################################################
file(WRITE ${PROJECT_BINARY_DIR}/python_compile_helper.py "
import sys, py_compile
file(WRITE ${PROJECT_BINARY_DIR}/python_compile_helper.py
"import sys, py_compile
files = sys.argv[1:]
srcs, gens = files[:len(files)//2], files[len(files)//2:]
for src, gen in zip(srcs, gens):
py_compile.compile(file=src, cfile=gen, doraise=True)
")
"
)
+2 -2
View File
@@ -140,9 +140,9 @@ else()
message(STATUS " The rinex2assist utility tool will not be built.")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|kFreeBSD|GNU")
message(STATUS " You can install the Boost Iostreams library by doing:")
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
if("${LINUX_DISTRIBUTION}" MATCHES "Fedora" OR "${LINUX_DISTRIBUTION}" MATCHES "Red Hat")
message(STATUS " sudo yum install boost-iostreams")
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
elseif("${LINUX_DISTRIBUTION}" MATCHES "openSUSE")
message(STATUS " sudo zypper install libboost_iostreams-devel")
else()
message(STATUS " sudo apt install libboost-iostreams-dev")