server/third-party/pyrowave/CMakeLists.txt
Rama main · réplica de lectura del repositorio original.
# Builds the vendored PyroWave C API (pyrowave/pyrowave.h) as a static library
# for Sunshine. Upstream only exposes the C API as a shared library when it is
# the top-level project, so compile pyrowave_c.cpp (and the colour-conversion
# scaler it uses) into a static target here, against the same pruned Granite
# the codec library uses. Modelled on Punktfunk's pyrowave-sys build.
#
# Consumers link `pyrowave::capi` and include <pyrowave.h> after
# <vulkan/vulkan_core.h>; both include directories are provided by the target.
set(PYROWAVE_VENDOR_DIR "${CMAKE_CURRENT_SOURCE_DIR}/pyrowave")
if(NOT EXISTS "${PYROWAVE_VENDOR_DIR}/pyrowave.h")
message(FATAL_ERROR "Vendored PyroWave is missing at ${PYROWAVE_VENDOR_DIR}. "
"Run third-party/pyrowave/vendor-pyrowave.ps1.")
endif()
# Granite is only the Vulkan backend the codec is written against; none of its
# engine, windowing, shader compiler or FFmpeg features are wanted.
set(GRANITE_RENDERER OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_SPIRV_CROSS OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_SHADER_MANAGER_RUNTIME_COMPILER OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_SYSTEM_HANDLES OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_FOSSILIZE OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_DXGI_INTEROP OFF CACHE BOOL "" FORCE)
set(GRANITE_SHADER_COMPILER_OPTIMIZE OFF CACHE BOOL "" FORCE)
set(GRANITE_POSITION_INDEPENDENT ON CACHE BOOL "" FORCE)
set(GRANITE_SHIPPING ON CACHE BOOL "" FORCE)
set(GRANITE_TOOLS OFF CACHE BOOL "" FORCE)
set(GRANITE_FFMPEG OFF CACHE BOOL "" FORCE)
set(GRANITE_FFMPEG_VULKAN OFF CACHE BOOL "" FORCE)
set(GRANITE_AUDIO OFF CACHE BOOL "" FORCE)
set(GRANITE_BULLET OFF CACHE BOOL "" FORCE)
set(GRANITE_INSTALL_TARGETS OFF CACHE BOOL "" FORCE)
set(GRANITE_INSTALL_EXE_TARGETS OFF CACHE BOOL "" FORCE)
set(GRANITE_PLATFORM "null" CACHE STRING "" FORCE)
# volk defines the Vulkan entry points as global function pointers. Keep them
# (and every other Granite/PyroWave symbol) out of the dynamic symbol table so
# they cannot interpose on libraries that link libvulkan on Linux. PE images
# export nothing by default, so Windows needs no visibility flags.
if(WIN32)
set(GRANITE_HIDDEN OFF CACHE BOOL "" FORCE)
else()
set(GRANITE_HIDDEN ON CACHE BOOL "" FORCE)
endif()
add_subdirectory("${PYROWAVE_VENDOR_DIR}/Granite" "${CMAKE_CURRENT_BINARY_DIR}/Granite" EXCLUDE_FROM_ALL)
if(NOT WIN32)
# Visibility alone does not prevent the static Volk vk* pointer symbols
# from binding direct libvulkan calls in the host executable. Namespace
# Volk so PyroWave can coexist with the native Vulkan encoder and FFmpeg.
set_source_files_properties("${PYROWAVE_VENDOR_DIR}/Granite/third_party/volk/volk.c"
TARGET_DIRECTORY granite-volk PROPERTIES LANGUAGE CXX)
target_compile_definitions(granite-volk-headers INTERFACE VOLK_NAMESPACE)
endif()
add_subdirectory("${PYROWAVE_VENDOR_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/pyrowave" EXCLUDE_FROM_ALL)
add_library(pyrowave-capi STATIC
"${PYROWAVE_VENDOR_DIR}/pyrowave_c.cpp"
"${PYROWAVE_VENDOR_DIR}/Granite/video/scaler.cpp")
# Upstream's shared target compiles the same files; PYROWAVE_EXPORT_SYMBOLS stays
# undefined so the entry points carry no dllexport attribute.
target_include_directories(pyrowave-capi PRIVATE
"${PYROWAVE_VENDOR_DIR}/shaders"
"${PYROWAVE_VENDOR_DIR}/Granite/video")
target_link_libraries(pyrowave-capi PRIVATE pyrowave granite-vulkan granite-math)
set_target_properties(pyrowave-capi PROPERTIES
CXX_STANDARD 14
POSITION_INDEPENDENT_CODE ON)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
target_compile_options(pyrowave-capi PRIVATE -Wno-missing-field-initializers)
if(NOT WIN32)
target_compile_options(pyrowave-capi PRIVATE -fvisibility=hidden)
endif()
elseif(MSVC)
target_compile_options(pyrowave-capi PRIVATE /D_CRT_SECURE_NO_WARNINGS /wd4267 /wd4244 /wd4309 /wd4005)
endif()
if(WIN32)
# Granite's breadcrumbs tracker reports device hangs with MessageBoxA.
target_link_libraries(pyrowave-capi PRIVATE user32)
endif()
# Public face: the C header and the Vulkan headers it was compiled against.
add_library(pyrowave-capi-interface INTERFACE)
target_include_directories(pyrowave-capi-interface INTERFACE
"${PYROWAVE_VENDOR_DIR}"
"${PYROWAVE_VENDOR_DIR}/Granite/third_party/khronos/vulkan-headers/include")
target_link_libraries(pyrowave-capi-interface INTERFACE pyrowave-capi)
add_library(pyrowave::capi ALIAS pyrowave-capi-interface)