From 8c1cf3508094e6da8f55141eb8d55258f014a2ce Mon Sep 17 00:00:00 2001 From: crueter Date: Sun, 23 Nov 2025 00:28:36 -0500 Subject: [PATCH] [cmake] initial support for static Linux builds A LOT of things are still missing, notably: - most distros don't package static libs, like at all - ci target * qt6ct :( Tbh this probably isn't worth it at all for the AppImage, but it's an option I guess Signed-off-by: crueter --- CMakeLists.txt | 33 +++++++++++++++++++++++++++------ CMakeModules/StaticQtLibs.cmake | 12 +++++++----- src/CMakeLists.txt | 2 +- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d385b9436..12c4433384 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,14 +125,16 @@ if (YUZU_STATIC_BUILD) set(Boost_USE_STATIC_LIBS ON) set(BUILD_SHARED_LIBS OFF) - ## find .a libs first (static, usually) - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + if (NOT PLATFORM_LINUX) + ## find .a libs first (static, usually) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") - ## some libraries define a Library::Name_static alternative ## - set(YUZU_STATIC_SUFFIX _static) + ## some libraries define a Library::Name_static alternative ## + set(YUZU_STATIC_SUFFIX _static) - ## some libraries use CMAKE_IMPORT_LIBRARY_SUFFIX e.g. Harfbuzz ## - set(CMAKE_IMPORT_LIBRARY_SUFFIX ".a") + ## some libraries use CMAKE_IMPORT_LIBRARY_SUFFIX e.g. Harfbuzz ## + set(CMAKE_IMPORT_LIBRARY_SUFFIX ".a") + endif() if (MINGW) # simple hook to reject dynamic libs @@ -175,6 +177,15 @@ if (YUZU_STATIC_BUILD) set(SPIRV-Tools_FORCE_BUNDLED ON) set(SPIRV-Headers_FORCE_BUNDLED ON) set(zstd_FORCE_BUNDLED ON) + elseif(PLATFORM_LINUX) + # Most distros don't package static libs :( + set(YUZU_USE_CPM ON) + set(CPMUTIL_FORCE_BUNDLED ON) + + set(YUZU_USE_BUNDLED_FFMPEG ON) + set(YUZU_USE_BUNDLED_SDL2 ON) + set(YUZU_USE_BUNDLED_OPENSSL ON) + set(YUZU_USE_BUNDLED_SIRIT ON) endif() endif() @@ -802,6 +813,16 @@ if (YUZU_TESTS OR DYNARMIC_TESTS) find_package(Catch2) endif() +# Qt expects this target +if (YUZU_STATIC_BUILD AND PLATFORM_LINUX) + get_target_property(RDOC_TARGET RenderDoc::API ALIASED_TARGET) + if (RDOC_TARGET) + add_library(RenderDoc::RenderDoc ALIAS ${RDOC_TARGET}) + else() + add_library(RenderDoc::RenderDoc ALIAS RenderDoc::API) + endif() +endif() + if (ENABLE_QT) if (YUZU_USE_BUNDLED_QT) download_qt(6.8.3) diff --git a/CMakeModules/StaticQtLibs.cmake b/CMakeModules/StaticQtLibs.cmake index be2f060a25..e264610a28 100644 --- a/CMakeModules/StaticQtLibs.cmake +++ b/CMakeModules/StaticQtLibs.cmake @@ -16,13 +16,15 @@ function(static_qt_link target) # NB: yes, we have to put them here twice. I have no idea why # libtiff.a - extra_libs(tiff jbig bz2 lzma deflate jpeg tiff) + if (MINGW) + extra_libs(tiff jbig bz2 lzma deflate jpeg tiff) - # libfreetype.a - extra_libs(freetype bz2 Lerc brotlidec brotlicommon freetype) + # libfreetype.a + extra_libs(freetype bz2 Lerc brotlidec brotlicommon freetype) - # libharfbuzz.a - extra_libs(harfbuzz graphite2) + # libharfbuzz.a + extra_libs(harfbuzz graphite2) + endif() # sijfjkfnjkdfjsbjsbsdfhvbdf if (ENABLE_OPENSSL) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2510458812..89945e203d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -174,7 +174,7 @@ else() add_compile_definitions(QT_STATICPLUGIN) # macos doesn't even let you make static executables... wtf? - if (NOT APPLE) + if (NOT APPLE AND NOT PLATFORM_LINUX) add_compile_options(-static) if (YUZU_STATIC_BUILD) # yuzu-cmd requires us to explicitly link libpthread, libgcc, and libstdc++ as static