From 527188391c825836c91bd26c4b953999eb8f2dde Mon Sep 17 00:00:00 2001 From: lat9nq <22451773+lat9nq@users.noreply.github.com> Date: Sat, 6 Feb 2021 03:14:11 -0500 Subject: [PATCH] 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. --- CMakeLists.txt | 42 +++++++++++++++++-------- externals/find-modules/FindFFmpeg.cmake | 21 ++++++++----- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b25a21de3..ac7c3ce90b 100644 --- a/CMakeLists.txt +++ b/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) diff --git a/externals/find-modules/FindFFmpeg.cmake b/externals/find-modules/FindFFmpeg.cmake index 86a3f5a5a2..61b6dc8d2f 100644 --- a/externals/find-modules/FindFFmpeg.cmake +++ b/externals/find-modules/FindFFmpeg.cmake @@ -22,19 +22,24 @@ # # 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)