diff --git a/.ci/ios/build.sh b/.ci/ios/build.sh index 9ab6cfaaa3..fa850f3931 100755 --- a/.ci/ios/build.sh +++ b/.ci/ios/build.sh @@ -11,6 +11,7 @@ export IOS_SDK="$(xcrun --sdk iphoneos --show-sdk-path)" cmake -G Xcode -B build \ -DCMAKE_TOOLCHAIN_FILE="$WORK_DIR/.ci/ios/ios-toolchain.cmake" \ -DPLATFORM=OS64 \ + -DARCHS="arm64" \ -DDEPLOYMENT_TARGET=16.0 \ -DCOCOA_LIBRARY="$IOS_SDK/System/Library/Frameworks/Cocoa.framework" \ -DCMAKE_C_COMPILER="$(xcrun --sdk iphoneos clang -arch arm64)" \ @@ -19,6 +20,9 @@ cmake -G Xcode -B build \ -DENABLE_UPDATE_CHECKER=OFF \ -DENABLE_QT=OFF \ -DENABLE_OPENSSL=OFF \ + -DHTTPLIB_USE_OPENSSL=OFF \ + -DCPPHTTPLIB_USE_OPENSSL=OFF \ + -DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=OFF \ -DENABLE_WEB_SERVICE=OFF \ -DENABLE_CUBEB=OFF \ -DYUZU_ROOM=OFF \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 452c0dbcb2..c9e9f985dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,3 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - cmake_minimum_required(VERSION 3.22) project(yuzu) @@ -359,7 +356,10 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) -find_package(RenderDoc MODULE) +find_package(RenderDoc MODULE QUIET) +if (NOT RenderDoc_FOUND) + message(WARNING "RenderDoc not found. Some debugging features may be disabled.") +endif() # openssl funniness if (YUZU_USE_BUNDLED_OPENSSL) @@ -370,7 +370,35 @@ if (YUZU_USE_BUNDLED_OPENSSL) endif() endif() -find_package(OpenSSL 3 REQUIRED) +if (IOS) + # TODO: this is horrific wtf + # Modify OpenSSL configuration to dynamically locate OpenSSL + if (NOT OPENSSL_ROOT_DIR) + find_program(HOMEBREW_EXECUTABLE brew) + if (HOMEBREW_EXECUTABLE) + execute_process( + COMMAND ${HOMEBREW_EXECUTABLE} --prefix openssl + OUTPUT_VARIABLE HOMEBREW_OPENSSL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(OPENSSL_ROOT_DIR "${HOMEBREW_OPENSSL_PREFIX}") + endif() + endif() + # Adjust OpenSSL find_package to fallback to default paths + find_package(OpenSSL 3 QUIET PATHS ${OPENSSL_ROOT_DIR} PATHS /usr/local/opt/openssl /opt/homebrew/opt/openssl NO_DEFAULT_PATH) + if (NOT OpenSSL_FOUND) + find_package(OpenSSL 3 QUIET) + if (NOT OpenSSL_FOUND) + message(WARNING "OpenSSL not found. Some features may be disabled.") + endif() + endif() + # Ensure OpenSSL version 3 is correctly located + set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl@3") + set(OPENSSL_LIBRARIES "/opt/homebrew/opt/openssl@3/lib") + set(OPENSSL_INCLUDE_DIR "/opt/homebrew/opt/openssl@3/include") +else() + find_package(OpenSSL 3 REQUIRED) +endif() message(STATUS "Fetching needed dependencies with CPM") diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 7bcbe737b6..2588624d4c 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -116,18 +116,119 @@ std::string ReplaceAll(std::string result, const std::string& src, const std::st } std::string UTF16ToUTF8(std::u16string_view input) { - std::wstring_convert, char16_t> convert; - return convert.to_bytes(input.data(), input.data() + input.size()); + std::string result; + result.reserve(input.size()); + for (size_t i = 0; i < input.size(); ++i) { + uint32_t codepoint = input[i]; + // Handle surrogate pairs + if (codepoint >= 0xD800 && codepoint <= 0xDBFF) { + if (i + 1 < input.size()) { + uint32_t low = input[i + 1]; + if (low >= 0xDC00 && low <= 0xDFFF) { + codepoint = ((codepoint - 0xD800) << 10) + (low - 0xDC00) + 0x10000; + ++i; + } + } + } + if (codepoint <= 0x7F) { + result.push_back(static_cast(codepoint)); + } else if (codepoint <= 0x7FF) { + result.push_back(static_cast(0xC0 | (codepoint >> 6))); + result.push_back(static_cast(0x80 | (codepoint & 0x3F))); + } else if (codepoint <= 0xFFFF) { + result.push_back(static_cast(0xE0 | (codepoint >> 12))); + result.push_back(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + result.push_back(static_cast(0x80 | (codepoint & 0x3F))); + } else { + result.push_back(static_cast(0xF0 | (codepoint >> 18))); + result.push_back(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + result.push_back(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + result.push_back(static_cast(0x80 | (codepoint & 0x3F))); + } + } + return result; } std::u16string UTF8ToUTF16(std::string_view input) { - std::wstring_convert, char16_t> convert; - return convert.from_bytes(input.data(), input.data() + input.size()); + std::u16string result; + size_t i = 0; + while (i < input.size()) { + uint32_t codepoint = 0; + unsigned char c = input[i]; + size_t extra = 0; + if ((c & 0x80) == 0) { + codepoint = c; + extra = 0; + } else if ((c & 0xE0) == 0xC0) { + codepoint = c & 0x1F; + extra = 1; + } else if ((c & 0xF0) == 0xE0) { + codepoint = c & 0x0F; + extra = 2; + } else if ((c & 0xF8) == 0xF0) { + codepoint = c & 0x07; + extra = 3; + } else { + // Invalid UTF-8 + ++i; + continue; + } + if (i + extra >= input.size()) break; + for (size_t j = 1; j <= extra; ++j) { + if ((input[i + j] & 0xC0) != 0x80) { + codepoint = 0xFFFD; + break; + } + codepoint = (codepoint << 6) | (input[i + j] & 0x3F); + } + if (codepoint <= 0xFFFF) { + result.push_back(static_cast(codepoint)); + } else { + codepoint -= 0x10000; + result.push_back(static_cast(0xD800 + (codepoint >> 10))); + result.push_back(static_cast(0xDC00 + (codepoint & 0x3FF))); + } + i += extra + 1; + } + return result; } std::u32string UTF8ToUTF32(std::string_view input) { - std::wstring_convert, char32_t> convert; - return convert.from_bytes(input.data(), input.data() + input.size()); + std::u32string result; + size_t i = 0; + while (i < input.size()) { + uint32_t codepoint = 0; + unsigned char c = input[i]; + size_t extra = 0; + if ((c & 0x80) == 0) { + codepoint = c; + extra = 0; + } else if ((c & 0xE0) == 0xC0) { + codepoint = c & 0x1F; + extra = 1; + } else if ((c & 0xF0) == 0xE0) { + codepoint = c & 0x0F; + extra = 2; + } else if ((c & 0xF8) == 0xF0) { + codepoint = c & 0x07; + extra = 3; + } else { + // Invalid UTF-8 + ++i; + continue; + } + if (i + extra >= input.size()) break; + for (size_t j = 1; j <= extra; ++j) { + if ((input[i + j] & 0xC0) != 0x80) { + codepoint = 0xFFFD; + break; + } + codepoint = (codepoint << 6) | (input[i + j] & 0x3F); + } + result.push_back(codepoint); + i += extra + 1; + } + return result; } #ifdef _WIN32 diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 2a651209a9..dc27ba317d 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1273,7 +1273,9 @@ endif() target_sources(core PRIVATE hle/service/ssl/ssl_backend_openssl.cpp) target_link_libraries(core PRIVATE OpenSSL::SSL OpenSSL::Crypto) -target_compile_definitions(core PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) +if (NOT IOS) + target_compile_definitions(core PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) +endif() # TODO diff --git a/src/core/hle/service/bcat/news/builtin_news.cpp b/src/core/hle/service/bcat/news/builtin_news.cpp index ed001b056b..f7cc6c5a23 100644 --- a/src/core/hle/service/bcat/news/builtin_news.cpp +++ b/src/core/hle/service/bcat/news/builtin_news.cpp @@ -37,7 +37,7 @@ namespace Service::News { namespace { -constexpr const char* GitHubAPI_EdenReleases = "/repos/eden-emulator/Releases/releases"; +[[maybe_unused]] constexpr const char* GitHubAPI_EdenReleases = "/repos/eden-emulator/Releases/releases"; // Cached logo data std::vector default_logo_small; diff --git a/src/frontend_common/CMakeLists.txt b/src/frontend_common/CMakeLists.txt index a6d580cb18..b1554d7dba 100644 --- a/src/frontend_common/CMakeLists.txt +++ b/src/frontend_common/CMakeLists.txt @@ -22,9 +22,10 @@ if (ENABLE_UPDATE_CHECKER) target_sources(frontend_common PRIVATE update_checker.cpp update_checker.h) - - target_compile_definitions(frontend_common PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT) target_link_libraries(frontend_common PRIVATE OpenSSL::SSL OpenSSL::Crypto) + if (NOT IOS) + target_compile_definitions(frontend_common PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT) + endif() endif() create_target_directory_groups(frontend_common) diff --git a/src/ios/CMakeLists.txt b/src/ios/CMakeLists.txt index dc2f8b53fc..8d91aa9590 100644 --- a/src/ios/CMakeLists.txt +++ b/src/ios/CMakeLists.txt @@ -18,6 +18,10 @@ add_executable(eden-ios EmulationWindow.mm ) +# Keep identifier as-is, for compatibility sake +set_property(TARGET eden-ios PROPERTY XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.yuzu-emu.yuzu") +set_property(TARGET eden-ios PROPERTY XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "YUZU1234") + target_link_libraries(eden-ios PRIVATE common core input_common frontend_common video_core glad) target_link_libraries(eden-ios PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) target_link_libraries(eden-ios PRIVATE SDL2::SDL2) diff --git a/src/qt_common/CMakeLists.txt b/src/qt_common/CMakeLists.txt index 904b03d288..f7614c506a 100644 --- a/src/qt_common/CMakeLists.txt +++ b/src/qt_common/CMakeLists.txt @@ -50,7 +50,9 @@ if (USE_DISCORD_PRESENCE) if (YUZU_USE_BUNDLED_OPENSSL) target_link_libraries(qt_common PUBLIC OpenSSL::SSL OpenSSL::Crypto) - target_compile_definitions(qt_common PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) + if (NOT IOS) + target_compile_definitions(qt_common PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) + endif() endif() target_compile_definitions(qt_common PUBLIC USE_DISCORD_PRESENCE) diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt index 0dedad16f7..957b935f37 100644 --- a/src/web_service/CMakeLists.txt +++ b/src/web_service/CMakeLists.txt @@ -17,6 +17,27 @@ 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) -target_compile_definitions(web_service PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) +if (IOS) + # TODO: this is horrific + find_package(OpenSSL 3 QUIET) + if (OpenSSL_FOUND) + target_link_libraries(web_service PRIVATE OpenSSL::SSL OpenSSL::Crypto) + if (NOT IOS) + target_compile_definitions(web_service PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) + endif() + else() + find_package(OpenSSL 3 QUIET PATHS /usr/local/opt/openssl /opt/homebrew/opt/openssl NO_DEFAULT_PATH) + if (OpenSSL_FOUND) + target_link_libraries(web_service PRIVATE OpenSSL::SSL OpenSSL::Crypto) + if (NOT IOS) + target_compile_definitions(web_service PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) + endif() + else() + message(WARNING "OpenSSL not found or version is less than 3. Some features in web_service may be disabled.") + endif() + endif() +else() + find_package(OpenSSL REQUIRED) + target_link_libraries(web_service PRIVATE OpenSSL::SSL OpenSSL::Crypto) + target_compile_definitions(web_service PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT) +endif() diff --git a/src/yuzu/user_data_migration.h b/src/yuzu/user_data_migration.h index df8057eaa5..3b404a1a14 100644 --- a/src/yuzu/user_data_migration.h +++ b/src/yuzu/user_data_migration.h @@ -8,7 +8,7 @@ #pragma once #include -#include "../yuzu/migration_worker.h" +#include "yuzu/migration_worker.h" // TODO(crueter): Quick implementation class UserDataMigrator {