cmake: Download Qt binaries on Linux if needed
If the local version of Qt is older than the minimum version required by yuzu, download a pre-built binary package from yuzu-emu/ext-linux-bin and build yuzu with it, instead. This also requires linking yuzu to the correct libraries after building it, and copying over the required binaries when building yuzu. This sets the Qt requirement to 5.12, which is intentionally behind the versions used by our toolchains since they are not all updated yet to 5.15.
This commit is contained in:
parent
3394f24728
commit
52cc25ccbf
3 changed files with 134 additions and 46 deletions
|
@ -17,7 +17,7 @@ CMAKE_DEPENDENT_OPTION(YUZU_ALLOW_SYSTEM_SDL2 "Try using system SDL2 before fall
|
||||||
|
|
||||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||||
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" ON "ENABLE_QT;MSVC" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" MSVC "ENABLE_QT" OFF)
|
||||||
|
|
||||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||||
|
|
||||||
|
@ -240,6 +240,7 @@ yuzu_find_packages()
|
||||||
|
|
||||||
# Qt5 requires that we find components, so it doesn't fit our pretty little find package function
|
# Qt5 requires that we find components, so it doesn't fit our pretty little find package function
|
||||||
if(ENABLE_QT)
|
if(ENABLE_QT)
|
||||||
|
set(QT_VERSION 5.12)
|
||||||
# We want to load the generated conan qt config so that we get the QT_ROOT var so that we can use the official
|
# We want to load the generated conan qt config so that we get the QT_ROOT var so that we can use the official
|
||||||
# Qt5Config inside the root folder instead of the conan generated one.
|
# Qt5Config inside the root folder instead of the conan generated one.
|
||||||
if(EXISTS ${CMAKE_BINARY_DIR}/qtConfig.cmake)
|
if(EXISTS ${CMAKE_BINARY_DIR}/qtConfig.cmake)
|
||||||
|
@ -247,22 +248,40 @@ if(ENABLE_QT)
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CONAN_QT_ROOT_RELEASE}")
|
list(APPEND CMAKE_MODULE_PATH "${CONAN_QT_ROOT_RELEASE}")
|
||||||
list(APPEND CMAKE_PREFIX_PATH "${CONAN_QT_ROOT_RELEASE}")
|
list(APPEND CMAKE_PREFIX_PATH "${CONAN_QT_ROOT_RELEASE}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Check for system Qt on Linux, fallback to bundled Qt
|
||||||
|
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||||
|
if (NOT YUZU_USE_BUNDLED_QT)
|
||||||
|
find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets QUIET)
|
||||||
|
if (NOT Qt5_FOUND)
|
||||||
|
set(YUZU_USE_BUNDLED_QT ON CACHE BOOL "Download bundled Qt" FORCE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if (YUZU_USE_BUNDLED_QT)
|
||||||
|
# Binary package currently does not support Qt webengine, so make sure it's disabled
|
||||||
|
set(YUZU_USE_QT_WEB_ENGINE OFF CACHE BOOL "Use Qt Webengine" FORCE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# Workaround for an issue where conan tries to build Qt from scratch instead of download prebuilt binaries
|
# Workaround for an issue where conan tries to build Qt from scratch instead of download prebuilt binaries
|
||||||
set(QT_PREFIX_HINT)
|
set(QT_PREFIX_HINT)
|
||||||
|
|
||||||
if(YUZU_USE_BUNDLED_QT)
|
if(YUZU_USE_BUNDLED_QT)
|
||||||
if ((MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1930) AND ARCHITECTURE_x86_64)
|
if ((MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1930) AND ARCHITECTURE_x86_64)
|
||||||
set(QT_VER qt-5.12.8-msvc2017_64)
|
set(QT_BUILD qt-5.12.8-msvc2017_64)
|
||||||
|
elseif ((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") AND NOT MINGW AND ARCHITECTURE_x86_64)
|
||||||
|
set(QT_BUILD qt5_5_15_2)
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable YUZU_USE_BUNDLED_QT and provide your own.")
|
message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable YUZU_USE_BUNDLED_QT and provide your own.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DEFINED QT_VER)
|
if (DEFINED QT_BUILD)
|
||||||
download_bundled_external("qt/" ${QT_VER} QT_PREFIX)
|
download_bundled_external("qt/" ${QT_BUILD} QT_PREFIX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(QT_PREFIX_HINT HINTS "${QT_PREFIX}")
|
set(QT_PREFIX_HINT HINTS "${QT_PREFIX}")
|
||||||
endif()
|
endif()
|
||||||
find_package(Qt5 5.9 COMPONENTS Widgets ${QT_PREFIX_HINT})
|
find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets ${QT_PREFIX_HINT} NO_CMAKE_SYSTEM_PATH)
|
||||||
if (YUZU_USE_QT_WEB_ENGINE)
|
if (YUZU_USE_QT_WEB_ENGINE)
|
||||||
find_package(Qt5 COMPONENTS WebEngineCore WebEngineWidgets)
|
find_package(Qt5 COMPONENTS WebEngineCore WebEngineWidgets)
|
||||||
endif()
|
endif()
|
||||||
|
@ -271,6 +290,7 @@ if(ENABLE_QT)
|
||||||
find_package(Qt5 REQUIRED COMPONENTS LinguistTools ${QT_PREFIX_HINT})
|
find_package(Qt5 REQUIRED COMPONENTS LinguistTools ${QT_PREFIX_HINT})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the yuzu_find_package
|
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the yuzu_find_package
|
||||||
if (ENABLE_SDL2)
|
if (ENABLE_SDL2)
|
||||||
if (YUZU_USE_BUNDLED_SDL2)
|
if (YUZU_USE_BUNDLED_SDL2)
|
||||||
|
@ -379,7 +399,7 @@ if (CONAN_REQUIRED_LIBS)
|
||||||
if(ENABLE_QT)
|
if(ENABLE_QT)
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CONAN_QT_ROOT_RELEASE}")
|
list(APPEND CMAKE_MODULE_PATH "${CONAN_QT_ROOT_RELEASE}")
|
||||||
list(APPEND CMAKE_PREFIX_PATH "${CONAN_QT_ROOT_RELEASE}")
|
list(APPEND CMAKE_PREFIX_PATH "${CONAN_QT_ROOT_RELEASE}")
|
||||||
find_package(Qt5 5.9 REQUIRED COMPONENTS Widgets)
|
find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets)
|
||||||
if (YUZU_USE_QT_WEB_ENGINE)
|
if (YUZU_USE_QT_WEB_ENGINE)
|
||||||
find_package(Qt5 REQUIRED COMPONENTS WebEngineCore WebEngineWidgets)
|
find_package(Qt5 REQUIRED COMPONENTS WebEngineCore WebEngineWidgets)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -1,14 +1,23 @@
|
||||||
function(copy_yuzu_Qt5_deps target_dir)
|
function(copy_yuzu_Qt5_deps target_dir)
|
||||||
include(WindowsCopyFiles)
|
include(WindowsCopyFiles)
|
||||||
|
if (MSVC)
|
||||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||||
set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin")
|
set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin")
|
||||||
|
else()
|
||||||
|
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/")
|
||||||
|
set(Qt5_DLL_DIR "${Qt5_DIR}/../../../lib/")
|
||||||
|
endif()
|
||||||
set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/")
|
set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/")
|
||||||
|
set(Qt5_PLATFORMTHEMES_DIR "${Qt5_DIR}/../../../plugins/platformthemes/")
|
||||||
|
set(Qt5_PLATFORMINPUTCONTEXTS_DIR "${Qt5_DIR}/../../../plugins/platforminputcontexts/")
|
||||||
|
set(Qt5_XCBGLINTEGRATIONS_DIR "${Qt5_DIR}/../../../plugins/xcbglintegrations/")
|
||||||
set(Qt5_STYLES_DIR "${Qt5_DIR}/../../../plugins/styles/")
|
set(Qt5_STYLES_DIR "${Qt5_DIR}/../../../plugins/styles/")
|
||||||
set(Qt5_IMAGEFORMATS_DIR "${Qt5_DIR}/../../../plugins/imageformats/")
|
set(Qt5_IMAGEFORMATS_DIR "${Qt5_DIR}/../../../plugins/imageformats/")
|
||||||
set(Qt5_RESOURCES_DIR "${Qt5_DIR}/../../../resources/")
|
set(Qt5_RESOURCES_DIR "${Qt5_DIR}/../../../resources/")
|
||||||
set(PLATFORMS ${DLL_DEST}plugins/platforms/)
|
set(PLATFORMS ${DLL_DEST}plugins/platforms/)
|
||||||
set(STYLES ${DLL_DEST}plugins/styles/)
|
set(STYLES ${DLL_DEST}plugins/styles/)
|
||||||
set(IMAGEFORMATS ${DLL_DEST}plugins/imageformats/)
|
set(IMAGEFORMATS ${DLL_DEST}plugins/imageformats/)
|
||||||
|
if (MSVC)
|
||||||
windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST}
|
windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST}
|
||||||
icudt*.dll
|
icudt*.dll
|
||||||
icuin*.dll
|
icuin*.dll
|
||||||
|
@ -47,6 +56,56 @@ function(copy_yuzu_Qt5_deps target_dir)
|
||||||
qjpeg$<$<CONFIG:Debug>:d>.*
|
qjpeg$<$<CONFIG:Debug>:d>.*
|
||||||
qgif$<$<CONFIG:Debug>:d>.*
|
qgif$<$<CONFIG:Debug>:d>.*
|
||||||
)
|
)
|
||||||
|
else()
|
||||||
|
set(Qt5_DLLS
|
||||||
|
"${Qt5_DLL_DIR}libQt5Core.so.5"
|
||||||
|
"${Qt5_DLL_DIR}libQt5DBus.so.5"
|
||||||
|
"${Qt5_DLL_DIR}libQt5Gui.so.5"
|
||||||
|
"${Qt5_DLL_DIR}libQt5Widgets.so.5"
|
||||||
|
"${Qt5_DLL_DIR}libQt5XcbQpa.so.5"
|
||||||
|
"${Qt5_DLL_DIR}libicudata.so.60"
|
||||||
|
"${Qt5_DLL_DIR}libicui18n.so.60"
|
||||||
|
"${Qt5_DLL_DIR}libicuuc.so.60"
|
||||||
|
)
|
||||||
|
set(Qt5_IMAGEFORMAT_DLLS
|
||||||
|
"${Qt5_IMAGEFORMATS_DIR}libqjpeg.so"
|
||||||
|
"${Qt5_IMAGEFORMATS_DIR}libqgif.so"
|
||||||
|
"${Qt5_IMAGEFORMATS_DIR}libqico.so"
|
||||||
|
)
|
||||||
|
set(Qt5_PLATFORMTHEME_DLLS
|
||||||
|
"${Qt5_PLATFORMTHEMES_DIR}libqgtk3.so"
|
||||||
|
"${Qt5_PLATFORMTHEMES_DIR}libqxdgdesktopportal.so"
|
||||||
|
)
|
||||||
|
set(Qt5_PLATFORM_DLLS
|
||||||
|
"${Qt5_PLATFORMS_DIR}libqxcb.so"
|
||||||
|
)
|
||||||
|
set(Qt5_PLATFORMINPUTCONTEXT_DLLS
|
||||||
|
"${Qt5_PLATFORMINPUTCONTEXTS_DIR}libcomposeplatforminputcontextplugin.so"
|
||||||
|
"${Qt5_PLATFORMINPUTCONTEXTS_DIR}libibusplatforminputcontextplugin.so"
|
||||||
|
)
|
||||||
|
set(Qt5_XCBGLINTEGRATION_DLLS
|
||||||
|
"${Qt5_XCBGLINTEGRATIONS_DIR}libqxcb-glx-integration.so"
|
||||||
|
)
|
||||||
|
foreach(LIB ${Qt5_DLLS})
|
||||||
|
file(COPY ${LIB} DESTINATION "${DLL_DEST}/lib" FOLLOW_SYMLINK_CHAIN)
|
||||||
|
endforeach()
|
||||||
|
foreach(LIB ${Qt5_IMAGEFORMAT_DLLS})
|
||||||
|
file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/imageformats/" FOLLOW_SYMLINK_CHAIN)
|
||||||
|
endforeach()
|
||||||
|
foreach(LIB ${Qt5_PLATFORMTHEME_DLLS})
|
||||||
|
file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/platformthemes/" FOLLOW_SYMLINK_CHAIN)
|
||||||
|
endforeach()
|
||||||
|
foreach(LIB ${Qt5_PLATFORM_DLLS})
|
||||||
|
file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/platforms/" FOLLOW_SYMLINK_CHAIN)
|
||||||
|
endforeach()
|
||||||
|
foreach(LIB ${Qt5_PLATFORMINPUTCONTEXT_DLLS})
|
||||||
|
file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/platforminputcontexts/" FOLLOW_SYMLINK_CHAIN)
|
||||||
|
endforeach()
|
||||||
|
foreach(LIB ${Qt5_XCBGLINTEGRATION_DLLS})
|
||||||
|
file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/xcbglintegrations/" FOLLOW_SYMLINK_CHAIN)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
endif()
|
||||||
# Create an empty qt.conf file. Qt will detect that this file exists, and use the folder that its in as the root folder.
|
# Create an empty qt.conf file. Qt will detect that this file exists, and use the folder that its in as the root folder.
|
||||||
# This way it'll look for plugins in the root/plugins/ folder
|
# This way it'll look for plugins in the root/plugins/ folder
|
||||||
add_custom_command(TARGET yuzu POST_BUILD
|
add_custom_command(TARGET yuzu POST_BUILD
|
||||||
|
|
|
@ -4,6 +4,12 @@ set(CMAKE_AUTOUIC ON)
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
|
||||||
|
|
||||||
|
# Set the RPATH for Qt Libraries
|
||||||
|
# This must be done before the `yuzu` target is created
|
||||||
|
if (YUZU_USE_BUNDLED_QT AND (${CMAKE_SYSTEM_NAME} STREQUAL "Linux"))
|
||||||
|
set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/bin/lib/")
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(yuzu
|
add_executable(yuzu
|
||||||
Info.plist
|
Info.plist
|
||||||
about_dialog.cpp
|
about_dialog.cpp
|
||||||
|
@ -278,11 +284,14 @@ if(UNIX AND NOT APPLE)
|
||||||
install(TARGETS yuzu RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
|
install(TARGETS yuzu RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (YUZU_USE_BUNDLED_QT)
|
||||||
include(CopyYuzuQt5Deps)
|
include(CopyYuzuQt5Deps)
|
||||||
|
copy_yuzu_Qt5_deps(yuzu)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
include(CopyYuzuSDLDeps)
|
include(CopyYuzuSDLDeps)
|
||||||
include(CopyYuzuFFmpegDeps)
|
include(CopyYuzuFFmpegDeps)
|
||||||
copy_yuzu_Qt5_deps(yuzu)
|
|
||||||
copy_yuzu_SDL_deps(yuzu)
|
copy_yuzu_SDL_deps(yuzu)
|
||||||
copy_yuzu_FFmpeg_deps(yuzu)
|
copy_yuzu_FFmpeg_deps(yuzu)
|
||||||
endif()
|
endif()
|
||||||
|
|
Loading…
Reference in a new issue