cmake_minimum_required(VERSION 3.6.3...3.25 FATAL_ERROR) list(APPEND HIDAPI_PUBLIC_HEADERS "hidapi_libusb.h") add_library(hidapi_libusb ${HIDAPI_PUBLIC_HEADERS} hid.c ) target_link_libraries(hidapi_libusb PUBLIC hidapi_include) if(TARGET usb-1.0) target_link_libraries(hidapi_libusb PRIVATE usb-1.0) else() include(FindPkgConfig) pkg_check_modules(libusb REQUIRED IMPORTED_TARGET libusb-1.0>=1.0.9) target_link_libraries(hidapi_libusb PRIVATE PkgConfig::libusb) 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) include(CheckCSourceCompiles) 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 additional 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); int main() {}" HIDAPI_ICONV_CONST) 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() endif() set_target_properties(hidapi_libusb PROPERTIES EXPORT_NAME "libusb" OUTPUT_NAME "hidapi-libusb" VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} PUBLIC_HEADER "${HIDAPI_PUBLIC_HEADERS}" ) # compatibility with find_package() add_library(hidapi::libusb ALIAS hidapi_libusb) # compatibility with raw library link add_library(hidapi-libusb ALIAS hidapi_libusb) if(HIDAPI_INSTALL_TARGETS) install(TARGETS hidapi_libusb EXPORT hidapi LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hidapi" ) endif() hidapi_configure_pc("${PROJECT_ROOT}/pc/hidapi-libusb.pc.in")