Przeglądaj źródła

CMakeLists: Use bundled FFmpeg as a fallback

Sets YUZU_USE_BUNDLED_FFMPEG as a CMake dependent option that is OFF on
Linux and ON for WIN32 targets. If FFmpeg is not found when
YUZU_USE_BUNDLED_FFMPEG is OFF, the bundled module/binaries are used
instead.

Reverts earlier changes to FindFFmpeg a bit, mostly to keep parity with
it's Citra version a bit. Now _FFmpeg_ALL_COMPONENTS lists all
components. We overwrite FFmpeg_LIBRARIES and FFmpeg_INCLUDE_DIR after
using the module.
lat9nq 5 lat temu
rodzic
commit
527188391c
2 zmienionych plików z 42 dodań i 21 usunięć
  1. 29 13
      CMakeLists.txt
  2. 13 8
      externals/find-modules/FindFFmpeg.cmake

+ 29 - 13
CMakeLists.txt

@@ -18,7 +18,7 @@ CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" ON "EN
 
 option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
 
-option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled yuzu" ON)
+CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled yuzu" ON "WIN32" OFF)
 
 option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
 
@@ -386,6 +386,32 @@ if (NOT LIBUSB_FOUND)
     set(LIBUSB_LIBRARIES usb)
 endif()
 
+# List of all FFmpeg components required
+set(FFmpeg_COMPONENTS
+    avcodec
+    avutil
+    swscale)
+
+if (NOT YUZU_USE_BUNDLED_FFMPEG)
+    # Use system installed FFmpeg
+    find_package(FFmpeg REQUIRED COMPONENTS ${FFmpeg_COMPONENTS})
+
+    if (FFmpeg_FOUND)
+        # Overwrite aggregate defines from FFmpeg module to avoid over-linking libraries.
+        # Prevents shipping too many libraries with the AppImage.
+        set(FFmpeg_LIBRARIES "")
+        set(FFmpeg_INCLUDE_DIR "")
+
+        foreach(COMPONENT ${FFmpeg_COMPONENTS})
+            set(FFmpeg_LIBRARIES ${FFmpeg_LIBRARIES} ${FFmpeg_LIBRARY_${COMPONENT}} CACHE PATH "Paths to FFmpeg libraries" FORCE)
+            set(FFmpeg_INCLUDE_DIR ${FFmpeg_INCLUDE_DIR} ${FFmpeg_INCLUDE_${COMPONENT}} CACHE PATH "Path to FFmpeg headers" FORCE)
+        endforeach()
+    else()
+        message(WARNING "FFmpeg not found, falling back to externals")
+        set(YUZU_USE_BUNDLED_FFMPEG ON)
+    endif()
+endif()
+
 if (YUZU_USE_BUNDLED_FFMPEG)
     if (NOT WIN32)
         # Build FFmpeg from externals
@@ -407,11 +433,6 @@ if (YUZU_USE_BUNDLED_FFMPEG)
             set(FFmpeg_FOUND YES)
         endif()
 
-        set(FFmpeg_COMPONENTS
-            avcodec
-            avutil
-            swscale)
-
         foreach(COMPONENT ${FFmpeg_COMPONENTS})
             set(FFmpeg_${COMPONENT}_PREFIX "${FFmpeg_BUILD_DIR}/lib${COMPONENT}")
             set(FFmpeg_${COMPONENT}_LIB_NAME "lib${COMPONENT}.a")
@@ -496,15 +517,10 @@ if (YUZU_USE_BUNDLED_FFMPEG)
             ${FFmpeg_LIBRARY_DIR}/avutil.lib
             CACHE PATH "Paths to FFmpeg libraries" FORCE)
     endif()
-else()
-    # Use system installed FFmpeg
-    find_package(FFmpeg REQUIRED)
-
-    if (NOT FFmpeg_FOUND)
-        message(FATAL_ERROR "FFmpeg not found")
-    endif()
 endif()
 
+unset(FFmpeg_COMPONENTS)
+
 # Prefer the -pthread flag on Linux.
 set(THREADS_PREFER_PTHREAD_FLAG ON)
 find_package(Threads REQUIRED)

+ 13 - 8
externals/find-modules/FindFFmpeg.cmake

@@ -22,19 +22,24 @@
 #
 # <component> can be one of:
 #   avcodec
-#   avdevice # Disabled
-#   avfilter # Disabled
-#   avformat # Disabled
+#   avdevice
+#   avfilter
+#   avformat
 #   avutil
-#   postproc # Disabled
-#   swresample # Disabled
+#   postproc
+#   swresample
 #   swscale
 #
 
 set(_FFmpeg_ALL_COMPONENTS
-  avcodec
-  avutil
-  swscale
+    avcodec
+    avdevice
+    avfilter
+    avformat
+    avutil
+    postproc
+    swresample
+    swscale
 )
 
 set(_FFmpeg_DEPS_avcodec avutil)