From fae9bcd0df7312ca152fc86f46a3604a32573162 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Mon, 25 Aug 2025 12:30:32 +0800 Subject: [PATCH] [Refactor] (buildsystem): use FindXXX.cmake to find 3rdparty libraries --- MobileGL/MG_Test/CMakeLists.txt | 66 ++---- buildsystem/cmake/FindSPIRVCross.cmake | 297 +++++++++++++++++++++++++ buildsystem/cmake/FindSPIRVTools.cmake | 153 +++++++++++++ buildsystem/cmake/Findglslang.cmake | 237 ++++++++++++++++++++ 4 files changed, 704 insertions(+), 49 deletions(-) create mode 100644 buildsystem/cmake/FindSPIRVCross.cmake create mode 100644 buildsystem/cmake/FindSPIRVTools.cmake create mode 100644 buildsystem/cmake/Findglslang.cmake diff --git a/MobileGL/MG_Test/CMakeLists.txt b/MobileGL/MG_Test/CMakeLists.txt index b4efe926..aa8cb0ba 100644 --- a/MobileGL/MG_Test/CMakeLists.txt +++ b/MobileGL/MG_Test/CMakeLists.txt @@ -4,6 +4,9 @@ project(MobileGLTest) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Add the directory containing our custom Find modules +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../../buildsystem/cmake") + include(FetchContent) FetchContent_Declare( googletest @@ -18,6 +21,11 @@ enable_testing() set(MGL_ROOT ${CMAKE_CURRENT_LIST_DIR}/../..) +# Find the required libraries using our custom Find modules +find_package(glslang REQUIRED) +find_package(SPIRVTools REQUIRED) +find_package(SPIRVCross REQUIRED) + add_executable( SanityTest SanityTest.cpp @@ -27,56 +35,16 @@ target_link_libraries( GTest::gtest_main ) -# Vulkan SDK's cmake config is fundamentally broken. Directly find libs instead -if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - find_package(Vulkan REQUIRED) - get_filename_component(VULKAN_LIB_DIR ${Vulkan_LIBRARY} PATH) +message(STATUS "glslang_LIBRARIES: ${glslang_LIBRARIES}") +message(STATUS "SPIRVTools_LIBRARIES: ${SPIRVTools_LIBRARIES}") +message(STATUS "SPIRVCross_LIBRARIES: ${SPIRVCross_LIBRARIES}") - set(LINK_LIBRARIES - ${VULKAN_LIB_DIR}/libglslang.a - ${VULKAN_LIB_DIR}/libspirv-cross-c-shared.dylib - ${VULKAN_LIB_DIR}/libGenericCodeGen.a - ${VULKAN_LIB_DIR}/libglslang-default-resource-limits.a - ${VULKAN_LIB_DIR}/libMachineIndependent.a - ${VULKAN_LIB_DIR}/libOSDependent.a - ${VULKAN_LIB_DIR}/libSPIRV-Tools-diff.a - ${VULKAN_LIB_DIR}/libSPIRV-Tools-link.a - ${VULKAN_LIB_DIR}/libSPIRV-Tools-lint.a - ${VULKAN_LIB_DIR}/libSPIRV-Tools-opt.a - ${VULKAN_LIB_DIR}/libSPIRV-Tools-reduce.a - ${VULKAN_LIB_DIR}/libSPIRV-Tools.a - ${VULKAN_LIB_DIR}/libSPIRV.a - ${VULKAN_LIB_DIR}/libSPVRemapper.a) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows") - find_package(Vulkan REQUIRED) - get_filename_component(VULKAN_LIB_DIR ${Vulkan_LIBRARY} PATH) - - set(LINK_LIBRARIES - ${VULKAN_LIB_DIR}/glslang$<$:d>.lib - ${VULKAN_LIB_DIR}/spirv-cross-c-shared$<$:d>.lib - ${VULKAN_LIB_DIR}/GenericCodeGen$<$:d>.lib - ${VULKAN_LIB_DIR}/glslang-default-resource-limits$<$:d>.lib - ${VULKAN_LIB_DIR}/MachineIndependent$<$:d>.lib - ${VULKAN_LIB_DIR}/OSDependent$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV-Tools-diff$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV-Tools-link$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV-Tools-lint$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV-Tools-opt$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV-Tools-reduce$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV-Tools$<$:d>.lib - ${VULKAN_LIB_DIR}/SPIRV$<$:d>.lib - ${VULKAN_LIB_DIR}/SPVRemapper$<$:d>.lib) -else () - find_package(glslang CONFIG REQUIRED) - find_package(spirv_cross_core CONFIG REQUIRED) - find_package(spirv_cross_glsl CONFIG REQUIRED) - find_package(spirv_cross_hlsl CONFIG REQUIRED) - find_package(spirv_cross_msl CONFIG REQUIRED) - find_package(spirv_cross_cpp CONFIG REQUIRED) - find_package(spirv_cross_reflect CONFIG REQUIRED) - find_package(spirv_cross_c CONFIG REQUIRED) - set(LINK_LIBRARIES glslang::glslang spirv-cross-c) -endif() +# Set the libraries to link against +set(LINK_LIBRARIES + ${glslang_LIBRARIES} + ${SPIRVTools_LIBRARIES} + ${SPIRVCross_LIBRARIES} +) include(GoogleTest) gtest_discover_tests(SanityTest) diff --git a/buildsystem/cmake/FindSPIRVCross.cmake b/buildsystem/cmake/FindSPIRVCross.cmake new file mode 100644 index 00000000..b852ba12 --- /dev/null +++ b/buildsystem/cmake/FindSPIRVCross.cmake @@ -0,0 +1,297 @@ +# FindSPIRVCross.cmake +# -------------------- +# +# Find SPIRV-Cross library +# +# This module defines the following variables: +# SPIRVCross_FOUND - True if SPIRV-Cross library is found +# SPIRVCross_INCLUDE_DIRS - Include directories for SPIRV-Cross +# SPIRVCross_LIBRARIES - Libraries for SPIRV-Cross +# +# This module reads hints about search locations from: +# SPIRVCross_ROOT - Preferred installation prefix + +# First try to find SPIRV-Cross using CONFIG mode (for vcpkg, conan, etc.) +if (NOT SPIRVCross_FOUND) + find_package(spirv_cross_core CONFIG QUIET) + if (spirv_cross_core_FOUND) + message(STATUS "Found SPIRV-Cross via CONFIG mode") + # Try to find all components + find_package(spirv_cross_glsl CONFIG QUIET) + find_package(spirv_cross_hlsl CONFIG QUIET) + find_package(spirv_cross_msl CONFIG QUIET) + find_package(spirv_cross_cpp CONFIG QUIET) + find_package(spirv_cross_reflect CONFIG QUIET) + find_package(spirv_cross_c CONFIG QUIET) + + # Set the libraries (using the CONFIG mode variables) + set(SPIRVCross_LIBRARIES + spirv-cross-core + spirv-cross-glsl + spirv-cross-hlsl + spirv-cross-msl + spirv-cross-cpp + spirv-cross-reflect + spirv-cross-c + ) + + # Set the include directories + set(SPIRVCross_INCLUDE_DIRS ${spirv_cross_core_INCLUDE_DIRS}) + + # Mark as found + set(SPIRVCross_FOUND TRUE) + endif() +endif() + +# If CONFIG mode failed, try to find Vulkan SDK +if (NOT SPIRVCross_FOUND) + find_package(Vulkan QUIET) + if (Vulkan_FOUND) + get_filename_component(VULKAN_SDK_DIR ${Vulkan_INCLUDE_DIRS} DIRECTORY) + message(STATUS "Found Vulkan SDK: ${VULKAN_SDK_DIR}") + + # Try to find headers in Vulkan SDK + find_path(SPIRVCross_INCLUDE_DIR + NAMES spirv_cross/spirv_cross.hpp + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES include + NO_DEFAULT_PATH + ) + + # Try to find libraries in Vulkan SDK (separate debug/release searches) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + find_library(SPIRVCross_c_LIBRARY + NAMES spirv-cross-cd libspirv-cross-cd spirv-cross-c-sharedd libspirv-cross-c-sharedd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_cpp_LIBRARY + NAMES spirv-cross-cppd libspirv-cross-cppd spirv-cross-cpp-sharedd libspirv-cross-cpp-sharedd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_core_LIBRARY + NAMES spirv-cross-cored libspirv-cross-cored + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_reflect_LIBRARY + NAMES spirv-cross-reflectd libspirv-cross-reflectd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_glsl_LIBRARY + NAMES spirv-cross-glsld libspirv-cross-glsld + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_hlsl_LIBRARY + NAMES spirv-cross-hlsld libspirv-cross-hlsld + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_msl_LIBRARY + NAMES spirv-cross-msld libspirv-cross-msld + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + else() + find_library(SPIRVCross_c_LIBRARY + NAMES spirv-cross-c libspirv-cross-c spirv-cross-c-shared libspirv-cross-c-shared + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_cpp_LIBRARY + NAMES spirv-cross-cpp libspirv-cross-cpp spirv-cross-cpp-shared libspirv-cross-cpp-shared + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_core_LIBRARY + NAMES spirv-cross-core libspirv-cross-core + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_reflect_LIBRARY + NAMES spirv-cross-reflect libspirv-cross-reflect + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_glsl_LIBRARY + NAMES spirv-cross-glsl libspirv-cross-glsl + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_hlsl_LIBRARY + NAMES spirv-cross-hlsl libspirv-cross-hlsl + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVCross_msl_LIBRARY + NAMES spirv-cross-msl libspirv-cross-msl + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + endif() + endif() +endif() + +# If Vulkan SDK search failed, try standard search +if (NOT SPIRVCross_FOUND) + # Look for the header file + find_path(SPIRVCross_INCLUDE_DIR + NAMES spirv_cross/spirv_cross.hpp + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES include + ) + + # Look for the libraries (separate debug/release searches) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + find_library(SPIRVCross_c_LIBRARY + NAMES spirv-cross-cd libspirv-cross-cd spirv-cross-c-sharedd libspirv-cross-c-sharedd + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_cpp_LIBRARY + NAMES spirv-cross-cppd libspirv-cross-cppd spirv-cross-cpp-sharedd libspirv-cross-cpp-sharedd + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_core_LIBRARY + NAMES spirv-cross-cored libspirv-cross-cored + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_reflect_LIBRARY + NAMES spirv-cross-reflectd libspirv-cross-reflectd + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_glsl_LIBRARY + NAMES spirv-cross-glsld libspirv-cross-glsld + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_hlsl_LIBRARY + NAMES spirv-cross-hlsld libspirv-cross-hlsld + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_msl_LIBRARY + NAMES spirv-cross-msld libspirv-cross-msld + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + else() + find_library(SPIRVCross_c_LIBRARY + NAMES spirv-cross-c libspirv-cross-c spirv-cross-c-shared libspirv-cross-c-shared + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_core_LIBRARY + NAMES spirv-cross-core libspirv-cross-core + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_reflect_LIBRARY + NAMES spirv-cross-reflect libspirv-cross-reflect + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_glsl_LIBRARY + NAMES spirv-cross-glsl libspirv-cross-glsl + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_hlsl_LIBRARY + NAMES spirv-cross-hlsl libspirv-cross-hlsl + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVCross_msl_LIBRARY + NAMES spirv-cross-msl libspirv-cross-msl + HINTS ${SPIRVCross_ROOT} ENV SPIRVCross_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + endif() +endif() + +# If we found the main library, mark as found +if (SPIRVCross_c_LIBRARY OR SPIRVCross_cpp_LIBRARY AND SPIRVCross_INCLUDE_DIR) + set(SPIRVCross_FOUND TRUE) +endif() + +# Set the include directory and libraries +if (SPIRVCross_FOUND) + # If we already found the libraries through CONFIG mode, don't override them + if (NOT SPIRVCross_LIBRARIES) + set(SPIRVCross_INCLUDE_DIRS ${SPIRVCross_INCLUDE_DIR}) + set(SPIRVCross_LIBRARIES + ${SPIRVCross_c_LIBRARY} + ${SPIRVCross_cpp_LIBRARY} + ${SPIRVCross_core_LIBRARY} + ${SPIRVCross_reflect_LIBRARY} + ${SPIRVCross_glsl_LIBRARY} + ${SPIRVCross_hlsl_LIBRARY} + ${SPIRVCross_msl_LIBRARY} + ) + endif() +else() + # If we didn't find anything, set the variables from standard search + set(SPIRVCross_INCLUDE_DIRS ${SPIRVCross_INCLUDE_DIR}) + set(SPIRVCross_LIBRARIES + ${SPIRVCross_c_LIBRARY} + ${SPIRVCross_cpp_LIBRARY} + ${SPIRVCross_core_LIBRARY} + ${SPIRVCross_reflect_LIBRARY} + ${SPIRVCross_glsl_LIBRARY} + ${SPIRVCross_hlsl_LIBRARY} + ${SPIRVCross_msl_LIBRARY} + ) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SPIRVCross + REQUIRED_VARS SPIRVCross_INCLUDE_DIR SPIRVCross_LIBRARIES +) + +mark_as_advanced( + SPIRVCross_INCLUDE_DIR + SPIRVCross_LIBRARIES +) \ No newline at end of file diff --git a/buildsystem/cmake/FindSPIRVTools.cmake b/buildsystem/cmake/FindSPIRVTools.cmake new file mode 100644 index 00000000..bc7b65fc --- /dev/null +++ b/buildsystem/cmake/FindSPIRVTools.cmake @@ -0,0 +1,153 @@ +# FindSPIRVTools.cmake +# -------------------- +# +# Find SPIRV-Tools library +# +# This module defines the following variables: +# SPIRVTools_FOUND - True if SPIRV-Tools library is found +# SPIRVTools_INCLUDE_DIRS - Include directories for SPIRV-Tools +# SPIRVTools_LIBRARIES - Libraries for SPIRV-Tools +# +# This module reads hints about search locations from: +# SPIRVTools_ROOT - Preferred installation prefix + +# First try to find SPIRV-Tools using CONFIG mode (for vcpkg, conan, etc.) +if (NOT SPIRVTools_FOUND) + find_package(SPIRV-Tools CONFIG QUIET) + if (SPIRVTools_FOUND) + message(STATUS "Found SPIRV-Tools via CONFIG mode: ${SPIRV-Tools_DIR}") + set(SPIRVTools_INCLUDE_DIRS ${SPIRV-Tools_INCLUDE_DIRS}) + set(SPIRVTools_LIBRARIES ${SPIRV-Tools_LIBRARIES}) + endif() +endif() + +# If CONFIG mode failed, try to find Vulkan SDK +if (NOT SPIRVTools_FOUND) + find_package(Vulkan QUIET) + if (Vulkan_FOUND) + get_filename_component(VULKAN_SDK_DIR ${Vulkan_INCLUDE_DIRS} DIRECTORY) + message(STATUS "Found Vulkan SDK: ${VULKAN_SDK_DIR}") + + # Try to find headers in Vulkan SDK + find_path(SPIRVTools_INCLUDE_DIR + NAMES spirv-tools/libspirv.h + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES include + NO_DEFAULT_PATH + ) + + # Try to find libraries in Vulkan SDK (separate debug/release searches) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + find_library(SPIRVTools_LIBRARY + NAMES SPIRV-Toolsd libSPIRV-Toolsd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVTools_opt_LIBRARY + NAMES SPIRV-Tools-optd libSPIRV-Tools-optd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVTools_link_LIBRARY + NAMES SPIRV-Tools-linkd libSPIRV-Tools-linkd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + else() + find_library(SPIRVTools_LIBRARY + NAMES SPIRV-Tools libSPIRV-Tools + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVTools_opt_LIBRARY + NAMES SPIRV-Tools-opt libSPIRV-Tools-opt + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(SPIRVTools_link_LIBRARY + NAMES SPIRV-Tools-link libSPIRV-Tools-link + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + endif() + endif() +endif() + +# If Vulkan SDK search failed, try standard search +if (NOT SPIRVTools_FOUND) + # Look for the header file + find_path(SPIRVTools_INCLUDE_DIR + NAMES spirv-tools/libspirv.h + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES include + ) + + # Look for the libraries (separate debug/release searches) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + find_library(SPIRVTools_LIBRARY + NAMES SPIRV-Toolsd libSPIRV-Toolsd + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVTools_opt_LIBRARY + NAMES SPIRV-Tools-optd libSPIRV-Tools-optd + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVTools_link_LIBRARY + NAMES SPIRV-Tools-linkd libSPIRV-Tools-linkd + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + else() + find_library(SPIRVTools_LIBRARY + NAMES SPIRV-Tools libSPIRV-Tools + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVTools_opt_LIBRARY + NAMES SPIRV-Tools-opt libSPIRV-Tools-opt + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(SPIRVTools_link_LIBRARY + NAMES SPIRV-Tools-link libSPIRV-Tools-link + HINTS ${SPIRVTools_ROOT} ENV SPIRVTools_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + endif() +endif() + +# Set the include directory and libraries +set(SPIRVTools_INCLUDE_DIRS ${SPIRVTools_INCLUDE_DIR}) +set(SPIRVTools_LIBRARIES + ${SPIRVTools_LIBRARY} + ${SPIRVTools_opt_LIBRARY} + ${SPIRVTools_link_LIBRARY} +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SPIRVTools + REQUIRED_VARS SPIRVTools_INCLUDE_DIR SPIRVTools_LIBRARY +) + +mark_as_advanced( + SPIRVTools_INCLUDE_DIR + SPIRVTools_LIBRARY + SPIRVTools_opt_LIBRARY + SPIRVTools_link_LIBRARY +) \ No newline at end of file diff --git a/buildsystem/cmake/Findglslang.cmake b/buildsystem/cmake/Findglslang.cmake new file mode 100644 index 00000000..736ec92f --- /dev/null +++ b/buildsystem/cmake/Findglslang.cmake @@ -0,0 +1,237 @@ +# Findglslang.cmake +# ------------------ +# +# Find glslang library +# +# This module defines the following variables: +# glslang_FOUND - True if glslang library is found +# glslang_INCLUDE_DIRS - Include directories for glslang +# glslang_LIBRARIES - Libraries for glslang +# +# This module reads hints about search locations from: +# glslang_ROOT - Preferred installation prefix + +# First try to find glslang using CONFIG mode (for vcpkg, conan, etc.) +if (NOT glslang_FOUND) + find_package(glslang CONFIG QUIET) + if (glslang_FOUND) + message(STATUS "Found glslang via CONFIG mode: ${glslang_DIR}") + set(glslang_INCLUDE_DIRS ${glslang_INCLUDE_DIRS} ${glslang_INCLUDE_DIR}) + set(glslang_LIBRARIES ${glslang_LIBRARIES} ${glslang_LIBRARY}) + endif() +endif() + +# If CONFIG mode failed, try to find Vulkan SDK +if (NOT glslang_FOUND) + find_package(Vulkan QUIET) + if (Vulkan_FOUND) + get_filename_component(VULKAN_SDK_DIR ${Vulkan_INCLUDE_DIRS} DIRECTORY) + message(STATUS "Found Vulkan SDK: ${VULKAN_SDK_DIR}") + + # Try to find headers in Vulkan SDK + find_path(glslang_INCLUDE_DIR + NAMES glslang/Public/ShaderLang.h + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES include + NO_DEFAULT_PATH + ) + + # Try to find libraries in Vulkan SDK (separate debug/release searches) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + find_library(glslang_LIBRARY + NAMES glslangd libglslangd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_OSDependent_LIBRARY + NAMES OSDependentd libOSDependentd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_MachineIndependent_LIBRARY + NAMES MachineIndependentd libMachineIndependentd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_GenericCodeGen_LIBRARY + NAMES GenericCodeGend libGenericCodeGend + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_SPIRV_LIBRARY + NAMES SPIRVd libSPIRVd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_glslang_default_resource_limits_LIBRARY + NAMES glslang-default-resource-limitsd libglslang-default-resource-limitsd + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + else() + find_library(glslang_LIBRARY + NAMES glslang libglslang + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_OSDependent_LIBRARY + NAMES OSDependent libOSDependent + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_MachineIndependent_LIBRARY + NAMES MachineIndependent libMachineIndependent + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_GenericCodeGen_LIBRARY + NAMES GenericCodeGen libGenericCodeGen + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_SPIRV_LIBRARY + NAMES SPIRV libSPIRV + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + + find_library(glslang_glslang_default_resource_limits_LIBRARY + NAMES glslang-default-resource-limits libglslang-default-resource-limits + HINTS ${VULKAN_SDK_DIR} + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + NO_DEFAULT_PATH + ) + endif() + endif() +endif() + +# If Vulkan SDK search failed, try standard search +if (NOT glslang_FOUND) + # Look for the header file + find_path(glslang_INCLUDE_DIR + NAMES glslang/Public/ShaderLang.h + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES include + ) + + # Look for the libraries (separate debug/release searches) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + find_library(glslang_LIBRARY + NAMES glslangd libglslangd + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_OSDependent_LIBRARY + NAMES OSDependentd libOSDependentd + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_MachineIndependent_LIBRARY + NAMES MachineIndependentd libMachineIndependentd + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_GenericCodeGen_LIBRARY + NAMES GenericCodeGend libGenericCodeGend + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_SPIRV_LIBRARY + NAMES SPIRVd libSPIRVd + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_glslang_default_resource_limits_LIBRARY + NAMES glslang-default-resource-limitsd libglslang-default-resource-limitsd + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + else() + find_library(glslang_LIBRARY + NAMES glslang libglslang + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_OSDependent_LIBRARY + NAMES OSDependent libOSDependent + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_MachineIndependent_LIBRARY + NAMES MachineIndependent libMachineIndependent + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_GenericCodeGen_LIBRARY + NAMES GenericCodeGen libGenericCodeGen + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_SPIRV_LIBRARY + NAMES SPIRV libSPIRV + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + + find_library(glslang_glslang_default_resource_limits_LIBRARY + NAMES glslang-default-resource-limits libglslang-default-resource-limits + HINTS ${glslang_ROOT} ENV glslang_ROOT + PATH_SUFFIXES lib lib64 lib/x86_64 lib/x64 + ) + endif() +endif() + +# Set the include directory and libraries +set(glslang_INCLUDE_DIRS ${glslang_INCLUDE_DIR}) +set(glslang_LIBRARIES + ${glslang_LIBRARY} + ${glslang_OSDependent_LIBRARY} + ${glslang_MachineIndependent_LIBRARY} + ${glslang_GenericCodeGen_LIBRARY} + ${glslang_SPIRV_LIBRARY} + ${glslang_glslang_default_resource_limits_LIBRARY} +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(glslang + REQUIRED_VARS glslang_INCLUDE_DIR glslang_LIBRARY +) + +mark_as_advanced( + glslang_INCLUDE_DIR + glslang_LIBRARY + glslang_OSDependent_LIBRARY + glslang_MachineIndependent_LIBRARY + glslang_GenericCodeGen_LIBRARY + glslang_SPIRV_LIBRARY + glslang_glslang_default_resource_limits_LIBRARY +) \ No newline at end of file