diff --git a/CMakeLists.txt b/CMakeLists.txt index ecb8a8268d..2c379827c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,8 +53,7 @@ endif() # Set bundled sdl2/qt as dependent options. # On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion -option(ENABLE_SDL2 "Enable the SDL2 frontend" ON) -CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF) +CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF) if (PLATFORM_FREEBSD) CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF) @@ -126,7 +125,10 @@ option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF) -option(FORCE_DOWNLOAD_OPENSSL "Forcefully download all bundled OpenSSL builds (useful for CI)" OFF) +if (YUZU_USE_CPM AND ENABLE_SDL2) + option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}") + CMAKE_DEPENDENT_OPTION(FORCE_DOWNLOAD_SDL2 "Forcefully download all bundled SDL2 builds (useful for CI)" OFF "YUZU_USE_BUNDLED_SDL2" OFF) +endif() CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF) @@ -169,6 +171,11 @@ endif() option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) +if (YUZU_USE_CPM AND ENABLE_OPENSSL) + CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON) + CMAKE_DEPENDENT_OPTION(FORCE_DOWNLOAD_OPENSSL "Forcefully download all bundled OpenSSL builds (useful for CI)" OFF "YUZU_USE_BUNDLED_OPENSSL" OFF) +endif() + if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) set(vvl_version "sdk-1.3.261.1") set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip") @@ -398,183 +405,17 @@ if (YUZU_USE_CPM) # openssl funniness if (ENABLE_OPENSSL) - set(SSL_VERSION 3.5.2) - - if ((MSVC AND ARCHITECTURE_x86_64) OR FORCE_DOWNLOAD_OPENSSL) - set(ARTIFACT openssl-windows-amd64-${SSL_VERSION}.tar.zst) - set(KEY windows-amd64) - - if (MSVC AND ARCHITECTURE_x86_64) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-windows-amd64 - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT ${ARTIFACT} - - KEY ${KEY} - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} + if (YUZU_USE_BUNDLED_OPENSSL) + AddCIPackage( + PACKAGE OpenSSL + NAME openssl + REPO crueter-ci/OpenSSL + VERSION 3.5.2 + MIN_VERSION 1.1.1 ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-windows-amd64_SOURCE_DIR}) - endif() - message("OPENSSL ${DOWNLOAD_ONLY} ${OPENSSL_DIR}") - endif() - if ((MSVC AND ARCHITECTURE_arm64) OR FORCE_DOWNLOAD_OPENSSL) - set(ARTIFACT openssl-windows-arm64-${SSL_VERSION}.tar.zst) - set(KEY windows-arm64) - - if (MSVC AND ARCHITECTURE_arm64) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-windows-arm64 - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT ${ARTIFACT} - - KEY ${KEY} - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-windows-arm64_SOURCE_DIR}) - endif() - endif() - - if (ANDROID OR FORCE_DOWNLOAD_OPENSSL) - if (ANDROID) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-android - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-android-${SSL_VERSION}.tar.zst - - KEY android - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-android_SOURCE_DIR}) - endif() - endif() - - if(PLATFORM_SUN OR FORCE_DOWNLOAD_OPENSSL) - if (PLATFORM_SUN) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-solaris - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-solaris-${SSL_VERSION}.tar.zst - - KEY solaris - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-solaris_SOURCE_DIR}) - endif() - endif() - - if(PLATFORM_FREEBSD OR FORCE_DOWNLOAD_OPENSSL) - if (PLATFORM_FREEBSD) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-freebsd - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-freebsd-${SSL_VERSION}.tar.zst - - KEY freebsd - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-freebsd_SOURCE_DIR}) - endif() - endif() - - if(PLATFORM_LINUX OR FORCE_DOWNLOAD_OPENSSL) - if (PLATFORM_LINUX) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-linux - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-linux-${SSL_VERSION}.tar.zst - - KEY linux - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-linux_SOURCE_DIR}) - endif() - endif() - - if (DEFINED OPENSSL_DIR) - include(${OPENSSL_DIR}/openssl.cmake) - - # Overrides find package - CPMAddPackage( - NAME OpenSSL - SOURCE_DIR ${OPENSSL_DIR} - ) - else() - find_package(OpenSSL 1.1.1 REQUIRED) - endif() + find_package(OpenSSL 1.1.1 REQUIRED) endif() # boost @@ -837,30 +678,19 @@ endif() # TODO(crueter): combine this all with CPM. if (ENABLE_SDL2) if (YUZU_USE_BUNDLED_SDL2) - # Detect toolchain and platform - if ((MSVC_VERSION GREATER_EQUAL 1920) AND ARCHITECTURE_x86_64) - set(SDL2_VER "SDL2-2.32.8") - else() - message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own.") - endif() - - if (DEFINED SDL2_VER) - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX 2.32.8) - endif() - - set(SDL2_FOUND YES) - set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers") - set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library") - set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll") - - add_library(SDL2::SDL2 INTERFACE IMPORTED) - target_link_libraries(SDL2::SDL2 INTERFACE "${SDL2_LIBRARY}") - target_include_directories(SDL2::SDL2 INTERFACE "${SDL2_INCLUDE_DIR}") + AddCIPackage( + PACKAGE SDL2 + NAME SDL2 + REPO crueter-ci/SDL2 + VERSION 2.32.8 + MIN_VERSION 2.26.4 + DISABLED_PLATFORMS "solaris" + CMAKE_FILENAME sdl2 + ) elseif (YUZU_USE_EXTERNAL_SDL2) message(STATUS "Using SDL2 from externals.") - else() - find_package(SDL2 2.26.4 REQUIRED) endif() + find_package(SDL2 2.26.4 REQUIRED) endif() # List of all FFmpeg components required @@ -903,7 +733,7 @@ if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER) find_package(cpp-jwt) endif() -if (NOT YUZU_USE_BUNDLED_SDL2) +if (ENABLE_SDL2) find_package(SDL2) endif() diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index 07393d6ccd..8122d59b92 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -252,3 +252,128 @@ function(AddPackage) PARENT_SCOPE) endfunction() + +function(add_ci_package key) + set(ARTIFACT ${ARTIFACT_NAME}-${key}-${ARTIFACT_VERSION}.${ARTIFACT_EXT}) + + AddPackage( + NAME ${ARTIFACT_PACKAGE}-${key} + REPO ${ARTIFACT_REPO} + TAG v${ARTIFACT_VERSION} + VERSION ${ARTIFACT_VERSION} + ARTIFACT ${ARTIFACT} + + KEY ${key} + HASH_SUFFIX sha512sum + BUNDLED_PACKAGE ON + DOWNLOAD_ONLY ${ARTIFACT_FORCE_DOWNLOAD} + ) + + if (NOT ARTIFACT_FORCE_DOWNLOAD) + set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}-${key}_SOURCE_DIR} PARENT_SCOPE) + endif() +endfunction() + +# TODO(crueter): doc +function(AddCIPackage) + set(oneValueArgs + VERSION + NAME + REPO + PACKAGE + EXTENSION + FORCE_DOWNLOAD + MIN_VERSION + DISABLED_PLATFORMS + CMAKE_FILENAME + ) + + cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN}) + + if(NOT DEFINED PKG_ARGS_VERSION) + message(FATAL_ERROR "[CPMUtil] VERSION is required") + endif() + if(NOT DEFINED PKG_ARGS_NAME) + message(FATAL_ERROR "[CPMUtil] NAME is required") + endif() + if(NOT DEFINED PKG_ARGS_REPO) + message(FATAL_ERROR "[CPMUtil] REPO is required") + endif() + if(NOT DEFINED PKG_ARGS_PACKAGE) + message(FATAL_ERROR "[CPMUtil] PACKAGE is required") + endif() + + if (NOT DEFINED PKG_ARGS_CMAKE_FILENAME) + set(ARTIFACT_CMAKE ${PKG_ARGS_NAME}) + else() + set(ARTIFACT_CMAKE ${PKG_ARGS_CMAKE_FILENAME}) + endif() + + if(NOT DEFINED PKG_ARGS_EXTENSION) + set(ARTIFACT_EXT "tar.zst") + else() + set(ARTIFACT_EXT ${PKG_ARGS_EXTENSION}) + endif() + + if(NOT DEFINED PKG_ARGS_FORCE_DOWNLOAD) + set(ARTIFACT_FORCE_DOWNLOAD OFF) + else() + set(ARTIFACT_FORCE_DOWNLOAD ${PKG_ARGS_FORCE_DOWNLOAD}) + endif() + + if (DEFINED PKG_ARGS_MIN_VERSION) + set(ARTIFACT_MIN_VERSION ${PKG_ARGS_MIN_VERSION}) + endif() + + if (DEFINED PKG_ARGS_DISABLED_PLATFORMS) + set(DISABLED_PLATFORMS ${PKG_ARGS_DISABLED_PLATFORMS}) + endif() + + # this is mildly annoying + set(ARTIFACT_VERSION ${PKG_ARGS_VERSION}) + set(ARTIFACT_NAME ${PKG_ARGS_NAME}) + set(ARTIFACT_REPO ${PKG_ARGS_REPO}) + set(ARTIFACT_PACKAGE ${PKG_ARGS_PACKAGE}) + + if ((MSVC AND ARCHITECTURE_x86_64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "windows-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(windows-amd64) + endif() + + if ((MSVC AND ARCHITECTURE_arm64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "windows-arm64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(windows-arm64) + endif() + + if (ANDROID OR ARTIFACT_FORCE_DOWNLOAD AND NOT "android" IN_LIST DISABLED_PLATFORMS) + add_ci_package(android) + endif() + + if(PLATFORM_SUN OR ARTIFACT_FORCE_DOWNLOAD AND NOT "solaris" IN_LIST DISABLED_PLATFORMS) + add_ci_package(solaris) + endif() + + if(PLATFORM_FREEBSD OR ARTIFACT_FORCE_DOWNLOAD AND NOT "freebsd" IN_LIST DISABLED_PLATFORMS) + add_ci_package(freebsd) + endif() + + if(PLATFORM_LINUX OR ARTIFACT_FORCE_DOWNLOAD AND NOT "linux" IN_LIST DISABLED_PLATFORMS) + add_ci_package(linux) + endif() + + if (DEFINED ARTIFACT_DIR) + include(${ARTIFACT_DIR}/${ARTIFACT_NAME}.cmake) + + # Overrides find package + CPMAddPackage( + NAME ${ARTIFACT_PACKAGE} + SOURCE_DIR ${ARTIFACT_DIR} + ) + + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${ARTIFACT_NAME}) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/${ARTIFACT_REPO}") + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${ARTIFACT_VERSION}) + + set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE) + else() + find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED) + endif() +endfunction() diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 3651781f93..642d7d0df1 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -49,9 +49,6 @@ function(download_win_archives) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1) - # TODO(crueter): separate handling for arm64 - set(SDL2_VER "SDL2-2.32.8") - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8) set(FORCE_WIN_ARCHIVES OFF) endfunction()