From e0d992cf1a9fd649c72d0727fa471a9bfba28451 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 20 May 2026 18:30:15 +0000 Subject: [PATCH] [externals] allow OpenSSL to be built Signed-off-by: lizzie --- CMakeLists.txt | 22 +++---- cpmfile.json | 8 +++ externals/openssl/CMakeLists.txt | 102 +++++++++++++++++++++++++++++++ src/common/CMakeLists.txt | 8 +-- src/video_core/CMakeLists.txt | 2 - src/web_service/CMakeLists.txt | 2 - 6 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 externals/openssl/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f84dd539c..c70318a076 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,10 @@ if (YUZU_STATIC_ROOM) set(fmt_FORCE_BUNDLED ON) endif() +if (YUZU_USE_EXTERNAL_OPENSSL) + set(httplib_FORCE_BUNDLED ON) +endif() + # qt stuff option(ENABLE_QT "Enable the Qt frontend" ON) option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) @@ -207,6 +211,10 @@ endif() option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT}) cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF) +# openssl +option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL" ON) +option(YUZU_USE_EXTERNAL_OPENSSL "Build OpenSSL from external source" OFF) + # sirit set(BUNDLED_SIRIT_DEFAULT OFF) if (MSVC AND NOT (CMAKE_BUILD_TYPE MATCHES "Deb") OR ANDROID) @@ -378,17 +386,6 @@ find_package(Threads REQUIRED) find_package(RenderDoc MODULE) -# openssl funniness -if (YUZU_USE_BUNDLED_OPENSSL) - set(BUILD_SHARED_LIBS OFF) - AddJsonPackage(openssl) - if (OpenSSL_ADDED) - add_compile_definitions(YUZU_BUNDLED_OPENSSL) - endif() -endif() - -find_package(OpenSSL 3 REQUIRED) - message(STATUS "Fetching needed dependencies with CPM") set(BUILD_SHARED_LIBS OFF) @@ -424,6 +421,9 @@ if (Boost_ADDED) endif() endif() +# OpenSSL +add_subdirectory(externals/openssl) + # fmt AddJsonPackage(fmt) diff --git a/cpmfile.json b/cpmfile.json index ead839de2e..eb4f94ebed 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -1,5 +1,13 @@ { "openssl": { + "package": "OpenSSL", + "name": "openssl", + "repo": "openssl/openssl", + "tag": "openssl-%VERSION%", + "version": "4.0.0", + "git_version": "4.0.0" + }, + "openssl-ci": { "ci": true, "package": "OpenSSL", "name": "openssl", diff --git a/externals/openssl/CMakeLists.txt b/externals/openssl/CMakeLists.txt new file mode 100644 index 0000000000..e5325862dd --- /dev/null +++ b/externals/openssl/CMakeLists.txt @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +if (YUZU_USE_BUNDLED_OPENSSL) + set(BUILD_SHARED_LIBS OFF) + AddJsonPackage(openssl-ci) + if (OpenSSL_ADDED) + add_compile_definitions(YUZU_BUNDLED_OPENSSL) + endif() + # openssl funniness + find_package(OpenSSL 3 COMPONENTS SSL Crypto REQUIRED) +else() + message(STATUS "Using OpenSSL from externals") + AddJsonPackage(openssl) + set(OpenSSL_PREFIX ${OpenSSL_SOURCE_DIR}) + set(OpenSSL_BUILD_DIR ${OpenSSL_BINARY_DIR}) + set(OpenSSL_MAKEFILE ${OpenSSL_BUILD_DIR}/Makefile) + set(OpenSSL_BUILD_LIBRARIES "") + list(APPEND OpenSSL_BUILD_LIBRARIES + "${OpenSSL_BUILD_DIR}/libssl.a" + "${OpenSSL_BUILD_DIR}/libcrypto.a") + + make_directory(${OpenSSL_BUILD_DIR}) + + # The ABSOLUTE best language, hands down, better than bash by a MILE + find_program(PERL_PROGRAM perl) + add_custom_command( + OUTPUT + ${OpenSSL_MAKEFILE} + COMMAND + ${PERL_PROGRAM} ${OpenSSL_PREFIX}/Configure + shared + no-makedepend + --release + threads + no-tests + no-docs + enable-camellia + enable-ec + enable-ec2m + enable-sm2 + enable-srp + enable-idea + enable-mdc2 + enable-rc5 + enable-rfc3779 + enable-asm + enable-quic + enable-fips + WORKING_DIRECTORY + ${OpenSSL_BUILD_DIR} + ) + + # Workaround for Ubuntu 18.04's older version of make not being able to call make as a child + # with context of the jobserver. Also helps ninja users. + execute_process(COMMAND nproc OUTPUT_VARIABLE SYSTEM_THREADS) + # BSD make or Solaris make don't support ffmpeg make-j8 + set(OpenSSL_MAKE_ARGS "") + if (PLATFORM_LINUX OR ANDROID OR APPLE OR WIN32 OR PLATFORM_FREEBSD) + set(OpenSSL_MAKE_ARGS -j${SYSTEM_THREADS}) + endif() + + add_custom_command( + OUTPUT + ${OpenSSL_BUILD_LIBRARIES} + COMMAND + gmake ${OpenSSL_MAKE_ARGS} + WORKING_DIRECTORY + ${OpenSSL_BUILD_DIR} + ) + add_custom_target(openssl-configure ALL DEPENDS ${OpenSSL_MAKEFILE}) + add_custom_target(openssl-build ALL DEPENDS ${OpenSSL_BUILD_LIBRARIES} openssl-configure) + + add_library(SSL INTERFACE) + target_include_directories(SSL INTERFACE ${OpenSSL_SOURCE_DIR}/include) + target_link_libraries(SSL INTERFACE openssl-build) + + add_library(Crypto INTERFACE) + target_include_directories(Crypto INTERFACE ${OpenSSL_SOURCE_DIR}/include) + target_link_libraries(Crypto INTERFACE openssl-build) + + add_library(OpenSSL::SSL ALIAS SSL) + add_library(OpenSSL::Crypto ALIAS Crypto) + + # evil haxx for httplib https://cmake.org/cmake/help/latest/module/FindOpenSSL.html + # fuck httplib + set(OpenSSL_FOUND TRUE PARENT_SCOPE) + set(OpenSSL_VERSION "4.0.0" PARENT_SCOPE) + # Deprecated but some people run older cmake + set(OPENSSL_FOUND TRUE PARENT_SCOPE) + set(OPENSSL_VERSION "4.0.0" PARENT_SCOPE) + + set(OPENSSL_INCLUDE_DIR ${OpenSSL_SOURCE_DIR}/include PARENT_SCOPE) + set(OPENSSL_CRYPTO_LIBRARY ${OpenSSL_BUILD_DIR}/libcrypto.a PARENT_SCOPE) + set(OPENSSL_CRYPTO_LIBRARIES ${OpenSSL_BUILD_DIR}/libcrypto.a PARENT_SCOPE) + set(OPENSSL_SSL_LIBRARY ${OpenSSL_BUILD_DIR}/libssl.a PARENT_SCOPE) + set(OPENSSL_SSL_LIBRARIES ${OpenSSL_BUILD_DIR}/libssl.a PARENT_SCOPE) + set(OPENSSL_LIBRARIES "${OpenSSL_BUILD_DIR}/libssl.a;${OpenSSL_BUILD_DIR}/libcrypto.a" PARENT_SCOPE) + + set(OPENSSL_ROOT_DIR ${OpenSSL_BUILD_DIR} PARENT_SCOPE) + set(OPENSSL_USE_STATIC_LIBS TRUE PARENT_SCOPE) +endif() diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index c5740bfb83..261709e5de 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -150,13 +150,13 @@ add_library( httplib.h net/net.h net/net.cpp) +# httplib must be put first otherwise external-openssl builds won't work +target_link_libraries(common PRIVATE httplib::httplib) if(WIN32) target_sources(common PRIVATE windows/timer_resolution.cpp windows/timer_resolution.h) target_link_libraries(common PRIVATE ntdll) -endif() - -if(NOT WIN32) +else() target_sources(common PRIVATE signal_chain.cpp signal_chain.h) endif() @@ -239,7 +239,7 @@ else() target_link_libraries(common PUBLIC Boost::headers) endif() -target_link_libraries(common PUBLIC Boost::filesystem Boost::context httplib::httplib nlohmann_json::nlohmann_json) +target_link_libraries(common PUBLIC Boost::filesystem Boost::context nlohmann_json::nlohmann_json) if (lz4_ADDED) target_include_directories(common PRIVATE ${lz4_SOURCE_DIR}/lib) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index be53b71393..ef54ad60c2 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -331,9 +331,7 @@ endif() if (YUZU_USE_EXTERNAL_FFMPEG) add_dependencies(video_core ffmpeg-build) endif() - target_include_directories(video_core PRIVATE ${FFmpeg_INCLUDE_DIR}) - target_link_libraries(video_core PRIVATE ${FFmpeg_LIBRARIES}) target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS}) diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt index d4debb3c09..4e11139f6d 100644 --- a/src/web_service/CMakeLists.txt +++ b/src/web_service/CMakeLists.txt @@ -19,6 +19,4 @@ add_library(web_service STATIC create_target_directory_groups(web_service) target_include_directories(web_service PUBLIC ${cpp-jwt_SOURCE_DIR}/include) target_link_libraries(web_service PRIVATE common network nlohmann_json::nlohmann_json httplib::httplib cpp-jwt::cpp-jwt) - -find_package(OpenSSL REQUIRED) target_link_libraries(web_service PRIVATE OpenSSL::SSL OpenSSL::Crypto)