aboutsummaryrefslogtreecommitdiff
path: root/CMakeModules/find
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2026-06-16 16:15:49 +0200
committercrueter <crueter@eden-emu.dev>2026-06-16 16:15:49 +0200
commit02eaf3c5a7ff24be27ebc9674576d956e7c68da6 (patch)
tree783674dc349a6d1ff41879d4542bff9c65210e5e /CMakeModules/find
parentc8c61a12c39a0e2df7c38b21a035b0c03759dc1e (diff)
[cmake, docs] Reorganize CMakeModules directory and add GentooCross toolchain (#4088)
Lightly inspired by my earlier toolchain and writeup from the PowerPC PR. Closes #3793 Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4088 Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'CMakeModules/find')
-rw-r--r--CMakeModules/find/FindDiscordRPC.cmake33
-rw-r--r--CMakeModules/find/FindFFmpeg.cmake198
-rw-r--r--CMakeModules/find/FindLLVM.cmake30
-rw-r--r--CMakeModules/find/FindOpus.cmake22
-rw-r--r--CMakeModules/find/FindRenderDoc.cmake22
-rw-r--r--CMakeModules/find/FindSimpleIni.cmake24
-rw-r--r--CMakeModules/find/Findenet.cmake23
-rw-r--r--CMakeModules/find/Findgamemode.cmake18
-rw-r--r--CMakeModules/find/Findhttplib.cmake34
-rw-r--r--CMakeModules/find/Findlibiw.cmake29
-rw-r--r--CMakeModules/find/Findlibusb.cmake23
-rw-r--r--CMakeModules/find/Findlz4.cmake34
-rw-r--r--CMakeModules/find/Findstb.cmake34
-rw-r--r--CMakeModules/find/Findzstd.cmake41
14 files changed, 565 insertions, 0 deletions
diff --git a/CMakeModules/find/FindDiscordRPC.cmake b/CMakeModules/find/FindDiscordRPC.cmake
new file mode 100644
index 0000000000..a498cb0f26
--- /dev/null
+++ b/CMakeModules/find/FindDiscordRPC.cmake
@@ -0,0 +1,33 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_package(DiscordRPC CONFIG QUIET)
+
+if (NOT DiscordRPC_FOUND)
+ find_path(DiscordRPC_INCLUDE_DIR discord_rpc.h)
+ find_library(DiscordRPC_LIBRARY discord-rpc)
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(DiscordRPC
+ REQUIRED_VARS
+ DiscordRPC_LIBRARY
+ DiscordRPC_INCLUDE_DIR
+ )
+
+ if (DiscordRPC_FOUND AND NOT TARGET DiscordRPC::discord-rpc)
+ add_library(DiscordRPC::discord-rpc UNKNOWN IMPORTED)
+ set_target_properties(DiscordRPC::discord-rpc PROPERTIES
+ IMPORTED_LOCATION "${DiscordRPC_LIBRARY}"
+ INTERFACE_INCLUDE_DIRECTORIES "${DiscordRPC_INCLUDE_DIR}"
+ )
+ endif()
+
+ mark_as_advanced(
+ DiscordRPC_INCLUDE_DIR
+ DiscordRPC_LIBRARY
+ )
+endif()
diff --git a/CMakeModules/find/FindFFmpeg.cmake b/CMakeModules/find/FindFFmpeg.cmake
new file mode 100644
index 0000000000..11dd08acd5
--- /dev/null
+++ b/CMakeModules/find/FindFFmpeg.cmake
@@ -0,0 +1,198 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2019 Citra Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# FindFFmpeg
+# ----------
+#
+# Find the native FFmpeg includes and libraries
+#
+# This module defines the following variables:
+#
+# FFmpeg_INCLUDE_<component>: where to find <component>.h
+# FFmpeg_LIBRARY_<component>: where to find the <component> library
+# FFmpeg_INCLUDE_DIR: aggregate all the include paths
+# FFmpeg_LIBRARIES: aggregate all the paths to the libraries
+# FFmpeg_FOUND: True if all components have been found
+#
+# This module defines the following targets, which are preferred over variables:
+#
+# FFmpeg::<component>: Target to use <component> directly, with include path,
+# library and dependencies set up. If you are using a static build, you are
+# responsible for adding any external dependencies (such as zlib, bzlib...).
+#
+# <component> can be one of:
+# avcodec
+# avdevice
+# avfilter
+# avformat
+# avutil
+# postproc
+# swresample
+# swscale
+#
+
+set(_FFmpeg_ALL_COMPONENTS
+ avcodec
+ avdevice
+ avfilter
+ avformat
+ avutil
+ postproc
+ swresample
+ swscale
+)
+
+set(_FFmpeg_DEPS_avcodec avutil)
+set(_FFmpeg_DEPS_avdevice avcodec avformat avutil)
+set(_FFmpeg_DEPS_avfilter avutil)
+set(_FFmpeg_DEPS_avformat avcodec avutil)
+set(_FFmpeg_DEPS_postproc avutil)
+set(_FFmpeg_DEPS_swresample avutil)
+set(_FFmpeg_DEPS_swscale avutil)
+
+function(find_ffmpeg LIBNAME)
+ if(DEFINED ENV{FFMPEG_DIR})
+ set(FFMPEG_DIR $ENV{FFMPEG_DIR})
+ endif()
+
+ if(FFMPEG_DIR)
+ list(APPEND INCLUDE_PATHS
+ ${FFMPEG_DIR}
+ ${FFMPEG_DIR}/ffmpeg
+ ${FFMPEG_DIR}/lib${LIBNAME}
+ ${FFMPEG_DIR}/include/lib${LIBNAME}
+ ${FFMPEG_DIR}/include/ffmpeg
+ ${FFMPEG_DIR}/include
+ NO_DEFAULT_PATH
+ NO_CMAKE_FIND_ROOT_PATH
+ )
+ list(APPEND LIB_PATHS
+ ${FFMPEG_DIR}
+ ${FFMPEG_DIR}/lib
+ ${FFMPEG_DIR}/lib${LIBNAME}
+ NO_DEFAULT_PATH
+ NO_CMAKE_FIND_ROOT_PATH
+ )
+ else()
+ list(APPEND INCLUDE_PATHS
+ ${CMAKE_SYSROOT}/usr/local/include/ffmpeg
+ ${CMAKE_SYSROOT}/usr/local/include/lib${LIBNAME}
+ ${CMAKE_SYSROOT}/usr/include/ffmpeg
+ ${CMAKE_SYSROOT}/usr/include/lib${LIBNAME}
+ ${CMAKE_SYSROOT}/usr/include/ffmpeg/lib${LIBNAME}
+ )
+
+ list(APPEND LIB_PATHS
+ ${CMAKE_SYSROOT}/usr/local/lib
+ ${CMAKE_SYSROOT}/usr/lib
+ )
+ endif()
+
+ find_path(FFmpeg_INCLUDE_${LIBNAME} lib${LIBNAME}/${LIBNAME}.h
+ HINTS ${INCLUDE_PATHS}
+ )
+
+ find_library(FFmpeg_LIBRARY_${LIBNAME} ${LIBNAME}
+ HINTS ${LIB_PATHS}
+ )
+
+ if(NOT FFMPEG_DIR AND (NOT FFmpeg_LIBRARY_${LIBNAME} OR NOT FFmpeg_INCLUDE_${LIBNAME}))
+ # Didn't find it in the usual paths, try pkg-config
+ find_package(PkgConfig QUIET)
+ pkg_check_modules(FFmpeg_PKGCONFIG_${LIBNAME} QUIET lib${LIBNAME})
+
+ find_path(FFmpeg_INCLUDE_${LIBNAME} lib${LIBNAME}/${LIBNAME}.h
+ ${FFmpeg_PKGCONFIG_${LIBNAME}_INCLUDE_DIRS}
+ )
+
+ find_library(FFmpeg_LIBRARY_${LIBNAME} ${LIBNAME}
+ ${FFmpeg_PKGCONFIG_${LIBNAME}_LIBRARY_DIRS}
+ )
+ endif()
+
+ if(FFmpeg_INCLUDE_${LIBNAME} AND FFmpeg_LIBRARY_${LIBNAME})
+ set(FFmpeg_INCLUDE_${LIBNAME} "${FFmpeg_INCLUDE_${LIBNAME}}" PARENT_SCOPE)
+ set(FFmpeg_LIBRARY_${LIBNAME} "${FFmpeg_LIBRARY_${LIBNAME}}" PARENT_SCOPE)
+
+ # Extract FFmpeg version from version.h
+ foreach(v MAJOR MINOR MICRO)
+ set(FFmpeg_${LIBNAME}_VERSION_${v} 0)
+ endforeach()
+ string(TOUPPER ${LIBNAME} LIBNAME_UPPER)
+ file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version.h" _FFmpeg_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_(MAJOR|MINOR|MICRO) ")
+ set(_FFmpeg_VERSION_REGEX "([0-9]+)")
+ foreach(v MAJOR MINOR MICRO)
+ if("${_FFmpeg_VERSION_H_CONTENTS}" MATCHES "#define LIB${LIBNAME_UPPER}_VERSION_${v}[\\t ]+${_FFmpeg_VERSION_REGEX}")
+ set(FFmpeg_${LIBNAME}_VERSION_${v} "${CMAKE_MATCH_1}")
+ endif()
+ endforeach()
+ set(FFmpeg_${LIBNAME}_VERSION "${FFmpeg_${LIBNAME}_VERSION_MAJOR}.${FFmpeg_${LIBNAME}_VERSION_MINOR}.${FFmpeg_${LIBNAME}_VERSION_MICRO}")
+ set(FFmpeg_${c}_VERSION "${FFmpeg_${LIBNAME}_VERSION}" PARENT_SCOPE)
+ unset(_FFmpeg_VERSION_REGEX)
+ unset(_FFmpeg_VERSION_H_CONTENTS)
+
+ set(FFmpeg_${c}_FOUND TRUE PARENT_SCOPE)
+ if(NOT FFmpeg_FIND_QUIETLY)
+ message("-- Found ${LIBNAME}: ${FFmpeg_INCLUDE_${LIBNAME}} ${FFmpeg_LIBRARY_${LIBNAME}} (version: ${FFmpeg_${LIBNAME}_VERSION})")
+ endif()
+ endif()
+endfunction()
+
+foreach(c ${_FFmpeg_ALL_COMPONENTS})
+ find_ffmpeg(${c})
+endforeach()
+
+foreach(c ${_FFmpeg_ALL_COMPONENTS})
+ if(FFmpeg_${c}_FOUND)
+ list(APPEND FFmpeg_INCLUDE_DIR ${FFmpeg_INCLUDE_${c}})
+ list(APPEND FFmpeg_LIBRARIES ${FFmpeg_LIBRARY_${c}})
+
+ add_library(FFmpeg::${c} IMPORTED UNKNOWN)
+ set_target_properties(FFmpeg::${c} PROPERTIES
+ IMPORTED_LOCATION ${FFmpeg_LIBRARY_${c}}
+ INTERFACE_INCLUDE_DIRECTORIES ${FFmpeg_INCLUDE_${c}}
+ )
+ if(_FFmpeg_DEPS_${c})
+ set(deps)
+ foreach(dep ${_FFmpeg_DEPS_${c}})
+ list(APPEND deps FFmpeg::${dep})
+ endforeach()
+
+ set_target_properties(FFmpeg::${c} PROPERTIES
+ INTERFACE_LINK_LIBRARIES "${deps}"
+ )
+ unset(deps)
+ endif()
+ endif()
+endforeach()
+
+if(FFmpeg_INCLUDE_DIR)
+ list(REMOVE_DUPLICATES FFmpeg_INCLUDE_DIR)
+endif()
+
+foreach(c ${FFmpeg_FIND_COMPONENTS})
+ list(APPEND _FFmpeg_REQUIRED_VARS FFmpeg_INCLUDE_${c} FFmpeg_LIBRARY_${c})
+endforeach()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(FFmpeg
+ REQUIRED_VARS ${_FFmpeg_REQUIRED_VARS}
+ HANDLE_COMPONENTS
+)
+
+foreach(c ${_FFmpeg_ALL_COMPONENTS})
+ unset(_FFmpeg_DEPS_${c})
+endforeach()
+unset(_FFmpeg_ALL_COMPONENTS)
+unset(_FFmpeg_REQUIRED_VARS)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(FFmpeg
+ REQUIRED_VARS
+ FFmpeg_LIBRARIES
+ FFmpeg_INCLUDE_DIR
+ HANDLE_COMPONENTS
+)
diff --git a/CMakeModules/find/FindLLVM.cmake b/CMakeModules/find/FindLLVM.cmake
new file mode 100644
index 0000000000..f169f134d5
--- /dev/null
+++ b/CMakeModules/find/FindLLVM.cmake
@@ -0,0 +1,30 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_package(LLVM QUIET COMPONENTS CONFIG)
+if (LLVM_FOUND)
+ separate_arguments(LLVM_DEFINITIONS)
+ if (LLVMDemangle IN_LIST LLVM_AVAILABLE_LIBS)
+ set(LLVM_Demangle_FOUND TRUE)
+ endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(LLVM HANDLE_COMPONENTS CONFIG_MODE)
+
+# Demangle only for Windows targets
+if (WIN32 AND LLVM_FOUND AND LLVM_Demangle_FOUND AND NOT TARGET LLVM::Demangle)
+ add_library(LLVM::Demangle INTERFACE IMPORTED)
+ target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS})
+ target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS})
+ # prefer shared LLVM: https://github.com/llvm/llvm-project/issues/34593
+ # but use ugly hack because llvm_config doesn't support interface library
+ add_library(_dummy_lib SHARED EXCLUDE_FROM_ALL ${CMAKE_SOURCE_DIR}/src/yuzu/main.cpp)
+ llvm_config(_dummy_lib USE_SHARED demangle)
+ get_target_property(LLVM_LIBRARIES _dummy_lib LINK_LIBRARIES)
+ target_link_libraries(LLVM::Demangle INTERFACE ${LLVM_LIBRARIES})
+endif()
diff --git a/CMakeModules/find/FindOpus.cmake b/CMakeModules/find/FindOpus.cmake
new file mode 100644
index 0000000000..a4247f06db
--- /dev/null
+++ b/CMakeModules/find/FindOpus.cmake
@@ -0,0 +1,22 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+find_package(PkgConfig QUIET)
+pkg_search_module(OPUS QUIET IMPORTED_TARGET opus)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Opus
+ REQUIRED_VARS OPUS_LINK_LIBRARIES
+ VERSION_VAR OPUS_VERSION
+)
+
+if (PLATFORM_MSYS)
+ FixMsysPath(PkgConfig::OPUS)
+endif()
+
+if (Opus_FOUND AND NOT TARGET Opus::opus)
+ add_library(Opus::opus ALIAS PkgConfig::OPUS)
+endif()
diff --git a/CMakeModules/find/FindRenderDoc.cmake b/CMakeModules/find/FindRenderDoc.cmake
new file mode 100644
index 0000000000..8ac4271a36
--- /dev/null
+++ b/CMakeModules/find/FindRenderDoc.cmake
@@ -0,0 +1,22 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_path(RenderDoc_INCLUDE_DIR renderdoc_app.h)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(RenderDoc
+ REQUIRED_VARS RenderDoc_INCLUDE_DIR
+)
+
+if (RenderDoc_FOUND AND NOT TARGET RenderDoc::API)
+ add_library(RenderDoc::API INTERFACE IMPORTED)
+ set_target_properties(RenderDoc::API PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${RenderDoc_INCLUDE_DIR}"
+ )
+endif()
+
+mark_as_advanced(RenderDoc_INCLUDE_DIR)
diff --git a/CMakeModules/find/FindSimpleIni.cmake b/CMakeModules/find/FindSimpleIni.cmake
new file mode 100644
index 0000000000..1d2379fc82
--- /dev/null
+++ b/CMakeModules/find/FindSimpleIni.cmake
@@ -0,0 +1,24 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+include(FindPackageHandleStandardArgs)
+
+find_package(SimpleIni QUIET CONFIG)
+if (SimpleIni_CONSIDERED_CONFIGS)
+ find_package_handle_standard_args(SimpleIni CONFIG_MODE)
+else()
+ find_package(PkgConfig QUIET)
+ pkg_search_module(SIMPLEINI QUIET IMPORTED_TARGET simpleini)
+ find_package_handle_standard_args(SimpleIni
+ REQUIRED_VARS SIMPLEINI_INCLUDEDIR
+ VERSION_VAR SIMPLEINI_VERSION
+ )
+endif()
+
+if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni)
+ add_library(SimpleIni::SimpleIni ALIAS PkgConfig::SIMPLEINI)
+endif()
diff --git a/CMakeModules/find/Findenet.cmake b/CMakeModules/find/Findenet.cmake
new file mode 100644
index 0000000000..2a2d1d807d
--- /dev/null
+++ b/CMakeModules/find/Findenet.cmake
@@ -0,0 +1,23 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_package(PkgConfig QUIET)
+pkg_search_module(ENET QUIET IMPORTED_TARGET libenet)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(enet
+ REQUIRED_VARS ENET_LINK_LIBRARIES
+ VERSION_VAR ENET_VERSION
+)
+
+if (PLATFORM_MSYS)
+ FixMsysPath(PkgConfig::ENET)
+endif()
+
+if (enet_FOUND AND NOT TARGET enet::enet)
+ add_library(enet::enet ALIAS PkgConfig::ENET)
+endif()
diff --git a/CMakeModules/find/Findgamemode.cmake b/CMakeModules/find/Findgamemode.cmake
new file mode 100644
index 0000000000..3ec966c82d
--- /dev/null
+++ b/CMakeModules/find/Findgamemode.cmake
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+find_package(PkgConfig QUIET)
+pkg_search_module(GAMEMODE QUIET IMPORTED_TARGET gamemode)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(gamemode
+ REQUIRED_VARS GAMEMODE_INCLUDEDIR
+ VERSION_VAR GAMEMODE_VERSION
+)
+
+if (gamemode_FOUND AND NOT TARGET gamemode::headers)
+ add_library(gamemode::headers ALIAS PkgConfig::GAMEMODE)
+endif()
diff --git a/CMakeModules/find/Findhttplib.cmake b/CMakeModules/find/Findhttplib.cmake
new file mode 100644
index 0000000000..e92a9be63f
--- /dev/null
+++ b/CMakeModules/find/Findhttplib.cmake
@@ -0,0 +1,34 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 Andrea Pappacoda <andrea@pappacoda.it>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+include(FindPackageHandleStandardArgs)
+
+find_package(httplib QUIET CONFIG)
+if (httplib_CONSIDERED_CONFIGS)
+ find_package_handle_standard_args(httplib HANDLE_COMPONENTS CONFIG_MODE)
+else()
+ find_package(PkgConfig QUIET)
+ pkg_search_module(HTTPLIB QUIET IMPORTED_TARGET cpp-httplib)
+ if ("-DCPPHTTPLIB_OPENSSL_SUPPORT" IN_LIST HTTPLIB_CFLAGS_OTHER)
+ set(httplib_OpenSSL_FOUND TRUE)
+ endif()
+ if ("-DCPPHTTPLIB_ZLIB_SUPPORT" IN_LIST HTTPLIB_CFLAGS_OTHER)
+ set(httplib_ZLIB_FOUND TRUE)
+ endif()
+ if ("-DCPPHTTPLIB_BROTLI_SUPPORT" IN_LIST HTTPLIB_CFLAGS_OTHER)
+ set(httplib_Brotli_FOUND TRUE)
+ endif()
+ find_package_handle_standard_args(httplib
+ REQUIRED_VARS HTTPLIB_INCLUDEDIR
+ VERSION_VAR HTTPLIB_VERSION
+ HANDLE_COMPONENTS
+ )
+endif()
+
+if (httplib_FOUND AND NOT TARGET httplib::httplib)
+ add_library(httplib::httplib ALIAS PkgConfig::HTTPLIB)
+endif()
diff --git a/CMakeModules/find/Findlibiw.cmake b/CMakeModules/find/Findlibiw.cmake
new file mode 100644
index 0000000000..3381db0f08
--- /dev/null
+++ b/CMakeModules/find/Findlibiw.cmake
@@ -0,0 +1,29 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_package(PkgConfig QUIET)
+pkg_search_module(IW QUIET IMPORTED_TARGET iw)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Libiw
+ REQUIRED_VARS IW_LIBRARIES IW_INCLUDE_DIRS
+ VERSION_VAR IW_VERSION
+ FAIL_MESSAGE "libiw (Wireless Tools library) not found. Please install libiw-dev (Debian/Ubuntu), wireless-tools-devel (Fedora), wireless_tools (Arch), or net-wireless/iw (Gentoo)."
+)
+
+if (Libiw_FOUND AND TARGET PkgConfig::IW AND NOT TARGET iw::iw)
+ add_library(iw::iw ALIAS PkgConfig::IW)
+endif()
+
+if(Libiw_FOUND)
+ mark_as_advanced(
+ IW_INCLUDE_DIRS
+ IW_LIBRARIES
+ IW_LIBRARY_DIRS
+ IW_LINK_LIBRARIES # Often set by pkg-config
+ IW_LDFLAGS
+ IW_CFLAGS
+ IW_CFLAGS_OTHER
+ IW_VERSION
+ )
+endif()
diff --git a/CMakeModules/find/Findlibusb.cmake b/CMakeModules/find/Findlibusb.cmake
new file mode 100644
index 0000000000..dee8187d81
--- /dev/null
+++ b/CMakeModules/find/Findlibusb.cmake
@@ -0,0 +1,23 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_package(PkgConfig QUIET)
+pkg_search_module(LIBUSB QUIET IMPORTED_TARGET libusb-1.0)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(libusb
+ REQUIRED_VARS LIBUSB_LINK_LIBRARIES
+ VERSION_VAR LIBUSB_VERSION
+)
+
+if (PLATFORM_MSYS)
+ FixMsysPath(PkgConfig::LIBUSB)
+endif()
+
+if (libusb_FOUND AND NOT TARGET libusb::usb)
+ add_library(libusb::usb ALIAS PkgConfig::LIBUSB)
+endif()
diff --git a/CMakeModules/find/Findlz4.cmake b/CMakeModules/find/Findlz4.cmake
new file mode 100644
index 0000000000..13235d7ac8
--- /dev/null
+++ b/CMakeModules/find/Findlz4.cmake
@@ -0,0 +1,34 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+include(FindPackageHandleStandardArgs)
+
+find_package(lz4 QUIET CONFIG)
+if (lz4_CONSIDERED_CONFIGS)
+ find_package_handle_standard_args(lz4 CONFIG_MODE)
+else()
+ find_package(PkgConfig QUIET)
+ pkg_search_module(LZ4 QUIET IMPORTED_TARGET liblz4)
+
+ if (PLATFORM_MSYS)
+ FixMsysPath(PkgConfig::LZ4)
+ endif()
+
+ find_package_handle_standard_args(lz4
+ REQUIRED_VARS LZ4_LINK_LIBRARIES
+ VERSION_VAR LZ4_VERSION
+ )
+endif()
+
+if (lz4_FOUND AND NOT TARGET lz4::lz4)
+ if (TARGET LZ4::lz4_shared)
+ add_library(lz4::lz4 ALIAS LZ4::lz4_shared)
+ elseif (TARGET LZ4::lz4_static)
+ add_library(lz4::lz4 ALIAS LZ4::lz4_static)
+ else()
+ add_library(lz4::lz4 ALIAS PkgConfig::LZ4)
+ endif()
+endif()
diff --git a/CMakeModules/find/Findstb.cmake b/CMakeModules/find/Findstb.cmake
new file mode 100644
index 0000000000..4808c45397
--- /dev/null
+++ b/CMakeModules/find/Findstb.cmake
@@ -0,0 +1,34 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_path(stb_image_INCLUDE_DIR stb_image.h PATH_SUFFIXES stb)
+find_path(stb_image_resize_INCLUDE_DIR stb_image_resize.h PATH_SUFFIXES stb)
+find_path(stb_image_write_INCLUDE_DIR stb_image_write.h PATH_SUFFIXES stb)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(stb
+ REQUIRED_VARS
+ stb_image_INCLUDE_DIR
+ stb_image_resize_INCLUDE_DIR
+ stb_image_write_INCLUDE_DIR
+)
+
+if (stb_FOUND AND NOT TARGET stb::headers)
+ add_library(stb::headers INTERFACE IMPORTED)
+ set_property(TARGET stb::headers PROPERTY
+ INTERFACE_INCLUDE_DIRECTORIES
+ "${stb_image_INCLUDE_DIR}"
+ "${stb_image_resize_INCLUDE_DIR}"
+ "${stb_image_write_INCLUDE_DIR}"
+ )
+endif()
+
+mark_as_advanced(
+ stb_image_INCLUDE_DIR
+ stb_image_resize_INCLUDE_DIR
+ stb_image_write_INCLUDE_DIR
+)
diff --git a/CMakeModules/find/Findzstd.cmake b/CMakeModules/find/Findzstd.cmake
new file mode 100644
index 0000000000..58f0aa6117
--- /dev/null
+++ b/CMakeModules/find/Findzstd.cmake
@@ -0,0 +1,41 @@
+# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+include(FindPackageHandleStandardArgs)
+
+find_package(zstd QUIET CONFIG)
+if (zstd_CONSIDERED_CONFIGS)
+ find_package_handle_standard_args(zstd CONFIG_MODE)
+else()
+ find_package(PkgConfig QUIET)
+ pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
+ find_package_handle_standard_args(zstd
+ REQUIRED_VARS ZSTD_LINK_LIBRARIES
+ VERSION_VAR ZSTD_VERSION)
+endif()
+
+if (zstd_FOUND AND NOT TARGET zstd::zstd)
+ if (TARGET zstd::libzstd_shared AND NOT YUZU_STATIC_BUILD)
+ add_library(zstd::zstd ALIAS zstd::libzstd_shared)
+ elseif (TARGET zstd::libzstd_static)
+ add_library(zstd::zstd ALIAS zstd::libzstd_static)
+ else()
+ add_library(zstd::zstd ALIAS PkgConfig::ZSTD)
+ endif()
+endif()
+
+get_target_property(ZSTD_TARGET zstd::zstd ALIASED_TARGET)
+
+if (NOT TARGET zstd::libzstd)
+ if (ZSTD_TARGET)
+ add_library(zstd::libzstd ALIAS ${ZSTD_TARGET})
+ else()
+ add_library(zstd::libzstd ALIAS zstd::zstd)
+ endif()
+elseif(YUZU_STATIC_BUILD AND TARGET zstd::libzstd_static)
+ # zstd::libzstd links to shared zstd by default
+ set_target_properties(zstd::libzstd PROPERTIES INTERFACE_LINK_LIBRARIES zstd::libzstd_static)
+endif()