From c888f0f237f72367857ac78419817755694d09ed Mon Sep 17 00:00:00 2001 From: Ihor Dutchak Date: Mon, 25 Apr 2022 18:20:14 +0300 Subject: [PATCH 1/2] Fix find_package(hidapi) warnings - FindPkgConfig.cmake warns it is not called by find_package; - CMake package `config` file and `exports` file names should not match, otherwise it gets included recursively by GLOB expression; --- src/CMakeLists.txt | 5 +++-- src/cmake/hidapi-config.cmake.in | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8f454e53f..ddffe5136 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -150,7 +150,7 @@ if(HIDAPI_INSTALL_TARGETS) include(CMakePackageConfigHelpers) set(EXPORT_DENERATED_LOCATION "${CMAKE_BINARY_DIR}/export_generated") set(EXPORT_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/hidapi") - write_basic_package_version_file("${EXPORT_DENERATED_LOCATION}/hidapi-config-version.cmake" + write_basic_package_version_file("${EXPORT_DENERATED_LOCATION}/libhidapi-version.cmake" COMPATIBILITY SameMajorVersion ) configure_package_config_file("cmake/hidapi-config.cmake.in" "${EXPORT_DENERATED_LOCATION}/hidapi-config.cmake" @@ -161,9 +161,10 @@ if(HIDAPI_INSTALL_TARGETS) install(EXPORT hidapi DESTINATION "${EXPORT_DESTINATION}" NAMESPACE hidapi:: + FILE "libhidapi.cmake" ) install(FILES - "${EXPORT_DENERATED_LOCATION}/hidapi-config-version.cmake" + "${EXPORT_DENERATED_LOCATION}/libhidapi-version.cmake" "${EXPORT_DENERATED_LOCATION}/hidapi-config.cmake" DESTINATION "${EXPORT_DESTINATION}" ) diff --git a/src/cmake/hidapi-config.cmake.in b/src/cmake/hidapi-config.cmake.in index 5dfec602c..571de467b 100644 --- a/src/cmake/hidapi-config.cmake.in +++ b/src/cmake/hidapi-config.cmake.in @@ -23,7 +23,7 @@ if(HIDAPI_NEED_EXPORT_LIBUSB OR HIDAPI_NEED_EXPORT_LIBUDEV) if(CMAKE_VERSION VERSION_LESS 3.6.3) message(FATAL_ERROR "This file relies on consumers using CMake 3.6.3 or greater.") endif() - include(FindPkgConfig) + find_package(PkgConfig) if(HIDAPI_NEED_EXPORT_LIBUSB) pkg_check_modules(libusb REQUIRED IMPORTED_TARGET libusb-1.0>=1.0.9) endif() @@ -32,7 +32,7 @@ if(HIDAPI_NEED_EXPORT_LIBUSB OR HIDAPI_NEED_EXPORT_LIBUDEV) endif() endif() -include("${CMAKE_CURRENT_LIST_DIR}/hidapi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/libhidapi.cmake") set(hidapi_FOUND TRUE) From d317693de53149047db3680d9e229699b5509894 Mon Sep 17 00:00:00 2001 From: Ihor Dutchak Date: Mon, 25 Apr 2022 19:41:20 +0300 Subject: [PATCH 2/2] libusb: cmake: Proper dependency on Iconv - explicitly add Iconv as a dependent library; - check if iconv requires pointer-to-const as input (introduce ICONV_CONST check); - NetBSD CI (has external Iconv library implementation that uses all of the above); --- .builds/netbsd.yml | 18 ++++++++++++++++++ libusb/CMakeLists.txt | 23 +++++++++++++++++++++++ libusb/hid.c | 7 +++++-- src/CMakeLists.txt | 7 +++++++ src/cmake/hidapi-config.cmake.in | 9 +++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 .builds/netbsd.yml diff --git a/.builds/netbsd.yml b/.builds/netbsd.yml new file mode 100644 index 000000000..a800e6087 --- /dev/null +++ b/.builds/netbsd.yml @@ -0,0 +1,18 @@ +image: netbsd/latest +packages: +- cmake +- pkgconf +- libusb1 +- libiconv +sources: +- https://github.com/libusb/hidapi +tasks: +- setup: | + cd hidapi + mkdir -p build install + cmake -B build -S . -DCMAKE_INSTALL_PREFIX=install +- build: | + cd hidapi/build + make + make install + make clean diff --git a/libusb/CMakeLists.txt b/libusb/CMakeLists.txt index f4392d7a8..e5d7d5180 100644 --- a/libusb/CMakeLists.txt +++ b/libusb/CMakeLists.txt @@ -19,6 +19,29 @@ endif() find_package(Threads REQUIRED) target_link_libraries(hidapi_libusb PRIVATE Threads::Threads) +if(HIDAPI_NO_ICONV) + target_compile_definitions(hidapi_libusb PRIVATE NO_ICONV) +else() + if(NOT ANDROID AND NOT CMAKE_VERSION VERSION_LESS 3.11) + find_package(Iconv REQUIRED) + include(CheckCSourceCompiles) + target_link_libraries(hidapi_libusb PRIVATE Iconv::Iconv) + set(CMAKE_REQUIRED_LIBRARIES "Iconv::Iconv") + # check for error: "conflicting types for 'iconv'" + check_c_source_compiles("#include + extern size_t iconv (iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); + int main() {}" + HIDAPI_ICONV_CONST) + if(HIDAPI_ICONV_CONST) + target_compile_definitions(hidapi_libusb PRIVATE "ICONV_CONST=const") + endif() + endif() + # otherwise there is 3 options: + # 1) On Android Iconv is disabled on the code level anyway, so no issue; + # 2) iconv is provided by Standard C library and the build will be just fine; + # 4) The _user_ has to provide additiona compilation options for this project/target. +endif() + set_target_properties(hidapi_libusb PROPERTIES EXPORT_NAME "libusb" diff --git a/libusb/hid.c b/libusb/hid.c index 66ed378bb..3103f037d 100644 --- a/libusb/hid.c +++ b/libusb/hid.c @@ -44,6 +44,9 @@ #include #if !defined(__ANDROID__) && !defined(NO_ICONV) #include +#ifndef ICONV_CONST +#define ICONV_CONST +#endif #endif #include "hidapi_libusb.h" @@ -405,7 +408,7 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx) size_t inbytes; size_t outbytes; size_t res; - char *inptr; + ICONV_CONST char *inptr; char *outptr; #endif @@ -421,7 +424,7 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx) lang, (unsigned char*)buf, sizeof(buf)); - if (len < 0) + if (len < 2) /* we always skip first 2 bytes */ return NULL; #if defined(__ANDROID__) || defined(NO_ICONV) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ddffe5136..64304b5ac 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,6 +92,7 @@ set(EXPORT_COMPONENTS) set(HIDAPI_NEED_EXPORT_THREADS FALSE) set(HIDAPI_NEED_EXPORT_LIBUSB FALSE) set(HIDAPI_NEED_EXPORT_LIBUDEV FALSE) +set(HIDAPI_NEED_EXPORT_ICONV FALSE) if(WIN32) add_subdirectory("${PROJECT_ROOT}/windows" windows) @@ -128,6 +129,9 @@ else() target_include_directories(hidapi_include INTERFACE "$" ) + if(NOT DEFINED HIDAPI_NO_ICONV) + set(HIDAPI_NO_ICONV OFF) + endif() add_subdirectory("${PROJECT_ROOT}/libusb" libusb) list(APPEND EXPORT_COMPONENTS libusb) if(NOT EXPORT_ALIAS) @@ -138,6 +142,9 @@ else() if(NOT TARGET usb-1.0) set(HIDAPI_NEED_EXPORT_LIBUSB TRUE) endif() + if(NOT HIDAPI_NO_ICONV AND NOT ANDROID AND NOT CMAKE_VERSION VERSION_LESS 3.11) + set(HIDAPI_NEED_EXPORT_ICONV TRUE) + endif() endif() elseif(NOT TARGET hidapi_hidraw) message(FATAL_ERROR "Select at least one option to build: HIDAPI_WITH_LIBUSB or HIDAPI_WITH_HIDRAW") diff --git a/src/cmake/hidapi-config.cmake.in b/src/cmake/hidapi-config.cmake.in index 571de467b..4226c8cd8 100644 --- a/src/cmake/hidapi-config.cmake.in +++ b/src/cmake/hidapi-config.cmake.in @@ -11,6 +11,7 @@ set(hidapi_FOUND FALSE) set(HIDAPI_NEED_EXPORT_THREADS @HIDAPI_NEED_EXPORT_THREADS@) set(HIDAPI_NEED_EXPORT_LIBUSB @HIDAPI_NEED_EXPORT_LIBUSB@) set(HIDAPI_NEED_EXPORT_LIBUDEV @HIDAPI_NEED_EXPORT_LIBUDEV@) +set(HIDAPI_NEED_EXPORT_ICONV @HIDAPI_NEED_EXPORT_ICONV@) if(HIDAPI_NEED_EXPORT_THREADS) if(CMAKE_VERSION VERSION_LESS 3.4.3) @@ -32,6 +33,14 @@ if(HIDAPI_NEED_EXPORT_LIBUSB OR HIDAPI_NEED_EXPORT_LIBUDEV) endif() endif() +if(HIDAPI_NEED_EXPORT_ICONV) + if(CMAKE_VERSION VERSION_LESS 3.11) + message(WARNING "HIDAPI requires CMake target Iconv::Iconv, make sure to provide it") + else() + find_package(Iconv REQUIRED) + endif() +endif() + include("${CMAKE_CURRENT_LIST_DIR}/libhidapi.cmake") set(hidapi_FOUND TRUE)