From 9ac47f2b21391758065cc32df2d54e59a56425b8 Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Mon, 1 Jan 2024 01:04:04 +0000 Subject: [PATCH 1/4] Optionally allow the system installation of MiniUPnP to be used (#1959) --- cmake/compile_definitions/common.cmake | 2 +- cmake/dependencies/common.cmake | 38 ++++++++++++++++++-------- cmake/prep/options.cmake | 2 ++ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/cmake/compile_definitions/common.cmake b/cmake/compile_definitions/common.cmake index f10b200..c096920 100644 --- a/cmake/compile_definitions/common.cmake +++ b/cmake/compile_definitions/common.cmake @@ -118,7 +118,7 @@ else() endif() list(APPEND SUNSHINE_EXTERNAL_LIBRARIES - libminiupnpc-static + ${MINIUPNP_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} enet opus diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index 9bc7c56..b26b12a 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -9,13 +9,33 @@ add_subdirectory(third-party/moonlight-common-c/enet) # web server add_subdirectory(third-party/Simple-Web-Server) +# common dependencies +find_package(OpenSSL REQUIRED) +find_package(PkgConfig REQUIRED) +find_package(Threads REQUIRED) +pkg_check_modules(CURL REQUIRED libcurl) + # miniupnp -set(UPNPC_BUILD_SHARED OFF CACHE BOOL "No shared libraries") -set(UPNPC_BUILD_TESTS OFF CACHE BOOL "Don't build tests for miniupnpc") -set(UPNPC_BUILD_SAMPLE OFF CACHE BOOL "Don't build samples for miniupnpc") -set(UPNPC_NO_INSTALL ON CACHE BOOL "Don't install any libraries build for miniupnpc") -add_subdirectory(third-party/miniupnp/miniupnpc) -include_directories(SYSTEM third-party/miniupnp/miniupnpc/include) +if(SUNSHINE_SYSTEM_MINIUPNP) + pkg_check_modules(MINIUPNP miniupnpc REQUIRED) + + # Use includedir pkg-config variable rather than MINIUPNP_INCLUDE_DIRS + # defined above. The latter may be blank, as pkg-config sometimes omits -I + # flags for directories that are searched by default (e.g. /usr/include), + # but we need a value to append /miniupnpc to. Normally source files would + # prefix their #include directives with miniupnpc/, but this does not align + # with the directory structure of the git submodule used below. + pkg_get_variable(MINIUPNP_INCLUDE_DIR miniupnpc includedir) + include_directories(SYSTEM ${MINIUPNP_INCLUDE_DIR}/miniupnpc) +else() + set(UPNPC_BUILD_SHARED OFF CACHE BOOL "No shared libraries") + set(UPNPC_BUILD_TESTS OFF CACHE BOOL "Don't build tests for miniupnpc") + set(UPNPC_BUILD_SAMPLE OFF CACHE BOOL "Don't build samples for miniupnpc") + set(UPNPC_NO_INSTALL ON CACHE BOOL "Don't install any libraries build for miniupnpc") + set(MINIUPNP_LIBRARIES libminiupnpc-static) + add_subdirectory(third-party/miniupnp/miniupnpc) + include_directories(SYSTEM third-party/miniupnp/miniupnpc/include) +endif() # ffmpeg pre-compiled binaries if(WIN32) @@ -66,12 +86,6 @@ set(FFMPEG_LIBRARIES ${HDR10_PLUS_LIBRARY} ${FFMPEG_PLATFORM_LIBRARIES}) -# common dependencies -find_package(OpenSSL REQUIRED) -find_package(PkgConfig REQUIRED) -find_package(Threads REQUIRED) -pkg_check_modules(CURL REQUIRED libcurl) - # platform specific dependencies if(WIN32) include(${CMAKE_MODULE_PATH}/dependencies/windows.cmake) diff --git a/cmake/prep/options.cmake b/cmake/prep/options.cmake index 1a216d2..cb26461 100644 --- a/cmake/prep/options.cmake +++ b/cmake/prep/options.cmake @@ -4,6 +4,8 @@ option(SUNSHINE_CONFIGURE_ONLY "Configure special files only, then exit." OFF) option(SUNSHINE_ENABLE_TRAY "Enable system tray icon. This option will be ignored on macOS." ON) option(SUNSHINE_REQUIRE_TRAY "Require system tray icon. Fail the build if tray requirements are not met." ON) +option(SUNSHINE_SYSTEM_MINIUPNP "Use system installation of MiniUPnP rather than the submodule." OFF) + if(APPLE) option(SUNSHINE_CONFIGURE_PORTFILE "Configure macOS Portfile. Recommended to use with SUNSHINE_CONFIGURE_ONLY" OFF) -- 2.43.0 From 2056874748872e820c343556fc6ede4449e376f8 Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Mon, 1 Jan 2024 16:49:00 +0000 Subject: [PATCH 2/4] Optionally allow the system installation of wayland-protocols to be used (#1966) --- cmake/compile_definitions/linux.cmake | 11 +++++++++-- cmake/macros/linux.cmake | 8 ++++---- cmake/prep/options.cmake | 1 + 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index f28152e..a13a823 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -127,8 +127,15 @@ endif() if(WAYLAND_FOUND) add_compile_definitions(SUNSHINE_BUILD_WAYLAND) - GEN_WAYLAND("wayland-protocols" "unstable/xdg-output" xdg-output-unstable-v1) - GEN_WAYLAND("wlr-protocols" "unstable" wlr-export-dmabuf-unstable-v1) + if(NOT SUNSHINE_SYSTEM_WAYLAND_PROTOCOLS) + set(WAYLAND_PROTOCOLS_DIR "${CMAKE_SOURCE_DIR}/third-party/wayland-protocols") + else() + pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir) + pkg_check_modules(WAYLAND_PROTOCOLS wayland-protocols REQUIRED) + endif() + + GEN_WAYLAND("${WAYLAND_PROTOCOLS_DIR}" "unstable/xdg-output" xdg-output-unstable-v1) + GEN_WAYLAND("${CMAKE_SOURCE_DIR}/third-party/wlr-protocols" "unstable" wlr-export-dmabuf-unstable-v1) include_directories( SYSTEM diff --git a/cmake/macros/linux.cmake b/cmake/macros/linux.cmake index d84d045..0bb5e04 100644 --- a/cmake/macros/linux.cmake +++ b/cmake/macros/linux.cmake @@ -5,17 +5,17 @@ macro(GEN_WAYLAND wayland_directory subdirectory filename) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated-src) message("wayland-scanner private-code \ -${CMAKE_SOURCE_DIR}/third-party/${wayland_directory}/${subdirectory}/${filename}.xml \ +${wayland_directory}/${subdirectory}/${filename}.xml \ ${CMAKE_BINARY_DIR}/generated-src/${filename}.c") message("wayland-scanner client-header \ -${CMAKE_SOURCE_DIR}/third-party/${wayland_directory}/${subdirectory}/${filename}.xml \ +${wayland_directory}/${subdirectory}/${filename}.xml \ ${CMAKE_BINARY_DIR}/generated-src/${filename}.h") execute_process( COMMAND wayland-scanner private-code - ${CMAKE_SOURCE_DIR}/third-party/${wayland_directory}/${subdirectory}/${filename}.xml + ${wayland_directory}/${subdirectory}/${filename}.xml ${CMAKE_BINARY_DIR}/generated-src/${filename}.c COMMAND wayland-scanner client-header - ${CMAKE_SOURCE_DIR}/third-party/${wayland_directory}/${subdirectory}/${filename}.xml + ${wayland_directory}/${subdirectory}/${filename}.xml ${CMAKE_BINARY_DIR}/generated-src/${filename}.h RESULT_VARIABLE EXIT_INT diff --git a/cmake/prep/options.cmake b/cmake/prep/options.cmake index cb26461..dc6b5f6 100644 --- a/cmake/prep/options.cmake +++ b/cmake/prep/options.cmake @@ -5,6 +5,7 @@ option(SUNSHINE_ENABLE_TRAY "Enable system tray icon. This option will be ignore option(SUNSHINE_REQUIRE_TRAY "Require system tray icon. Fail the build if tray requirements are not met." ON) option(SUNSHINE_SYSTEM_MINIUPNP "Use system installation of MiniUPnP rather than the submodule." OFF) +option(SUNSHINE_SYSTEM_WAYLAND_PROTOCOLS "Use system installation of wayland-protocols rather than the submodule." OFF) if(APPLE) option(SUNSHINE_CONFIGURE_PORTFILE -- 2.43.0 From a0a6d322c292efa67a59df7b4c71beeb17b322ce Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Mon, 1 Jan 2024 11:17:08 +0000 Subject: [PATCH 3/4] Allow a custom FFmpeg build to be provided using CMake options --- cmake/dependencies/common.cmake | 96 ++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index b26b12a..30069d3 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -38,53 +38,63 @@ else() endif() # ffmpeg pre-compiled binaries -if(WIN32) - if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") - message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) - endif() - set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) - set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-windows-x86_64") -elseif(APPLE) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-macos-x86_64") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-macos-aarch64") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc") - message(FATAL_ERROR "PowerPC is not supported on macOS") - else() - message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) +if(NOT DEFINED FFMPEG_PREPARED_BINARIES) + if(WIN32) + if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") + message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + endif() + set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) + set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-windows-x86_64") + elseif(APPLE) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-macos-x86_64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-macos-aarch64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc") + message(FATAL_ERROR "PowerPC is not supported on macOS") + else() + message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + endif() + elseif(UNIX) + set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 vdpau X11) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + list(APPEND FFMPEG_PLATFORM_LIBRARIES mfx) + set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-x86_64") + set(CPACK_DEB_PLATFORM_PACKAGE_DEPENDS "libmfx1,") + set(CPACK_RPM_PLATFORM_PACKAGE_REQUIRES "intel-mediasdk >= 22.3.0,") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-aarch64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-powerpc64le") + else() + message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + endif() endif() -elseif(UNIX) - set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 vdpau X11) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - list(APPEND FFMPEG_PLATFORM_LIBRARIES mfx) - set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-x86_64") - set(CPACK_DEB_PLATFORM_PACKAGE_DEPENDS "libmfx1,") - set(CPACK_RPM_PLATFORM_PACKAGE_REQUIRES "intel-mediasdk >= 22.3.0,") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-aarch64") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-powerpc64le") - else() - message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + if(EXISTS ${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a) + set(HDR10_PLUS_LIBRARY + ${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a) endif() + set(FFMPEG_LIBRARIES + ${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a + ${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a + ${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a + ${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a + ${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a + ${FFMPEG_PREPARED_BINARIES}/lib/libx264.a + ${FFMPEG_PREPARED_BINARIES}/lib/libx265.a + ${HDR10_PLUS_LIBRARY} + ${FFMPEG_PLATFORM_LIBRARIES}) +else() + set(FFMPEG_LIBRARIES + "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" + ${FFMPEG_PLATFORM_LIBRARIES}) endif() + set(FFMPEG_INCLUDE_DIRS - ${FFMPEG_PREPARED_BINARIES}/include) -if(EXISTS ${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a) - set(HDR10_PLUS_LIBRARY - ${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a) -endif() -set(FFMPEG_LIBRARIES - ${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a - ${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a - ${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a - ${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a - ${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a - ${FFMPEG_PREPARED_BINARIES}/lib/libx264.a - ${FFMPEG_PREPARED_BINARIES}/lib/libx265.a - ${HDR10_PLUS_LIBRARY} - ${FFMPEG_PLATFORM_LIBRARIES}) + "${FFMPEG_PREPARED_BINARIES}/include") # platform specific dependencies if(WIN32) -- 2.43.0 From c871ffc1606f148e55f80415a289317f74820ddf Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Mon, 1 Jan 2024 13:34:20 +0000 Subject: [PATCH 4/4] Move numa from general PLATFORM_LIBRARIES to FFMPEG_PLATFORM_LIBRARIES It's only needed if libx265 was built with NUMA support. This support may be disabled in a custom FFmpeg build. --- cmake/compile_definitions/linux.cmake | 1 - cmake/dependencies/common.cmake | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index a13a823..a2baa9c 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -223,7 +223,6 @@ list(APPEND PLATFORM_LIBRARIES Boost::dynamic_linking dl evdev - numa pulse pulse-simple) diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index 30069d3..fc86ab7 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -56,7 +56,7 @@ if(NOT DEFINED FFMPEG_PREPARED_BINARIES) message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) endif() elseif(UNIX) - set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 vdpau X11) + set(FFMPEG_PLATFORM_LIBRARIES numa va va-drm va-x11 vdpau X11) if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") list(APPEND FFMPEG_PLATFORM_LIBRARIES mfx) set(FFMPEG_PREPARED_BINARIES "${CMAKE_CURRENT_SOURCE_DIR}/third-party/ffmpeg-linux-x86_64") -- 2.43.0