From 97fc4bf2dac61197e73f6da55a881b4d1ca30f6b Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 5 Mar 2022 14:19:49 +0100 Subject: [PATCH] Fixed build with hidapi --- CMakeLists.txt | 3 +- cmake/Modules/FindHIDAPI.cmake | 234 ++++++++++++++++++ fcdhid/CMakeLists.txt | 2 + plugins/samplesource/CMakeLists.txt | 2 +- plugins/samplesource/fcdpro/CMakeLists.txt | 17 +- .../samplesource/fcdproplus/CMakeLists.txt | 15 +- 6 files changed, 256 insertions(+), 17 deletions(-) create mode 100644 cmake/Modules/FindHIDAPI.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index db7e0321c..ac2541bdb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -349,6 +349,7 @@ find_package(PkgConfig REQUIRED) find_package(Boost REQUIRED) find_package(FFTW3F REQUIRED) find_package(LibUSB REQUIRED) # used by so many packages +find_package(HIDAPI) # For FCD find_package(OpenCV OPTIONAL_COMPONENTS core highgui imgproc imgcodecs videoio) # channeltx/modatv find_package(LibSigMF) # SigMF recording files support if(NOT WIN32) @@ -448,7 +449,7 @@ if(ENABLE_USRP) find_package(UHD) endif() -if(ENABLE_FUNCUBE AND UNIX AND LIBUSB_FOUND) +if(ENABLE_FUNCUBE AND UNIX AND LIBUSB_FOUND AND HIDAPI_FOUND) add_subdirectory(fcdlib) add_subdirectory(fcdhid) endif() diff --git a/cmake/Modules/FindHIDAPI.cmake b/cmake/Modules/FindHIDAPI.cmake new file mode 100644 index 000000000..047485ddf --- /dev/null +++ b/cmake/Modules/FindHIDAPI.cmake @@ -0,0 +1,234 @@ +#.rst: +# FindHIDAPI +# ---------- +# +# Try to find HIDAPI library, from http://www.signal11.us/oss/hidapi/ +# +# Cache Variables: (probably not for direct use in your scripts) +# HIDAPI_INCLUDE_DIR +# HIDAPI_LIBRARY +# +# Non-cache variables you might use in your CMakeLists.txt: +# HIDAPI_FOUND +# HIDAPI_INCLUDE_DIRS +# HIDAPI_LIBRARIES +# +# COMPONENTS +# ^^^^^^^^^^ +# +# This module respects several COMPONENTS specifying the backend you prefer: +# ``any`` (the default), ``libusb``, and ``hidraw``. +# The availablility of the latter two depends on your platform. +# +# +# IMPORTED Targets +# ^^^^^^^^^^^^^^^^ + +# This module defines :prop_tgt:`IMPORTED` target ``HIDAPI::hidapi`` (in all cases or +# if no components specified), ``HIDAPI::hidapi-libusb`` (if you requested the libusb component), +# and ``HIDAPI::hidapi-hidraw`` (if you requested the hidraw component), +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# ``HIDAPI_FOUND`` +# True if HIDAPI or the requested components (if any) were found. +# +# We recommend using the imported targets instead of the following. +# +# ``HIDAPI_INCLUDE_DIRS`` +# ``HIDAPI_LIBRARIES`` +# +# Original Author: +# 2009-2010, 2019 Ryan Pavlik +# http://academic.cleardefinition.com +# +# Copyright Iowa State University 2009-2010. +# Copyright Collabora, Ltd. 2019. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +cmake_policy(SET CMP0045 NEW) +cmake_policy(SET CMP0053 NEW) +cmake_policy(SET CMP0054 NEW) + +set(HIDAPI_ROOT_DIR + "${HIDAPI_ROOT_DIR}" + CACHE PATH "Root to search for HIDAPI") + +# Clean up components +if("${HIDAPI_FIND_COMPONENTS}") + if(WIN32 OR APPLE) + # This makes no sense on Windows or Mac, which have native APIs + list(REMOVE "${HIDAPI_FIND_COMPONENTS}" libusb) + endif() + + if(NOT ${CMAKE_SYSTEM} MATCHES "Linux") + # hidraw is only on linux + list(REMOVE "${HIDAPI_FIND_COMPONENTS}" hidraw) + endif() +endif() +if(NOT "${HIDAPI_FIND_COMPONENTS}") + # Default to any + set("${HIDAPI_FIND_COMPONENTS}" any) +endif() + +# Ask pkg-config for hints +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + set(_old_prefix_path "${CMAKE_PREFIX_PATH}") + # So pkg-config uses HIDAPI_ROOT_DIR too. + if(HIDAPI_ROOT_DIR) + list(APPEND CMAKE_PREFIX_PATH ${HIDAPI_ROOT_DIR}) + endif() + pkg_check_modules(PC_HIDAPI_LIBUSB QUIET hidapi-libusb) + pkg_check_modules(PC_HIDAPI_HIDRAW QUIET hidapi-hidraw) + # Restore + set(CMAKE_PREFIX_PATH "${_old_prefix_path}") +endif() + +# Actually search +find_library( + HIDAPI_UNDECORATED_LIBRARY + NAMES hidapi + PATHS "${HIDAPI_ROOT_DIR}" + PATH_SUFFIXES lib) + +find_library( + HIDAPI_LIBUSB_LIBRARY + NAMES hidapi hidapi-libusb + PATHS "${HIDAPI_ROOT_DIR}" + PATH_SUFFIXES lib + HINTS ${PC_HIDAPI_LIBUSB_LIBRARY_DIRS}) + +if(CMAKE_SYSTEM MATCHES "Linux") + find_library( + HIDAPI_HIDRAW_LIBRARY + NAMES hidapi-hidraw + HINTS ${PC_HIDAPI_HIDRAW_LIBRARY_DIRS}) +endif() + +find_path( + HIDAPI_INCLUDE_DIR + NAMES hidapi.h + PATHS "${HIDAPI_ROOT_DIR}" + PATH_SUFFIXES hidapi include include/hidapi + HINTS ${PC_HIDAPI_HIDRAW_INCLUDE_DIRS} ${PC_HIDAPI_LIBUSB_INCLUDE_DIRS}) + +find_package(Threads QUIET) + +### +# Compute the "I don't care which backend" library +### +set(HIDAPI_LIBRARY) + +# First, try to use a preferred backend if supplied +if("${HIDAPI_FIND_COMPONENTS}" MATCHES "libusb" + AND HIDAPI_LIBUSB_LIBRARY + AND NOT HIDAPI_LIBRARY) + set(HIDAPI_LIBRARY ${HIDAPI_LIBUSB_LIBRARY}) +endif() +if("${HIDAPI_FIND_COMPONENTS}" MATCHES "hidraw" + AND HIDAPI_HIDRAW_LIBRARY + AND NOT HIDAPI_LIBRARY) + set(HIDAPI_LIBRARY ${HIDAPI_HIDRAW_LIBRARY}) +endif() + +# Then, if we don't have a preferred one, settle for anything. +if(NOT HIDAPI_LIBRARY) + if(HIDAPI_LIBUSB_LIBRARY) + set(HIDAPI_LIBRARY ${HIDAPI_LIBUSB_LIBRARY}) + elseif(HIDAPI_HIDRAW_LIBRARY) + set(HIDAPI_LIBRARY ${HIDAPI_HIDRAW_LIBRARY}) + elseif(HIDAPI_UNDECORATED_LIBRARY) + set(HIDAPI_LIBRARY ${HIDAPI_UNDECORATED_LIBRARY}) + endif() +endif() + +### +# Determine if the various requested components are found. +### +set(_hidapi_component_required_vars) + +foreach(_comp IN LISTS HIDAPI_FIND_COMPONENTS) + if("${_comp}" STREQUAL "any") + list(APPEND _hidapi_component_required_vars HIDAPI_INCLUDE_DIR + HIDAPI_LIBRARY) + if(HIDAPI_INCLUDE_DIR AND EXISTS "${HIDAPI_LIBRARY}") + set(HIDAPI_any_FOUND TRUE) + mark_as_advanced(HIDAPI_INCLUDE_DIR) + else() + set(HIDAPI_any_FOUND FALSE) + endif() + + elseif("${_comp}" STREQUAL "libusb") + list(APPEND _hidapi_component_required_vars HIDAPI_INCLUDE_DIR + HIDAPI_LIBUSB_LIBRARY) + if(HIDAPI_INCLUDE_DIR AND EXISTS "${HIDAPI_LIBUSB_LIBRARY}") + set(HIDAPI_libusb_FOUND TRUE) + mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_LIBUSB_LIBRARY) + else() + set(HIDAPI_libusb_FOUND FALSE) + endif() + + elseif("${_comp}" STREQUAL "hidraw") + list(APPEND _hidapi_component_required_vars HIDAPI_INCLUDE_DIR + HIDAPI_HIDRAW_LIBRARY) + if(HIDAPI_INCLUDE_DIR AND EXISTS "${HIDAPI_HIDRAW_LIBRARY}") + set(HIDAPI_hidraw_FOUND TRUE) + mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_HIDRAW_LIBRARY) + else() + set(HIDAPI_hidraw_FOUND FALSE) + endif() + + else() + message(WARNING "${_comp} is not a recognized HIDAPI component") + set(HIDAPI_${_comp}_FOUND FALSE) + endif() +endforeach() +unset(_comp) + +### +# FPHSA call +### +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + HIDAPI REQUIRED_VARS ${_hidapi_component_required_vars} THREADS_FOUND + HANDLE_COMPONENTS) + +if(HIDAPI_FOUND) + set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARY}") + set(HIDAPI_INCLUDE_DIRS "${HIDAPI_INCLUDE_DIR}") + if(NOT TARGET HIDAPI::hidapi) + add_library(HIDAPI::hidapi UNKNOWN IMPORTED) + set_target_properties( + HIDAPI::hidapi + PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION ${HIDAPI_LIBRARY}) + set_property( + TARGET HIDAPI::hidapi PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES + Threads::Threads) + endif() +endif() + +if(HIDAPI_libusb_FOUND AND NOT TARGET HIDAPI::hidapi-libusb) + add_library(HIDAPI::hidapi-libusb UNKNOWN IMPORTED) + set_target_properties( + HIDAPI::hidapi-libusb + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION + ${HIDAPI_LIBUSB_LIBRARY}) + set_property(TARGET HIDAPI::hidapi-libusb + PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES Threads::Threads) +endif() + +if(HIDAPI_hidraw_FOUND AND NOT TARGET HIDAPI::hidapi-hidraw) + add_library(HIDAPI::hidapi-hidraw UNKNOWN IMPORTED) + set_target_properties( + HIDAPI::hidapi-hidraw + PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION + ${HIDAPI_HIDRAW_LIBRARY}) + set_property(TARGET HIDAPI::hidapi-hidraw + PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES Threads::Threads) +endif() diff --git a/fcdhid/CMakeLists.txt b/fcdhid/CMakeLists.txt index 409a9a445..d808bde54 100644 --- a/fcdhid/CMakeLists.txt +++ b/fcdhid/CMakeLists.txt @@ -11,6 +11,7 @@ set(fcdhid_HEADERS include_directories( ${LIBUSB_INCLUDE_DIR} + ${HIDAPI_INCLUDE_DIRS} ${ICONV_INCLUDE_DIR} ${CUSTOM_APPLE_INCLUDE} ) @@ -21,6 +22,7 @@ add_library(fcdhid SHARED target_link_libraries(fcdhid ${LIBUSB_LIBRARIES} + ${HIDAPI_LIBRARIES} ${ICONV_LIBRARY} ) diff --git a/plugins/samplesource/CMakeLists.txt b/plugins/samplesource/CMakeLists.txt index a903dd4ee..0fa6361e4 100644 --- a/plugins/samplesource/CMakeLists.txt +++ b/plugins/samplesource/CMakeLists.txt @@ -21,7 +21,7 @@ if(ENABLE_BLADERF AND LIBBLADERF_FOUND) add_subdirectory(bladerf2input) endif() -if(ENABLE_FUNCUBE AND UNIX AND LIBUSB_FOUND) +if(ENABLE_FUNCUBE AND UNIX AND LIBUSB_FOUND AND HIDAPI_FOUND) add_subdirectory(fcdpro) add_subdirectory(fcdproplus) endif() diff --git a/plugins/samplesource/fcdpro/CMakeLists.txt b/plugins/samplesource/fcdpro/CMakeLists.txt index 828eb6647..8c59e5ab1 100644 --- a/plugins/samplesource/fcdpro/CMakeLists.txt +++ b/plugins/samplesource/fcdpro/CMakeLists.txt @@ -17,8 +17,9 @@ set(fcdpro_HEADERS ) include_directories( - ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client - ${CMAKE_SOURCE_DIR}/fcdhid + ${HIDAPI_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${CMAKE_SOURCE_DIR}/fcdhid ${CMAKE_SOURCE_DIR}/fcdlib ) @@ -26,7 +27,6 @@ if(NOT SERVER_MODE) set(fcdpro_SOURCES ${fcdpro_SOURCES} fcdprogui.cpp - fcdprogui.ui ) set(fcdpro_HEADERS @@ -50,13 +50,14 @@ add_library(${TARGET_NAME} SHARED ) target_link_libraries(${TARGET_NAME} - Qt5::Core - ${TARGET_LIB} + ${HIDAPI_LIBRARIES} + Qt5::Core + ${TARGET_LIB} sdrbase ${TARGET_LIB_GUI} - swagger - fcdhid - fcdlib + swagger + fcdhid + fcdlib ) install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER}) diff --git a/plugins/samplesource/fcdproplus/CMakeLists.txt b/plugins/samplesource/fcdproplus/CMakeLists.txt index d6c075964..90fc9ba0f 100644 --- a/plugins/samplesource/fcdproplus/CMakeLists.txt +++ b/plugins/samplesource/fcdproplus/CMakeLists.txt @@ -17,7 +17,8 @@ set(fcdproplus_HEADERS ) include_directories( - ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${HIDAPI_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/fcdhid ${CMAKE_SOURCE_DIR}/fcdlib ) @@ -26,7 +27,6 @@ if(NOT SERVER_MODE) set(fcdproplus_SOURCES ${fcdproplus_SOURCES} fcdproplusgui.cpp - fcdproplusgui.ui ) set(fcdproplus_HEADERS @@ -50,13 +50,14 @@ add_library(${TARGET_NAME} SHARED ) target_link_libraries(${TARGET_NAME} - Qt5::Core - ${TARGET_LIB} + ${HIDAPI_LIBRARIES} + Qt5::Core + ${TARGET_LIB} sdrbase ${TARGET_LIB_GUI} - swagger - fcdhid - fcdlib + swagger + fcdhid + fcdlib ) install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})