Browse Source

bit of cmake fuckery

lizzie/ios-port-sud
lizzie 20 hours ago
parent
commit
af39eddfa2
  1. 4
      .ci/ios/build.sh
  2. 38
      CMakeLists.txt
  3. 113
      src/common/string_util.cpp
  4. 4
      src/core/CMakeLists.txt
  5. 2
      src/core/hle/service/bcat/news/builtin_news.cpp
  6. 5
      src/frontend_common/CMakeLists.txt
  7. 4
      src/ios/CMakeLists.txt
  8. 4
      src/qt_common/CMakeLists.txt
  9. 27
      src/web_service/CMakeLists.txt
  10. 2
      src/yuzu/user_data_migration.h

4
.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 \

38
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")

113
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<std::codecvt_utf8_utf16<char16_t>, 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<char>(codepoint));
} else if (codepoint <= 0x7FF) {
result.push_back(static_cast<char>(0xC0 | (codepoint >> 6)));
result.push_back(static_cast<char>(0x80 | (codepoint & 0x3F)));
} else if (codepoint <= 0xFFFF) {
result.push_back(static_cast<char>(0xE0 | (codepoint >> 12)));
result.push_back(static_cast<char>(0x80 | ((codepoint >> 6) & 0x3F)));
result.push_back(static_cast<char>(0x80 | (codepoint & 0x3F)));
} else {
result.push_back(static_cast<char>(0xF0 | (codepoint >> 18)));
result.push_back(static_cast<char>(0x80 | ((codepoint >> 12) & 0x3F)));
result.push_back(static_cast<char>(0x80 | ((codepoint >> 6) & 0x3F)));
result.push_back(static_cast<char>(0x80 | (codepoint & 0x3F)));
}
}
return result;
}
std::u16string UTF8ToUTF16(std::string_view input) {
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, 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<char16_t>(codepoint));
} else {
codepoint -= 0x10000;
result.push_back(static_cast<char16_t>(0xD800 + (codepoint >> 10)));
result.push_back(static_cast<char16_t>(0xDC00 + (codepoint & 0x3FF)));
}
i += extra + 1;
}
return result;
}
std::u32string UTF8ToUTF32(std::string_view input) {
std::wstring_convert<std::codecvt_utf8<char32_t>, 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

4
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

2
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<u8> default_logo_small;

5
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)

4
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)

4
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)

27
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()

2
src/yuzu/user_data_migration.h

@ -8,7 +8,7 @@
#pragma once
#include <QMainWindow>
#include "../yuzu/migration_worker.h"
#include "yuzu/migration_worker.h"
// TODO(crueter): Quick implementation
class UserDataMigrator {

Loading…
Cancel
Save