[Refactor] (buildsystem): use FindXXX.cmake to find 3rdparty libraries

This commit is contained in:
2025-08-25 12:30:32 +08:00
parent 591f61a9f0
commit fae9bcd0df
4 changed files with 704 additions and 49 deletions
+17 -49
View File
@@ -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$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/spirv-cross-c-shared$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/GenericCodeGen$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/glslang-default-resource-limits$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/MachineIndependent$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/OSDependent$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV-Tools-diff$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV-Tools-link$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV-Tools-lint$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV-Tools-opt$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV-Tools-reduce$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV-Tools$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPIRV$<$<CONFIG:Debug>:d>.lib
${VULKAN_LIB_DIR}/SPVRemapper$<$<CONFIG:Debug>: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)
+297
View File
@@ -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
)
+153
View File
@@ -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
)
+237
View File
@@ -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
)