set(ANYPS5_VULKAN_HEADERS_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include") set(ANYPS5_SPIRV_HEADERS_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/SPIRV-Headers/include") set(ANYPS5_SDL2_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include") set(ANYPS5_GLSLANG_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/3rdparty/glslang") set(ANYPS5_SPIRV_HEADERS_SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/SPIRV-Headers") set(ANYPS5_GLSLANG_SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/glslang") if(NOT ANYPS5_USE_SYSTEM_DEPS) return() endif() include(CheckCXXSourceCompiles) find_package(SDL2 CONFIG REQUIRED) if(NOT TARGET SDL2::SDL2) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: SDL2 was found but does not provide SDL2::SDL2") endif() add_library(SDL2-static INTERFACE) target_link_libraries(SDL2-static INTERFACE SDL2::SDL2) get_target_property(ANYPS5_SDL2_INCLUDE_DIR SDL2::SDL2 INTERFACE_INCLUDE_DIRECTORIES) if(NOT ANYPS5_SDL2_INCLUDE_DIR) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: SDL2::SDL2 exposes no INTERFACE_INCLUDE_DIRECTORIES") endif() set(ANYPS5_SDL2_PROBE_INCLUDES ${ANYPS5_SDL2_INCLUDE_DIR}) foreach(_dir IN LISTS ANYPS5_SDL2_INCLUDE_DIR) list(APPEND ANYPS5_SDL2_PROBE_INCLUDES "${_dir}/SDL2") endforeach() list(REMOVE_DUPLICATES ANYPS5_SDL2_PROBE_INCLUDES) set(CMAKE_REQUIRED_INCLUDES ${ANYPS5_SDL2_PROBE_INCLUDES}) check_cxx_source_compiles("#include \"SDL_config.h\"\n#ifndef SDL_JOYSTICK_HIDAPI\n#error SDL_JOYSTICK_HIDAPI is not defined\n#endif\nint main() { return 0; }" ANYPS5_SDL2_HAS_HIDAPI) unset(CMAKE_REQUIRED_INCLUDES) if(NOT ANYPS5_SDL2_HAS_HIDAPI) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: the system SDL2 does not define SDL_JOYSTICK_HIDAPI, so a DualSense gets no light bar, touchpad or trigger effects and the disk audio driver does not preserve the requested format; sdl2-compat (SDL3 underneath) and SDL2 builds with HIDAPI disabled both fail the pad and audio tests; install a real SDL2 2.x built with HIDAPI") endif() find_package(Freetype REQUIRED) if(NOT TARGET Freetype::Freetype) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: freetype was found but does not provide Freetype::Freetype") endif() add_library(freetype INTERFACE) target_link_libraries(freetype INTERFACE Freetype::Freetype) find_package(VulkanHeaders CONFIG REQUIRED) if(NOT TARGET Vulkan::Headers) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: Vulkan-Headers was found but does not provide Vulkan::Headers") endif() get_target_property(ANYPS5_VULKAN_HEADERS_INCLUDE_DIR Vulkan::Headers INTERFACE_INCLUDE_DIRECTORIES) if(NOT ANYPS5_VULKAN_HEADERS_INCLUDE_DIR) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: Vulkan::Headers exposes no INTERFACE_INCLUDE_DIRECTORIES") endif() set(CMAKE_REQUIRED_INCLUDES ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) check_cxx_source_compiles("#include \nint main() { VkPhysicalDeviceMaintenance8FeaturesKHR features{}; (void)features; return 0; }" ANYPS5_VULKAN_HAS_MAINTENANCE8) unset(CMAKE_REQUIRED_INCLUDES) if(NOT ANYPS5_VULKAN_HAS_MAINTENANCE8) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: the system Vulkan-Headers do not provide VkPhysicalDeviceMaintenance8FeaturesKHR (VK_KHR_maintenance8), which the agc driver uses; install Vulkan-Headers 1.4.310 or newer") endif() find_package(SPIRV-Headers CONFIG REQUIRED) if(NOT TARGET SPIRV-Headers::SPIRV-Headers) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: SPIRV-Headers was found but does not provide SPIRV-Headers::SPIRV-Headers") endif() get_target_property(ANYPS5_SPIRV_HEADERS_INCLUDE_DIR SPIRV-Headers::SPIRV-Headers INTERFACE_INCLUDE_DIRECTORIES) if(NOT ANYPS5_SPIRV_HEADERS_INCLUDE_DIR) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: SPIRV-Headers::SPIRV-Headers exposes no INTERFACE_INCLUDE_DIRECTORIES") endif() find_package(glslang CONFIG REQUIRED) if(NOT TARGET glslang::glslang OR NOT TARGET glslang::SPIRV) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: glslang was found but does not provide glslang::glslang and glslang::SPIRV") endif() add_library(glslang INTERFACE) target_link_libraries(glslang INTERFACE glslang::glslang) add_library(SPIRV INTERFACE) target_link_libraries(SPIRV INTERFACE glslang::SPIRV) find_path(ANYPS5_GLSLANG_PUBLIC_INCLUDE_DIR NAMES glslang/Public/ShaderLang.h) if(NOT ANYPS5_GLSLANG_PUBLIC_INCLUDE_DIR) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: glslang/Public/ShaderLang.h was not found; the glslang headers are incomplete") endif() set(ANYPS5_GLSLANG_SPIRV_INCLUDE_DIR "${ANYPS5_GLSLANG_PUBLIC_INCLUDE_DIR}/glslang") if(NOT EXISTS "${ANYPS5_GLSLANG_SPIRV_INCLUDE_DIR}/SPIRV/GlslangToSpv.h") message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: ${ANYPS5_GLSLANG_SPIRV_INCLUDE_DIR}/SPIRV/GlslangToSpv.h was not found") endif() set(ANYPS5_GLSLANG_INCLUDE_DIRS "${ANYPS5_GLSLANG_PUBLIC_INCLUDE_DIR};${ANYPS5_GLSLANG_SPIRV_INCLUDE_DIR}") find_program(ANYPS5_GLSLANG_STANDALONE_EXECUTABLE NAMES glslang glslangValidator) if(NOT ANYPS5_GLSLANG_STANDALONE_EXECUTABLE) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: the glslang compiler (glslang or glslangValidator) was not found; install the glslang tools package") endif() add_executable(glslang-standalone IMPORTED GLOBAL) set_target_properties(glslang-standalone PROPERTIES IMPORTED_LOCATION "${ANYPS5_GLSLANG_STANDALONE_EXECUTABLE}") if(ANYPS5_ENABLE_SPIRV_TOOLS) find_package(SPIRV-Tools-opt CONFIG REQUIRED) if(NOT TARGET SPIRV-Tools-opt) message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: SPIRV-Tools was found but does not provide SPIRV-Tools-opt") endif() if(NOT TARGET SPIRV-Tools-static) if(TARGET SPIRV-Tools) add_library(SPIRV-Tools-static INTERFACE) target_link_libraries(SPIRV-Tools-static INTERFACE SPIRV-Tools) else() message(FATAL_ERROR "ANYPS5_USE_SYSTEM_DEPS: SPIRV-Tools was found but provides neither SPIRV-Tools-static nor SPIRV-Tools") endif() endif() endif() set(ANYPS5_SYSTEM_DEPS_STAMP "") list(APPEND ANYPS5_SYSTEM_DEPS_PACKAGES VulkanHeaders SPIRV-Headers glslang) if(ANYPS5_ENABLE_SPIRV_TOOLS) list(APPEND ANYPS5_SYSTEM_DEPS_PACKAGES SPIRV-Tools-opt) endif() foreach(_package IN LISTS ANYPS5_SYSTEM_DEPS_PACKAGES) set(_version "unknown") if(DEFINED ${_package}_VERSION) set(_version "${${_package}_VERSION}") endif() string(APPEND ANYPS5_SYSTEM_DEPS_STAMP " ${_package}=${_version}") endforeach()