From 744c3dd0e1a3740c2c807fede1644b19122e546d Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 19:38:33 +0100 Subject: [PATCH 1/5] externals: Don't fall back to bundled OpenSSL if USE_SYSTEM_OPENSSL is enabled --- externals/CMakeLists.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index a0e75c2ac..046e484fe 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -327,12 +327,8 @@ endif() # OpenSSL if (USE_SYSTEM_OPENSSL) find_package(OpenSSL 1.1) - if (OPENSSL_FOUND) - set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) - endif() -endif() - -if (NOT OPENSSL_FOUND) + set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) +else() # LibreSSL set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "") set(OPENSSLDIR "/etc/ssl/") From 2fc4eadd75d8ee3658f28f9cbec6bfc6b40f5d55 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 19:50:00 +0100 Subject: [PATCH 2/5] tests: Don't run catch_discover_tests when cross-compiling to a different OS --- src/tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 027609c26..cf99e004d 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -36,7 +36,7 @@ if (ENABLE_LIBRETRO) endif() add_test(NAME tests COMMAND tests) -if(NOT ANDROID) +if(NOT ANDROID AND (CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME)) catch_discover_tests(tests) endif() From 39c49a43169fc60d8b700f6efa0b474709e061c2 Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 20:42:59 +0100 Subject: [PATCH 3/5] For Linux --> Windows cross-compilation, copy all cross-compiled DLLs during build As per the comment, this is just to get the build functioning pending a real solution --- src/citra_meta/CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/citra_meta/CMakeLists.txt b/src/citra_meta/CMakeLists.txt index b19238a9c..fc589f5f1 100644 --- a/src/citra_meta/CMakeLists.txt +++ b/src/citra_meta/CMakeLists.txt @@ -48,6 +48,22 @@ if (APPLE) endif() endif() +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32 AND MINGW) + # TODO: This is placeholder bullshit, we need to find out a way to do actual dependency resolution. + # Can we use Wine maybe? -OS + set(EXTRA_LIBS /mxe/usr/x86_64-w64-mingw32.shared/bin/*.dll ) + add_custom_command(TARGET citra_meta POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ ${EXTRA_LIBS} $ + COMMAND ${CMAKE_COMMAND} -E make_directory "$/plugins/" + COMMAND ${CMAKE_COMMAND} -E copy_directory /mxe/usr/x86_64-w64-mingw32.shared/qt6/plugins/ "$/plugins/" + COMMAND_EXPAND_LISTS + ) + add_custom_command(TARGET citra_meta POST_BUILD + COMMAND_EXPAND_LISTS + ) + unset(EXTRA_LIBS) +endif() + target_link_libraries(citra_meta PRIVATE citra_common fmt) if (ENABLE_QT) From 9c862f6f28ee30c1b7c13268100c7f0c3fab53bb Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Wed, 15 Apr 2026 20:48:07 +0100 Subject: [PATCH 4/5] cmake: Explicitly disable BUILD_SHARED_LIBS --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d58cc70d..3f54584bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,9 @@ cmake_policy(SET CMP0063 NEW) cmake_policy(SET CMP0127 NEW) set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) +# Prefer building bundled dependencies as static instead of shared +set(BUILD_SHARED_LIBS OFF) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules") include(DownloadExternals) From 089b5837406f04d5db52d6eb7ffe1e392df9e26f Mon Sep 17 00:00:00 2001 From: OpenSauce04 Date: Mon, 20 Apr 2026 23:24:46 +0100 Subject: [PATCH 5/5] Implement proper DLL resolution for MXE builds --- .gitmodules | 3 +++ externals/dllwalker | 1 + src/citra_meta/CMakeLists.txt | 20 ++++++++++++-------- 3 files changed, 16 insertions(+), 8 deletions(-) create mode 160000 externals/dllwalker diff --git a/.gitmodules b/.gitmodules index e2460ab15..d09df6f0d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -106,3 +106,6 @@ [submodule "externals/libretro-common"] path = externals/libretro-common/libretro-common url = https://github.com/libretro/libretro-common.git +[submodule "dllwalker"] + path = externals/dllwalker + url = https://github.com/azahar-emu/dllwalker diff --git a/externals/dllwalker b/externals/dllwalker new file mode 160000 index 000000000..0c35d5de5 --- /dev/null +++ b/externals/dllwalker @@ -0,0 +1 @@ +Subproject commit 0c35d5de533eb82480dce2a211112517f69010d4 diff --git a/src/citra_meta/CMakeLists.txt b/src/citra_meta/CMakeLists.txt index fc589f5f1..baffd0639 100644 --- a/src/citra_meta/CMakeLists.txt +++ b/src/citra_meta/CMakeLists.txt @@ -49,19 +49,23 @@ if (APPLE) endif() if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND WIN32 AND MINGW) - # TODO: This is placeholder bullshit, we need to find out a way to do actual dependency resolution. - # Can we use Wine maybe? -OS - set(EXTRA_LIBS /mxe/usr/x86_64-w64-mingw32.shared/bin/*.dll ) + # TODO: Do this for all executables, not just citra_meta + # TODO: Don't hardcode MXE directory to root? + set(dllwalker_command "${CMAKE_SOURCE_DIR}/externals/dllwalker/dllwalker.rb" + $ + /mxe/usr/x86_64-w64-mingw32.shared/bin/ + /mxe/usr/x86_64-w64-mingw32.shared/qt6/bin/) + set(dll_list_filename "${CMAKE_CURRENT_BINARY_DIR}/required_dlls_list.txt") add_custom_command(TARGET citra_meta POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy $ ${EXTRA_LIBS} $ + COMMAND ${dllwalker_command} > ${dll_list_filename} + ) + add_custom_command(TARGET citra_meta POST_BUILD + COMMAND cat ${dll_list_filename} | xargs -I {} ${CMAKE_COMMAND} -E copy {} $ COMMAND ${CMAKE_COMMAND} -E make_directory "$/plugins/" COMMAND ${CMAKE_COMMAND} -E copy_directory /mxe/usr/x86_64-w64-mingw32.shared/qt6/plugins/ "$/plugins/" COMMAND_EXPAND_LISTS + DEPENDS ${dll_list_filename} ) - add_custom_command(TARGET citra_meta POST_BUILD - COMMAND_EXPAND_LISTS - ) - unset(EXTRA_LIBS) endif() target_link_libraries(citra_meta PRIVATE citra_common fmt)