From cfcddf90ea6add9d4aaa99ee2decc5a9140bdf37 Mon Sep 17 00:00:00 2001 From: Ihor Dutchak Date: Sat, 18 Jun 2022 15:58:31 +0300 Subject: [PATCH 1/3] Ensure Iconv is found when provided via CFLAGS/LDFLAGS - by default find_file/find_library doesn't respect CFLAGS/LDFLAGS, and FindIconv fails to find Iconv; - by explicitly trying to link against `-liconv` - we're checking if library is available in such way; - additionally: if Iconv is detected as BUILT_IN, no need to explicitly depend on `Iconv::Iconv`; --- libusb/CMakeLists.txt | 41 +++++++++++++++++++++++++++++++++-------- src/CMakeLists.txt | 3 --- 2 files changed, 33 insertions(+), 11 deletions(-) --- a/libusb/CMakeLists.txt +++ b/libusb/CMakeLists.txt @@ -22,11 +22,53 @@ target_link_libraries(hidapi_libusb PRIV 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) + if(NOT ANDROID) include(CheckCSourceCompiles) - target_link_libraries(hidapi_libusb PRIVATE Iconv::Iconv) - set(CMAKE_REQUIRED_LIBRARIES "Iconv::Iconv") + + if(NOT CMAKE_VERSION VERSION_LESS 3.11) + message(STATUS "Check for Iconv") + find_package(Iconv) + if(Iconv_FOUND) + if(NOT Iconv_IS_BUILT_IN) + target_link_libraries(hidapi_libusb PRIVATE Iconv::Iconv) + set(CMAKE_REQUIRED_LIBRARIES "Iconv::Iconv") + if(NOT BUILD_SHARED_LIBS) + set(HIDAPI_NEED_EXPORT_ICONV TRUE PARENT_SCOPE) + endif() + endif() + else() + message(STATUS "Iconv Explicitly check '-liconv'") + # Sometime the build environment is not setup + # in a way CMake can find Iconv on its own by default. + # But if we simply link against iconv (-liconv), the build may succeed + # due to other compiler/link flags. + set(CMAKE_REQUIRED_LIBRARIES "iconv") + check_c_source_compiles(" + #include + #include + int main() { + char *a, *b; + size_t i, j; + iconv_t ic; + ic = iconv_open(\"to\", \"from\"); + iconv(ic, &a, &i, &b, &j); + iconv_close(ic); + } + " + Iconv_EXPLICITLY_AT_ENV) + if(Iconv_EXPLICITLY_AT_ENV) + message(STATUS "Iconv Explicitly check '-liconv' - Available") + target_link_libraries(hidapi_libusb PRIVATE iconv) + else() + message(FATAL_ERROR "Iconv is not found, make sure to provide it in the build environment") + endif() + endif() + else() + # otherwise there is 2 options: + # 1) iconv is provided by Standard C library and the build will be just fine + # 2) The _user_ has to provide additiona compilation options for this project/target + endif() + # 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); @@ -35,11 +77,9 @@ else() if(HIDAPI_ICONV_CONST) target_compile_definitions(hidapi_libusb PRIVATE "ICONV_CONST=const") endif() + else() + # On Android Iconv is disabled on the code level anyway, so no issue; 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 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -148,9 +148,6 @@ 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")