From 7f0a7b1e778b1408c37b2270052a9bff0ab0534d Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 3 Apr 2022 23:24:31 +0200 Subject: [PATCH] Improve detection of cpu_features, replace ENABLE_OWN_CPUFEATURES building option by ENABLE_CPUFEATURES, defaulting to OFF --- CMakeLists.txt | 57 ++++++------ cmake/Modules/FindCPUFEATURES.cmake | 92 +++++++++++++++++++ docs/CHANGELOG.md | 4 +- .../volk_gnsssdr/CMakeLists.txt | 52 +++++------ .../volk_gnsssdr/lib/CMakeLists.txt | 17 ++-- .../volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c | 2 + 6 files changed, 160 insertions(+), 64 deletions(-) create mode 100644 cmake/Modules/FindCPUFEATURES.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 97767613d..b256514c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ option(ENABLE_SYSTEM_TESTING_EXTRA "Download external tools and build extra syst option(ENABLE_GNSS_SIM_INSTALL "Enable the installation of gnss_sim on the fly" ON) -option(ENABLE_OWN_CPUFEATURES "Force the building of the cpu_features library even if it is already installed" OFF) +option(ENABLE_CPUFEATURES "Make use of the cpu_features library" ON) if(NOT (ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA)) set(ENABLE_GNSS_SIM_INSTALL OFF) @@ -1192,15 +1192,8 @@ if(NOT VOLKGNSSSDR_FOUND) endif() include(GNUInstallDirs) set(SUPPORTED_CPU_FEATURES_ARCH FALSE) - if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") + if(CMAKE_SYSTEM_PROCESSOR MATCHES + "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)") set(SUPPORTED_CPU_FEATURES_ARCH TRUE) endif() if(${CMAKE_INSTALL_LIBDIR} MATCHES lib64) @@ -1226,32 +1219,37 @@ if(NOT VOLKGNSSSDR_FOUND) ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install/lib${VOLK_GNSSSDR_LIB_SUFFIX}/${CMAKE_FIND_LIBRARY_PREFIXES}volk_gnsssdr${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install/bin/volk_gnsssdr_profile ) - if(NOT ENABLE_OWN_CPUFEATURES) - find_package(CpuFeatures) - set_package_properties(CpuFeatures PROPERTIES + if(ENABLE_CPUFEATURES) + find_package(CPUFEATURES) + set_package_properties(CPUFEATURES PROPERTIES URL "https://github.com/google/cpu_features" PURPOSE "Used by the volk_gnsssdr library." TYPE REQUIRED ) endif() - if(CpuFeatures_FOUND) + if(CPUFEATURES_FOUND) message(STATUS "Found CpuFeatures: (found version ${CpuFeatures_VERSION})") - set_package_properties(CpuFeatures PROPERTIES + set_package_properties(CPUFEATURES PROPERTIES DESCRIPTION "A cross platform C99 library to get CPU features at runtime (found: v${CpuFeatures_VERSION})" ) else() - set_package_properties(CpuFeatures PROPERTIES + set_package_properties(CPUFEATURES PROPERTIES DESCRIPTION "A cross platform C99 library to get CPU features at runtime" - PURPOSE "CpuFeatures will be built when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'." ) - set(VOLK_GNSSSDR_BUILD_BYPRODUCTS - ${VOLK_GNSSSDR_BUILD_BYPRODUCTS} - ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install/${CMAKE_INSTALL_LIBDIR}/${CMAKE_FIND_LIBRARY_PREFIXES}cpu_features${CMAKE_STATIC_LIBRARY_SUFFIX} - ) - set(ENABLE_OWN_CPUFEATURES ON) + if(VOLK_VERSION AND VOLK_VERSION VERSION_GREATER 2.4 AND VOLK_VERSION VERSION_LESS "2.5.2") # detect "hidden" cpu_features 0.6.0 + set(ENABLE_CPUFEATURES OFF) + else() + set_package_properties(CPUFEATURES PROPERTIES + PURPOSE "CpuFeatures will be built when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'." + ) + set(VOLK_GNSSSDR_BUILD_BYPRODUCTS + ${VOLK_GNSSSDR_BUILD_BYPRODUCTS} + ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install/${CMAKE_INSTALL_LIBDIR}/${CMAKE_FIND_LIBRARY_PREFIXES}cpu_features${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + endif() endif() set(VOLK_GNSSSDR_CMAKE_ARGS ${VOLK_GNSSSDR_CMAKE_ARGS} - -DENABLE_OWN_CPUFEATURES=${ENABLE_OWN_CPUFEATURES} + -DVOLK_CPU_FEATURES=${ENABLE_CPUFEATURES} ) ExternalProject_Add(volk_gnsssdr_module PREFIX ${CMAKE_BINARY_DIR}/volk_gnsssdr_module @@ -1268,6 +1266,10 @@ if(NOT VOLKGNSSSDR_FOUND) INSTALL_DIR ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install ) else() + set(ENABLE_CPUFEATURES OFF) + set(VOLK_GNSSSDR_CMAKE_ARGS ${VOLK_GNSSSDR_CMAKE_ARGS} + -DVOLK_CPU_FEATURES=${ENABLE_CPUFEATURES} + ) ExternalProject_Add(volk_gnsssdr_module PREFIX ${CMAKE_BINARY_DIR}/volk_gnsssdr_module SOURCE_DIR ${CMAKE_SOURCE_DIR}/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr @@ -1295,8 +1297,8 @@ if(NOT VOLKGNSSSDR_FOUND) set_property(TARGET volk_gnsssdr PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install/lib${VOLK_GNSSSDR_LIB_SUFFIX}/libvolk_gnsssdr${CMAKE_STATIC_LIBRARY_SUFFIX}) set(VOLK_GNSSSDR_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/volk_gnsssdr_module/build/include/;${CMAKE_SOURCE_DIR}/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/include;${ORC_INCLUDE_DIRS}") set(VOLK_GNSSSDR_LIBRARIES volk_gnsssdr ${ORC_LIBRARIES_STATIC}) - if(CpuFeatures_FOUND) - set(VOLK_GNSSSDR_LIBRARIES ${VOLK_GNSSSDR_LIBRARIES} CpuFeatures::cpu_features) + if(CPUFEATURES_FOUND) + set(VOLK_GNSSSDR_LIBRARIES ${VOLK_GNSSSDR_LIBRARIES} CpuFeature::cpu_features) endif() if(NOT TARGET Volkgnsssdr::volkgnsssdr) @@ -1311,7 +1313,7 @@ if(NOT VOLKGNSSSDR_FOUND) INTERFACE_LINK_LIBRARIES "${VOLK_GNSSSDR_LIBRARIES}" ) if(CMAKE_VERSION VERSION_GREATER 3.0 AND SUPPORTED_CPU_FEATURES_ARCH) - if(NOT CpuFeatures_FOUND) + if(NOT CPUFEATURES_FOUND AND ENABLE_CPUFEATURES) set_target_properties(Volkgnsssdr::volkgnsssdr PROPERTIES INTERFACE_LINK_LIBRARIES ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/install/${CMAKE_INSTALL_LIBDIR}/${CMAKE_FIND_LIBRARY_PREFIXES}cpu_features${CMAKE_STATIC_LIBRARY_SUFFIX} ) @@ -1341,7 +1343,6 @@ if(NOT VOLKGNSSSDR_FOUND) PURPOSE "volk_gnsssdr will be built when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'." ) else() - set(ENABLE_OWN_CPUFEATURES OFF) set(ENABLE_ORC OFF) endif() @@ -3356,7 +3357,7 @@ add_feature_info(ENABLE_GNSS_SIM_INSTALL ENABLE_GNSS_SIM_INSTALL "Enables downlo add_feature_info(ENABLE_INSTALL_TESTS ENABLE_INSTALL_TESTS "Install test binaries when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME} install'.") add_feature_info(ENABLE_BENCHMARKS ENABLE_BENCHMARKS "Enables building of code snippet benchmarks.") add_feature_info(ENABLE_EXTERNAL_MATHJAX ENABLE_EXTERNAL_MATHJAX "Use MathJax from an external CDN in HTML docs when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME} doc'.") -add_feature_info(ENABLE_OWN_CPUFEATURES ENABLE_OWN_CPUFEATURES "Force building own local version of the cpu_features library, even if it is already installed.") +add_feature_info(ENABLE_CPUFEATURES ENABLE_CPUFEATURES "Make use of the cpu_features library.") add_feature_info(Boost_USE_STATIC_LIBS Boost_USE_STATIC_LIBS "Use Boost static libraries.") message(STATUS "") diff --git a/cmake/Modules/FindCPUFEATURES.cmake b/cmake/Modules/FindCPUFEATURES.cmake new file mode 100644 index 000000000..89936ee59 --- /dev/null +++ b/cmake/Modules/FindCPUFEATURES.cmake @@ -0,0 +1,92 @@ +# GNSS-SDR is a Global Navigation Satellite System software-defined receiver. +# This file is part of GNSS-SDR. +# +# SPDX-FileCopyrightText: 2021 C. Fernandez-Prades cfernandez(at)cttc.es +# SPDX-License-Identifier: BSD-3-Clause + +set(FPHSA_NAME_MISMATCHED ON) + +find_library(CPUFEATURES_LIBRARIES + NAMES cpu_features + PATHS /usr/lib + /usr/lib64 + /usr/lib/x86_64-linux-gnu + /usr/lib/i386-linux-gnu + /usr/lib/arm-linux-gnueabihf + /usr/lib/arm-linux-gnueabi + /usr/lib/aarch64-linux-gnu + /usr/lib/mipsel-linux-gnu + /usr/lib/mips-linux-gnu + /usr/lib/mips64el-linux-gnuabi64 + /usr/lib/powerpc-linux-gnu + /usr/lib/powerpc64-linux-gnu + /usr/lib/powerpc64le-linux-gnu + /usr/lib/powerpc-linux-gnuspe + /usr/lib/hppa-linux-gnu + /usr/lib/s390x-linux-gnu + /usr/lib/i386-gnu + /usr/lib/hppa-linux-gnu + /usr/lib/x86_64-kfreebsd-gnu + /usr/lib/i386-kfreebsd-gnu + /usr/lib/m68k-linux-gnu + /usr/lib/sh4-linux-gnu + /usr/lib/sparc64-linux-gnu + /usr/lib/x86_64-linux-gnux32 + /usr/lib/alpha-linux-gnu + /usr/lib/riscv64-linux-gnu + /usr/local/lib + /usr/local/lib64 + /opt/local/lib +) + +find_path(CPUFEATURES_INCLUDE_DIR cpu_features_macros.h + PATHS $ENV{CPUFEATURES_DIR}/include + $ENV{CPUFEATURES_DIR} + /usr/include + /usr/local/include + ~/Library/Frameworks + /Library/Frameworks + /sw/include # Fink + /opt/local/include # MacPorts + /opt/csw/include # Blastwave + 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() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(CPUFEATURES + DEFAULT_MSG + CPUFEATURES_LIBRARIES + CPUFEATURES_INCLUDE_DIR +) + +if(CPUFEATURES_FOUND AND NOT TARGET CpuFeature::cpu_features) + add_library(CpuFeature::cpu_features STATIC IMPORTED) + set_target_properties(CpuFeature::cpu_features PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${CPUFEATURES_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${CPUFEATURES_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${CPUFEATURES_LIBRARIES}" + ) + add_library(cpu_features ALIAS CpuFeature::cpu_features) +endif() + +mark_as_advanced(CPUFEATURES_LIBRARIES) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c74cfe536..d7dfd8880 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -21,7 +21,9 @@ All notable changes to GNSS-SDR will be documented in this file. ### Improvements in Portability: -- Updated `cpu_features` library to v0.7.0. +- Updated `cpu_features` library to v0.7.0. The building option + `ENABLE_OWN_CPUFEATURES` has been replaced by `ENABLE_CPUFEATURES`, defaulting + to `ON`. - Fixed building against GNU Radio > v3.10.1.1. ### Improvements in Reliability: diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt index b2da873fb..081e95c4c 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt @@ -250,45 +250,43 @@ endif() ######################################################################## # cpu_features -option(ENABLE_OWN_CPUFEATURES "Force the building of the cpu_features library even if it is already installed" OFF) if(CMAKE_SYSTEM_PROCESSOR MATCHES "^cortex") set(CMAKE_SYSTEM_PROCESSOR arm-${CMAKE_SYSTEM_PROCESSOR}) endif() -set(SUPPORTED_CPU_FEATURES_ARCH FALSE) -if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(^aarch64)|(arm64)") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") - set(SUPPORTED_CPU_FEATURES_ARCH TRUE) +# cpu_features - sensible defaults, user settable option +if(CMAKE_SYSTEM_PROCESSOR MATCHES + "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)") + option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" ON) +else() + option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" OFF) endif() -if(CMAKE_VERSION VERSION_GREATER 3.0 AND SUPPORTED_CPU_FEATURES_ARCH) - set(BUILD_TESTING OFF CACHE BOOL "Build cpu_features without tests." FORCE) - set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL - "Build cpu_features with Position Independent Code (PIC)." - FORCE - ) +if(CMAKE_VERSION VERSION_GREATER 3.0 AND VOLK_CPU_FEATURES) + find_package(CPUFEATURES) set(USE_CPU_FEATURES ON) - set(BUILD_SHARED_LIBS_SAVED "${BUILD_SHARED_LIBS}") - set(BUILD_SHARED_LIBS OFF) - if(NOT ENABLE_OWN_CPUFEATURES) - find_package(CPUFEATURES QUIET) - endif() - if(CPUFEATURES_FOUND) - message(STATUS "Found CpuFeatures: (found version ${CPUFEATURES_VERSION})") - else() + if(NOT CPUFEATURES_FOUND) + message(STATUS "Building volk-gnsssdr with cpu_features") + set(BUILD_TESTING OFF CACHE BOOL "Build cpu_features without tests." FORCE) + set(BUILD_PIC ON CACHE BOOL + "Build cpu_features with Position Independent Code (PIC)." + FORCE + ) + set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL + "Build cpu_features with Position Independent Code (PIC)." + FORCE + ) + set(BUILD_SHARED_LIBS_SAVED "${BUILD_SHARED_LIBS}") + set(BUILD_SHARED_LIBS OFF) add_subdirectory(cpu_features) + set(BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS_SAVED}") endif() - set(BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS_SAVED}") +else() + message(STATUS "Building volk-gnsssdr without cpu_features") endif() + # Python include(VolkPython) # sets PYTHON_EXECUTABLE volk_python_check_module("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/CMakeLists.txt index 0d8244882..cddfcb25d 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/CMakeLists.txt @@ -532,10 +532,11 @@ if(NOT (CMAKE_GENERATOR STREQUAL Xcode)) PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ) if(USE_CPU_FEATURES) - if(CpuFeatures_FOUND) + set_source_files_properties(volk_gnsssdr_cpu.c PROPERTIES COMPILE_DEFINITIONS "VOLK_CPU_FEATURES=1") + if(CPUFEATURES_FOUND) target_include_directories(volk_gnsssdr_obj PRIVATE - $ + $ ) else() target_include_directories(volk_gnsssdr_obj @@ -557,10 +558,10 @@ else() add_library(volk_gnsssdr SHARED $) endif() if(USE_CPU_FEATURES) - if(CpuFeatures_FOUND) + if(CPUFEATURES_FOUND) target_link_libraries(volk_gnsssdr PUBLIC ${volk_gnsssdr_libraries} - PRIVATE CpuFeatures::cpu_features + PRIVATE CpuFeature::cpu_features ) else() target_link_libraries(volk_gnsssdr @@ -580,10 +581,10 @@ target_include_directories(volk_gnsssdr PUBLIC $ ) if(USE_CPU_FEATURES) - if(CpuFeatures_FOUND) + if(CPUFEATURES_FOUND) target_include_directories(volk_gnsssdr PRIVATE - $ + $ ) else() target_include_directories(volk_gnsssdr @@ -620,9 +621,9 @@ if(ENABLE_STATIC_LIBS) endif() target_link_libraries(volk_gnsssdr_static PUBLIC ${volk_gnsssdr_libraries}) if(USE_CPU_FEATURES) - if(CpuFeatures_FOUND) + if(CPUFEATURES_FOUND) target_link_libraries(volk_gnsssdr_static - PRIVATE CpuFeatures::cpu_features + PRIVATE CpuFeature::cpu_features ) else() target_link_libraries(volk_gnsssdr_static diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c index ace129dad..d0db27e89 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c @@ -14,6 +14,7 @@ #include // clang-format on +#if defined(VOLK_CPU_FEATURES) #include "cpu_features_macros.h" #if defined(CPU_FEATURES_ARCH_X86) #include "cpuinfo_x86.h" @@ -31,6 +32,7 @@ #if defined(__cplusplus) using namespace cpu_features; #endif +#endif struct VOLK_CPU volk_gnsssdr_cpu;