diff --git a/CMakeLists.txt b/CMakeLists.txt index ba207dfd1..97afaf1a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,8 @@ option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) option(YUZU_USE_BUNDLED_BOOST "Download bundled Boost" OFF) +option(YUZU_USE_BUNDLED_LIBUSB "Compile bundled libusb" OFF) + CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ON "WIN32" OFF) option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF) @@ -420,14 +422,22 @@ elseif (TARGET Boost::boost) endif() # Ensure libusb is properly configured (based on dolphin libusb include) -if(NOT APPLE) +if(NOT APPLE AND NOT YUZU_USE_BUNDLED_LIBUSB) include(FindPkgConfig) - find_package(LibUSB) -endif() -if (NOT LIBUSB_FOUND) - add_subdirectory(externals/libusb) - set(LIBUSB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/externals/libusb/libusb/libusb") - set(LIBUSB_LIBRARIES usb) + if (PKG_CONFIG_FOUND) + pkg_check_modules(LIBUSB QUIET libusb-1.0>=1.0.24) + else() + find_package(LibUSB) + endif() + + if (LIBUSB_FOUND) + add_library(usb INTERFACE) + target_include_directories(usb INTERFACE "${LIBUSB_INCLUDE_DIRS}") + target_link_libraries(usb INTERFACE "${LIBUSB_LIBRARIES}") + else() + message(WARNING "libusb not found, falling back to externals") + set(YUZU_USE_BUNDLED_LIBUSB ON) + endif() endif() # List of all FFmpeg components required diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index aae0baa0b..5402a532f 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -45,6 +45,11 @@ target_include_directories(microprofile INTERFACE ./microprofile) add_library(unicorn-headers INTERFACE) target_include_directories(unicorn-headers INTERFACE ./unicorn/include) +# libusb +if (NOT LIBUSB_FOUND OR YUZU_USE_BUNDLED_LIBUSB) + add_subdirectory(libusb) +endif() + # SDL2 if (NOT SDL2_FOUND AND ENABLE_SDL2) if (NOT WIN32) diff --git a/externals/libusb/CMakeLists.txt b/externals/libusb/CMakeLists.txt index 3ef007b40..06ce0fba7 100644 --- a/externals/libusb/CMakeLists.txt +++ b/externals/libusb/CMakeLists.txt @@ -1,10 +1,13 @@ -if (MINGW) - # The MinGW toolchain for some reason doesn't work with this CMakeLists file after updating to - # 1.0.24, so we do it the old-fashioned way for now. We may want to move native Linux toolchains - # to here, too (TODO lat9nq?). +set(LIBUSB_FOUND ON CACHE BOOL "libusb is present" FORCE) +set(LIBUSB_VERSION "1.0.24" CACHE STRING "libusb version string" FORCE) + +if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")) + # GNU toolchains for some reason doesn't work with the later half of this CMakeLists after + # updating to 1.0.24, so we do it the old-fashioned way for now. set(LIBUSB_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/libusb") set(LIBUSB_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libusb") + # Workarounds for MSYS/MinGW if (MSYS) # CMake on Windows passes `C:/`, but we need `/C/` or `/c/` to use `configure` @@ -19,36 +22,42 @@ if (MINGW) set(LIBUSB_CONFIGURE "${LIBUSB_SRC_DIR}/configure") set(LIBUSB_MAKEFILE "${LIBUSB_PREFIX}/Makefile") - set(LIBUSB_LIBRARY "${LIBUSB_PREFIX}/libusb/.libs/libusb-1.0.dll.a") - set(LIBUSB_SHARED_LIBRARY "${LIBUSB_PREFIX}/libusb/.libs/libusb-1.0.dll") - set(LIBUSB_SHARED_LIBRARY_DEST "${CMAKE_BINARY_DIR}/bin/libusb-1.0.dll") - # Causes "externals/libusb/libusb/libusb/os/windows_winusb.c:1427:2: error: conversion to non-scalar type requested", so cannot statically link it for now. - # set(LIBUSB_CFLAGS "-DGUID_DEVINTERFACE_USB_DEVICE=\\(GUID\\){0xA5DCBF10,0x6530,0x11D2,{0x90,0x1F,0x00,0xC0,0x4F,0xB9,0x51,0xED}}") + if (MINGW) + set(LIBUSB_LIBRARIES "${LIBUSB_PREFIX}/libusb/.libs/libusb-1.0.dll.a" CACHE PATH "libusb library path" FORCE) + set(LIBUSB_SHARED_LIBRARY "${LIBUSB_PREFIX}/libusb/.libs/libusb-1.0.dll") + set(LIBUSB_SHARED_LIBRARY_DEST "${CMAKE_BINARY_DIR}/bin/libusb-1.0.dll") + + set(LIBUSB_CONFIGURE_ARGS --host=x86_64-w64-mingw32 --build=x86_64-windows) + else() + set(LIBUSB_LIBRARIES "${LIBUSB_PREFIX}/libusb/.libs/libusb-1.0.a" CACHE PATH "libusb library path" FORCE) + endif() + + set(LIBUSB_INCLUDE_DIRS "${LIBUSB_SRC_DIR}/libusb" CACHE PATH "libusb headers path" FORCE) + + # MINGW: causes "externals/libusb/libusb/libusb/os/windows_winusb.c:1427:2: error: conversion to non-scalar type requested", so cannot statically link it for now. + if (NOT MINGW) + set(LIBUSB_CFLAGS "-DGUID_DEVINTERFACE_USB_DEVICE=\\(GUID\\){0xA5DCBF10,0x6530,0x11D2,{0x90,0x1F,0x00,0xC0,0x4F,0xB9,0x51,0xED}}") + endif() make_directory("${LIBUSB_PREFIX}") add_custom_command( OUTPUT - "${LIBUSB_LIBRARY}" + "${LIBUSB_LIBRARIES}" COMMAND make WORKING_DIRECTORY "${LIBUSB_PREFIX}" ) - # We may use this path for other GNU toolchains, so put all of the MinGW-specific stuff here - if (MINGW) - set(LIBUSB_CONFIGURE_ARGS --host=x86_64-w64-mingw32 --build=x86_64-windows) - endif() - add_custom_command( OUTPUT "${LIBUSB_MAKEFILE}" COMMAND - # /bin/env - # CFLAGS="${LIBUSB_CFLAGS}" - /bin/sh "${LIBUSB_CONFIGURE}" + env + CFLAGS="${LIBUSB_CFLAGS}" + sh "${LIBUSB_CONFIGURE}" ${LIBUSB_CONFIGURE_ARGS} --srcdir="${LIBUSB_SRC_DIR}" WORKING_DIRECTORY @@ -59,7 +68,7 @@ if (MINGW) OUTPUT "${LIBUSB_CONFIGURE}" COMMAND - /bin/sh "${LIBUSB_SRC_DIR}/bootstrap.sh" + sh "${LIBUSB_SRC_DIR}/bootstrap.sh" WORKING_DIRECTORY "${LIBUSB_SRC_DIR}" ) @@ -68,19 +77,30 @@ if (MINGW) OUTPUT "${LIBUSB_SHARED_LIBRARY_DEST}" COMMAND - /bin/cp "${LIBUSB_SHARED_LIBRARY}" "${LIBUSB_SHARED_LIBRARY_DEST}" + cp "${LIBUSB_SHARED_LIBRARY}" "${LIBUSB_SHARED_LIBRARY_DEST}" ) - add_custom_target(usb-bootstrap ALL DEPENDS "${LIBUSB_CONFIGURE}") - add_custom_target(usb-configure ALL DEPENDS "${LIBUSB_MAKEFILE}" usb-bootstrap) - add_custom_target(usb-build ALL DEPENDS "${LIBUSB_LIBRARY}" usb-configure) + add_custom_target(usb-bootstrap DEPENDS "${LIBUSB_CONFIGURE}") + add_custom_target(usb-configure DEPENDS "${LIBUSB_MAKEFILE}" usb-bootstrap) + add_custom_target(usb-build ALL DEPENDS "${LIBUSB_LIBRARIES}" usb-configure) # Workaround since static linking didn't work out -- We need to copy the DLL to the bin directory add_custom_target(usb-copy ALL DEPENDS "${LIBUSB_SHARED_LIBRARY_DEST}" usb-build) - # Make `usb` alias to LIBUSB_LIBRARY add_library(usb INTERFACE) - target_link_libraries(usb INTERFACE "${LIBUSB_LIBRARY}") -else() # MINGW + add_dependencies(usb usb-copy) + target_link_libraries(usb INTERFACE "${LIBUSB_LIBRARIES}") + target_include_directories(usb INTERFACE "${LIBUSB_INCLUDE_DIRS}") + + if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + Include(FindPkgConfig) + pkg_check_modules(LIBUDEV REQUIRED libudev) + + if (LIBUDEV_FOUND) + target_include_directories(usb INTERFACE "${LIBUDEV_INCLUDE_DIRS}") + target_link_libraries(usb INTERFACE "${LIBUDEV_STATIC_LIBRARIES}") + endif() + endif() +else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") # Ensure libusb compiles with UTF-8 encoding on MSVC if(MSVC) add_compile_options(/utf-8) @@ -236,4 +256,4 @@ else() # MINGW configure_file(config.h.in config.h) -endif() # MINGW +endif() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt index de53e1fda..7c5763f9c 100644 --- a/src/input_common/CMakeLists.txt +++ b/src/input_common/CMakeLists.txt @@ -71,8 +71,7 @@ if (ENABLE_SDL2) target_compile_definitions(input_common PRIVATE HAVE_SDL2) endif() -target_include_directories(input_common SYSTEM PRIVATE ${LIBUSB_INCLUDE_DIR}) -target_link_libraries(input_common PRIVATE ${LIBUSB_LIBRARIES}) +target_link_libraries(input_common PRIVATE usb) create_target_directory_groups(input_common) target_link_libraries(input_common PUBLIC core PRIVATE common Boost::boost)