7ca7d03bfa9f15523732bdd23e39ff52b9897747
[platform/upstream/cmake.git] / Modules / FindVulkan.cmake
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 #[=======================================================================[.rst:
5 FindVulkan
6 ----------
7
8 .. versionadded:: 3.7
9
10 Find Vulkan, which is a low-overhead, cross-platform 3D graphics
11 and computing API.
12
13 Optional COMPONENTS
14 ^^^^^^^^^^^^^^^^^^^
15
16 .. versionadded:: 3.24
17
18 This module respects several optional COMPONENTS.
19 There are corresponding imported targets for each of these.
20
21 ``glslc``
22   The SPIR-V compiler.
23
24 ``glslangValidator``
25   The ``glslangValidator`` tool.
26
27 ``glslang``
28   The SPIR-V generator library.
29
30 ``shaderc_combined``
31   The static library for Vulkan shader compilation.
32
33 ``SPIRV-Tools``
34   Tools to process SPIR-V modules.
35
36 ``MoltenVK``
37   On macOS, an additional component ``MoltenVK`` is available.
38
39 The ``glslc`` and ``glslangValidator`` components are provided even
40 if not explicitly requested (for backward compatibility).
41
42 IMPORTED Targets
43 ^^^^^^^^^^^^^^^^
44
45 This module defines :prop_tgt:`IMPORTED` targets if Vulkan has been found:
46
47 ``Vulkan::Vulkan``
48   The main Vulkan library.
49
50 ``Vulkan::glslc``
51   .. versionadded:: 3.19
52
53   The GLSLC SPIR-V compiler, if it has been found.
54
55 ``Vulkan::Headers``
56   .. versionadded:: 3.21
57
58   Provides just Vulkan headers include paths, if found.  No library is
59   included in this target.  This can be useful for applications that
60   load Vulkan library dynamically.
61
62 ``Vulkan::glslangValidator``
63   .. versionadded:: 3.21
64
65   The glslangValidator tool, if found.  It is used to compile GLSL and
66   HLSL shaders into SPIR-V.
67
68 ``Vulkan::glslang``
69   .. versionadded:: 3.24
70
71   Defined if SDK has the Khronos-reference front-end shader parser and SPIR-V
72   generator library (glslang).
73
74 ``Vulkan::shaderc_combined``
75   .. versionadded:: 3.24
76
77   Defined if SDK has the Google static library for Vulkan shader compilation
78   (shaderc_combined).
79
80 ``Vulkan::SPIRV-Tools``
81   .. versionadded:: 3.24
82
83   Defined if SDK has the Khronos library to process SPIR-V modules
84   (SPIRV-Tools).
85
86 ``Vulkan::MoltenVK``
87   .. versionadded:: 3.24
88
89   Defined if SDK has the Khronos library which implement a subset of Vulkan API
90   over Apple Metal graphics framework. (MoltenVK).
91
92 Result Variables
93 ^^^^^^^^^^^^^^^^
94
95 This module defines the following variables:
96
97 ``Vulkan_FOUND``
98   set to true if Vulkan was found
99 ``Vulkan_INCLUDE_DIRS``
100   include directories for Vulkan
101 ``Vulkan_LIBRARIES``
102   link against this library to use Vulkan
103 ``Vulkan_VERSION``
104   .. versionadded:: 3.23
105
106   value from ``vulkan/vulkan_core.h``
107 ``Vulkan_glslc_FOUND``
108   .. versionadded:: 3.24
109
110   True, if the SDK has the glslc executable.
111 ``Vulkan_glslangValidator_FOUND``
112   .. versionadded:: 3.24
113
114   True, if the SDK has the glslangValidator executable.
115 ``Vulkan_glslang_FOUND``
116   .. versionadded:: 3.24
117
118   True, if the SDK has the glslang library.
119 ``Vulkan_shaderc_combined_FOUND``
120   .. versionadded:: 3.24
121
122   True, if the SDK has the shaderc_combined library.
123 ``Vulkan_SPIRV-Tools_FOUND``
124   .. versionadded:: 3.24
125
126   True, if the SDK has the SPIRV-Tools library.
127 ``Vulkan_MoltenVK_FOUND``
128   .. versionadded:: 3.24
129
130   True, if the SDK has the MoltenVK library.
131
132 The module will also defines these cache variables:
133
134 ``Vulkan_INCLUDE_DIR``
135   the Vulkan include directory
136 ``Vulkan_LIBRARY``
137   the path to the Vulkan library
138 ``Vulkan_GLSLC_EXECUTABLE``
139   the path to the GLSL SPIR-V compiler
140 ``Vulkan_GLSLANG_VALIDATOR_EXECUTABLE``
141   the path to the glslangValidator tool
142 ``Vulkan_glslang_LIBRARY``
143   .. versionadded:: 3.24
144
145   Path to the glslang library.
146 ``Vulkan_shaderc_combined_LIBRARY``
147   .. versionadded:: 3.24
148
149   Path to the shaderc_combined library.
150 ``Vulkan_SPIRV-Tools_LIBRARY``
151   .. versionadded:: 3.24
152
153   Path to the SPIRV-Tools library.
154 ``Vulkan_MoltenVK_LIBRARY``
155   .. versionadded:: 3.24
156
157   Path to the MoltenVK library.
158
159 Hints
160 ^^^^^
161
162 .. versionadded:: 3.18
163
164 The ``VULKAN_SDK`` environment variable optionally specifies the
165 location of the Vulkan SDK root directory for the given
166 architecture. It is typically set by sourcing the toplevel
167 ``setup-env.sh`` script of the Vulkan SDK directory into the shell
168 environment.
169
170 #]=======================================================================]
171
172 cmake_policy(PUSH)
173 cmake_policy(SET CMP0057 NEW)
174
175 # Provide compatibility with a common invalid component request that
176 # was silently ignored prior to CMake 3.24.
177 if("FATAL_ERROR" IN_LIST Vulkan_FIND_COMPONENTS)
178   message(AUTHOR_WARNING
179     "Ignoring unknown component 'FATAL_ERROR'.\n"
180     "The find_package() command documents no such argument."
181     )
182   list(REMOVE_ITEM Vulkan_FIND_COMPONENTS "FATAL_ERROR")
183 endif()
184
185 # For backward compatibility as `FindVulkan` in previous CMake versions allow to retrieve `glslc`
186 # and `glslangValidator` without requesting the corresponding component.
187 if(NOT glslc IN_LIST Vulkan_FIND_COMPONENTS)
188   list(APPEND Vulkan_FIND_COMPONENTS glslc)
189 endif()
190 if(NOT glslangValidator IN_LIST Vulkan_FIND_COMPONENTS)
191   list(APPEND Vulkan_FIND_COMPONENTS glslangValidator)
192 endif()
193
194 if(WIN32)
195   set(_Vulkan_library_name vulkan-1)
196   set(_Vulkan_hint_include_search_paths
197     "$ENV{VULKAN_SDK}/Include"
198   )
199   if(CMAKE_SIZEOF_VOID_P EQUAL 8)
200     set(_Vulkan_hint_executable_search_paths
201       "$ENV{VULKAN_SDK}/Bin"
202     )
203     set(_Vulkan_hint_library_search_paths
204       "$ENV{VULKAN_SDK}/Lib"
205       "$ENV{VULKAN_SDK}/Bin"
206     )
207   else()
208     set(_Vulkan_hint_executable_search_paths
209       "$ENV{VULKAN_SDK}/Bin32"
210     )
211     set(_Vulkan_hint_library_search_paths
212       "$ENV{VULKAN_SDK}/Lib32"
213       "$ENV{VULKAN_SDK}/Bin32"
214     )
215   endif()
216 else()
217   set(_Vulkan_library_name vulkan)
218   set(_Vulkan_hint_include_search_paths
219     "$ENV{VULKAN_SDK}/include"
220   )
221   set(_Vulkan_hint_executable_search_paths
222     "$ENV{VULKAN_SDK}/bin"
223   )
224   set(_Vulkan_hint_library_search_paths
225     "$ENV{VULKAN_SDK}/lib"
226   )
227 endif()
228 if(APPLE AND DEFINED ENV{VULKAN_SDK})
229   cmake_path(SET _MoltenVK_path NORMALIZE "$ENV{VULKAN_SDK}/../MoltenVK")
230   if(EXISTS "${_MoltenVK_path}")
231     list(APPEND _Vulkan_hint_include_search_paths
232       "${_MoltenVK_path}/include"
233     )
234     if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
235       list(APPEND _Vulkan_hint_library_search_paths
236         "${_MoltenVK_path}/dylib/iOS"
237       )
238     elseif(CMAKE_SYSTEM_NAME STREQUAL "tvOS")
239       list(APPEND _Vulkan_hint_library_search_paths
240         "${_MoltenVK_path}/dylib/tvOS"
241       )
242     else()
243       list(APPEND _Vulkan_hint_library_search_paths
244         "${_MoltenVK_path}/dylib/macOS"
245       )
246     endif()
247   endif()
248   unset(_MoltenVK_path)
249 endif()
250
251 find_path(Vulkan_INCLUDE_DIR
252   NAMES vulkan/vulkan.h
253   HINTS
254     ${_Vulkan_hint_include_search_paths}
255   )
256 mark_as_advanced(Vulkan_INCLUDE_DIR)
257
258 find_library(Vulkan_LIBRARY
259   NAMES ${_Vulkan_library_name}
260   HINTS
261     ${_Vulkan_hint_library_search_paths}
262   )
263 mark_as_advanced(Vulkan_LIBRARY)
264
265 if(glslc IN_LIST Vulkan_FIND_COMPONENTS)
266   find_program(Vulkan_GLSLC_EXECUTABLE
267     NAMES glslc
268     HINTS
269       ${_Vulkan_hint_executable_search_paths}
270     )
271   mark_as_advanced(Vulkan_GLSLC_EXECUTABLE)
272 endif()
273 if(glslangValidator IN_LIST Vulkan_FIND_COMPONENTS)
274   find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE
275     NAMES glslangValidator
276     HINTS
277       ${_Vulkan_hint_executable_search_paths}
278     )
279   mark_as_advanced(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
280 endif()
281 if(glslang IN_LIST Vulkan_FIND_COMPONENTS)
282   find_library(Vulkan_glslang-spirv_LIBRARY
283     NAMES SPIRV
284     HINTS
285       ${_Vulkan_hint_library_search_paths}
286     )
287   mark_as_advanced(Vulkan_glslang-spirv_LIBRARY)
288
289   find_library(Vulkan_glslang-spirv_DEBUG_LIBRARY
290     NAMES SPIRVd
291     HINTS
292       ${_Vulkan_hint_library_search_paths}
293     )
294   mark_as_advanced(Vulkan_glslang-spirv_DEBUG_LIBRARY)
295
296   find_library(Vulkan_glslang-oglcompiler_LIBRARY
297     NAMES OGLCompiler
298     HINTS
299       ${_Vulkan_hint_library_search_paths}
300     )
301   mark_as_advanced(Vulkan_glslang-oglcompiler_LIBRARY)
302
303   find_library(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY
304     NAMES OGLCompilerd
305     HINTS
306       ${_Vulkan_hint_library_search_paths}
307     )
308   mark_as_advanced(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY)
309
310   find_library(Vulkan_glslang-osdependent_LIBRARY
311     NAMES OSDependent
312     HINTS
313       ${_Vulkan_hint_library_search_paths}
314     )
315   mark_as_advanced(Vulkan_glslang-osdependent_LIBRARY)
316
317   find_library(Vulkan_glslang-osdependent_DEBUG_LIBRARY
318     NAMES OSDependentd
319     HINTS
320       ${_Vulkan_hint_library_search_paths}
321     )
322   mark_as_advanced(Vulkan_glslang-osdependent_DEBUG_LIBRARY)
323
324   find_library(Vulkan_glslang-machineindependent_LIBRARY
325     NAMES MachineIndependent
326     HINTS
327       ${_Vulkan_hint_library_search_paths}
328     )
329   mark_as_advanced(Vulkan_glslang-machineindependent_LIBRARY)
330
331   find_library(Vulkan_glslang-machineindependent_DEBUG_LIBRARY
332     NAMES MachineIndependentd
333     HINTS
334       ${_Vulkan_hint_library_search_paths}
335     )
336   mark_as_advanced(Vulkan_glslang-machineindependent_DEBUG_LIBRARY)
337
338   find_library(Vulkan_glslang-genericcodegen_LIBRARY
339     NAMES GenericCodeGen
340     HINTS
341       ${_Vulkan_hint_library_search_paths}
342     )
343   mark_as_advanced(Vulkan_glslang-genericcodegen_LIBRARY)
344
345   find_library(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY
346     NAMES GenericCodeGend
347     HINTS
348       ${_Vulkan_hint_library_search_paths}
349     )
350   mark_as_advanced(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY)
351
352   find_library(Vulkan_glslang_LIBRARY
353     NAMES glslang
354     HINTS
355       ${_Vulkan_hint_library_search_paths}
356     )
357   mark_as_advanced(Vulkan_glslang_LIBRARY)
358
359   find_library(Vulkan_glslang_DEBUG_LIBRARY
360     NAMES glslangd
361     HINTS
362       ${_Vulkan_hint_library_search_paths}
363     )
364   mark_as_advanced(Vulkan_glslang_DEBUG_LIBRARY)
365 endif()
366 if(shaderc_combined IN_LIST Vulkan_FIND_COMPONENTS)
367   find_library(Vulkan_shaderc_combined_LIBRARY
368     NAMES shaderc_combined
369     HINTS
370     ${_Vulkan_hint_library_search_paths})
371   mark_as_advanced(Vulkan_shaderc_combined_LIBRARY)
372
373   find_library(Vulkan_shaderc_combined_DEBUG_LIBRARY
374     NAMES shaderc_combinedd
375     HINTS
376     ${_Vulkan_hint_library_search_paths})
377   mark_as_advanced(Vulkan_shaderc_combined_DEBUG_LIBRARY)
378 endif()
379 if(SPIRV-Tools IN_LIST Vulkan_FIND_COMPONENTS)
380   find_library(Vulkan_SPIRV-Tools_LIBRARY
381     NAMES SPIRV-Tools
382     HINTS
383       ${_Vulkan_hint_library_search_paths})
384   mark_as_advanced(Vulkan_SPIRV-Tools_LIBRARY)
385
386   find_library(Vulkan_SPIRV-Tools_DEBUG_LIBRARY
387     NAMES SPIRV-Toolsd
388     HINTS
389       ${_Vulkan_hint_library_search_paths})
390   mark_as_advanced(Vulkan_SPIRV-Tools_DEBUG_LIBRARY)
391 endif()
392 if(MoltenVK IN_LIST Vulkan_FIND_COMPONENTS)
393   find_library(Vulkan_MoltenVK_LIBRARY
394     NAMES MoltenVK
395     HINTS
396       ${_Vulkan_hint_library_search_paths})
397   mark_as_advanced(Vulkan_MoltenVK_LIBRARY)
398
399   find_path(Vulkan_MoltenVK_INCLUDE_DIR
400     NAMES MoltenVK/mvk_vulkan.h
401     HINTS
402       ${_Vulkan_hint_include_search_paths}
403     )
404   mark_as_advanced(Vulkan_MoltenVK_INCLUDE_DIR)
405 endif()
406
407 if(Vulkan_GLSLC_EXECUTABLE)
408   set(Vulkan_glslc_FOUND TRUE)
409 else()
410   set(Vulkan_glslc_FOUND FALSE)
411 endif()
412
413 if(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
414   set(Vulkan_glslangValidator_FOUND TRUE)
415 else()
416   set(Vulkan_glslangValidator_FOUND FALSE)
417 endif()
418
419 function(_Vulkan_set_library_component_found component)
420   cmake_parse_arguments(PARSE_ARGV 1 _ARG
421     "NO_WARNING"
422     ""
423     "DEPENDENT_COMPONENTS")
424
425   set(all_dependent_component_found TRUE)
426   foreach(dependent_component IN LISTS _ARG_DEPENDENT_COMPONENTS)
427     if(NOT Vulkan_${dependent_component}_FOUND)
428       set(all_dependent_component_found FALSE)
429       break()
430     endif()
431   endforeach()
432
433   if(all_dependent_component_found AND (Vulkan_${component}_LIBRARY OR Vulkan_${component}_DEBUG_LIBRARY))
434     set(Vulkan_${component}_FOUND TRUE PARENT_SCOPE)
435
436     # For Windows Vulkan SDK, third party tools binaries are provided with different MSVC ABI:
437     #   - Release binaries uses a runtime library
438     #   - Debug binaries uses a debug runtime library
439     # This lead to incompatibilities in linking for some configuration types due to CMake-default or project-configured selected MSVC ABI.
440     if(WIN32 AND NOT _ARG_NO_WARNING)
441       if(NOT Vulkan_${component}_LIBRARY)
442         message(WARNING
443 "Library ${component} for Release configuration is missing, imported target Vulkan::${component} may not be able to link when targeting this build configuration due to incompatible MSVC ABI.")
444       endif()
445       if(NOT Vulkan_${component}_DEBUG_LIBRARY)
446         message(WARNING
447 "Library ${component} for Debug configuration is missing, imported target Vulkan::${component} may not be able to link when targeting this build configuration due to incompatible MSVC ABI. Consider re-installing the Vulkan SDK and request debug libraries to fix this warning.")
448       endif()
449     endif()
450   else()
451     set(Vulkan_${component}_FOUND FALSE PARENT_SCOPE)
452   endif()
453 endfunction()
454
455 _Vulkan_set_library_component_found(glslang-spirv NO_WARNING)
456 _Vulkan_set_library_component_found(glslang-oglcompiler NO_WARNING)
457 _Vulkan_set_library_component_found(glslang-osdependent NO_WARNING)
458 _Vulkan_set_library_component_found(glslang-machineindependent NO_WARNING)
459 _Vulkan_set_library_component_found(glslang-genericcodegen NO_WARNING)
460 _Vulkan_set_library_component_found(glslang
461   DEPENDENT_COMPONENTS
462     glslang-spirv
463     glslang-oglcompiler
464     glslang-osdependent
465     glslang-machineindependent
466     glslang-genericcodegen)
467 _Vulkan_set_library_component_found(shaderc_combined)
468 _Vulkan_set_library_component_found(SPIRV-Tools)
469
470 if(Vulkan_MoltenVK_INCLUDE_DIR AND Vulkan_MoltenVK_LIBRARY)
471   set(Vulkan_MoltenVK_FOUND TRUE)
472 else()
473   set(Vulkan_MoltenVK_FOUND FALSE)
474 endif()
475
476 set(Vulkan_LIBRARIES ${Vulkan_LIBRARY})
477 set(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR})
478
479 # detect version e.g 1.2.189
480 set(Vulkan_VERSION "")
481 if(Vulkan_INCLUDE_DIR)
482   set(VULKAN_CORE_H ${Vulkan_INCLUDE_DIR}/vulkan/vulkan_core.h)
483   if(EXISTS ${VULKAN_CORE_H})
484     file(STRINGS  ${VULKAN_CORE_H} VulkanHeaderVersionLine REGEX "^#define VK_HEADER_VERSION ")
485     string(REGEX MATCHALL "[0-9]+" VulkanHeaderVersion "${VulkanHeaderVersionLine}")
486     file(STRINGS  ${VULKAN_CORE_H} VulkanHeaderVersionLine2 REGEX "^#define VK_HEADER_VERSION_COMPLETE ")
487     string(REGEX MATCHALL "[0-9]+" VulkanHeaderVersion2 "${VulkanHeaderVersionLine2}")
488     list(LENGTH VulkanHeaderVersion2 _len)
489     #  versions >= 1.2.175 have an additional numbers in front of e.g. '0, 1, 2' instead of '1, 2'
490     if(_len EQUAL 3)
491         list(REMOVE_AT VulkanHeaderVersion2 0)
492     endif()
493     list(APPEND VulkanHeaderVersion2 ${VulkanHeaderVersion})
494     list(JOIN VulkanHeaderVersion2 "." Vulkan_VERSION)
495   endif()
496 endif()
497
498 if(Vulkan_MoltenVK_FOUND)
499   set(Vulkan_MoltenVK_VERSION "")
500   if(Vulkan_MoltenVK_INCLUDE_DIR)
501     set(VK_MVK_MOLTENVK_H ${Vulkan_MoltenVK_INCLUDE_DIR}/MoltenVK/vk_mvk_moltenvk.h)
502     if(EXISTS ${VK_MVK_MOLTENVK_H})
503       file(STRINGS  ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_MAJOR REGEX "^#define MVK_VERSION_MAJOR ")
504       string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_MAJOR "${_Vulkan_MoltenVK_VERSION_MAJOR}")
505       file(STRINGS  ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_MINOR REGEX "^#define MVK_VERSION_MINOR ")
506       string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_MINOR "${_Vulkan_MoltenVK_VERSION_MINOR}")
507       file(STRINGS  ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_PATCH REGEX "^#define MVK_VERSION_PATCH ")
508       string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_PATCH "${_Vulkan_MoltenVK_VERSION_PATCH}")
509       set(Vulkan_MoltenVK_VERSION "${_Vulkan_MoltenVK_VERSION_MAJOR}.${_Vulkan_MoltenVK_VERSION_MINOR}.${_Vulkan_MoltenVK_VERSION_PATCH}")
510       unset(_Vulkan_MoltenVK_VERSION_MAJOR)
511       unset(_Vulkan_MoltenVK_VERSION_MINOR)
512       unset(_Vulkan_MoltenVK_VERSION_PATCH)
513     endif()
514   endif()
515 endif()
516
517 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
518 find_package_handle_standard_args(Vulkan
519   REQUIRED_VARS
520     Vulkan_LIBRARY
521     Vulkan_INCLUDE_DIR
522   VERSION_VAR
523     Vulkan_VERSION
524   HANDLE_COMPONENTS
525 )
526
527 if(Vulkan_FOUND AND NOT TARGET Vulkan::Vulkan)
528   add_library(Vulkan::Vulkan UNKNOWN IMPORTED)
529   set_target_properties(Vulkan::Vulkan PROPERTIES
530     IMPORTED_LOCATION "${Vulkan_LIBRARIES}"
531     INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
532 endif()
533
534 if(Vulkan_FOUND AND NOT TARGET Vulkan::Headers)
535   add_library(Vulkan::Headers INTERFACE IMPORTED)
536   set_target_properties(Vulkan::Headers PROPERTIES
537     INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
538 endif()
539
540 if(Vulkan_FOUND AND Vulkan_GLSLC_EXECUTABLE AND NOT TARGET Vulkan::glslc)
541   add_executable(Vulkan::glslc IMPORTED)
542   set_property(TARGET Vulkan::glslc PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLC_EXECUTABLE}")
543 endif()
544
545 if(Vulkan_FOUND AND Vulkan_GLSLANG_VALIDATOR_EXECUTABLE AND NOT TARGET Vulkan::glslangValidator)
546   add_executable(Vulkan::glslangValidator IMPORTED)
547   set_property(TARGET Vulkan::glslangValidator PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE}")
548 endif()
549
550 if(Vulkan_FOUND)
551   if((Vulkan_glslang-spirv_LIBRARY OR Vulkan_glslang-spirv_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-spirv)
552     add_library(Vulkan::glslang-spirv STATIC IMPORTED)
553     set_property(TARGET Vulkan::glslang-spirv
554       PROPERTY
555         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
556     if(Vulkan_glslang-spirv_LIBRARY)
557       set_property(TARGET Vulkan::glslang-spirv APPEND
558         PROPERTY
559           IMPORTED_CONFIGURATIONS Release)
560       set_property(TARGET Vulkan::glslang-spirv
561         PROPERTY
562           IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-spirv_LIBRARY}")
563     endif()
564     if(Vulkan_glslang-spirv_DEBUG_LIBRARY)
565       set_property(TARGET Vulkan::glslang-spirv APPEND
566         PROPERTY
567           IMPORTED_CONFIGURATIONS Debug)
568       set_property(TARGET Vulkan::glslang-spirv
569         PROPERTY
570           IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-spirv_DEBUG_LIBRARY}")
571     endif()
572   endif()
573
574   if((Vulkan_glslang-oglcompiler_LIBRARY OR Vulkan_glslang-oglcompiler_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-oglcompiler)
575     add_library(Vulkan::glslang-oglcompiler STATIC IMPORTED)
576     set_property(TARGET Vulkan::glslang-oglcompiler
577       PROPERTY
578         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
579     if(Vulkan_glslang-oglcompiler_LIBRARY)
580       set_property(TARGET Vulkan::glslang-oglcompiler APPEND
581         PROPERTY
582           IMPORTED_CONFIGURATIONS Release)
583       set_property(TARGET Vulkan::glslang-oglcompiler
584         PROPERTY
585           IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-oglcompiler_LIBRARY}")
586     endif()
587     if(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY)
588       set_property(TARGET Vulkan::glslang-oglcompiler APPEND
589         PROPERTY
590           IMPORTED_CONFIGURATIONS Debug)
591       set_property(TARGET Vulkan::glslang-oglcompiler
592         PROPERTY
593           IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-oglcompiler_DEBUG_LIBRARY}")
594     endif()
595   endif()
596
597   if((Vulkan_glslang-osdependent_LIBRARY OR Vulkan_glslang-osdependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-osdependent)
598     add_library(Vulkan::glslang-osdependent STATIC IMPORTED)
599     set_property(TARGET Vulkan::glslang-osdependent
600       PROPERTY
601         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
602     if(Vulkan_glslang-osdependent_LIBRARY)
603       set_property(TARGET Vulkan::glslang-osdependent APPEND
604         PROPERTY
605           IMPORTED_CONFIGURATIONS Release)
606       set_property(TARGET Vulkan::glslang-osdependent
607         PROPERTY
608           IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-osdependent_LIBRARY}")
609     endif()
610     if(Vulkan_glslang-osdependent_DEBUG_LIBRARY)
611       set_property(TARGET Vulkan::glslang-osdependent APPEND
612         PROPERTY
613           IMPORTED_CONFIGURATIONS Debug)
614       set_property(TARGET Vulkan::glslang-osdependent
615         PROPERTY
616           IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-osdependent_DEBUG_LIBRARY}")
617     endif()
618   endif()
619
620   if((Vulkan_glslang-machineindependent_LIBRARY OR Vulkan_glslang-machineindependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-machineindependent)
621     add_library(Vulkan::glslang-machineindependent STATIC IMPORTED)
622     set_property(TARGET Vulkan::glslang-machineindependent
623       PROPERTY
624         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
625     if(Vulkan_glslang-machineindependent_LIBRARY)
626       set_property(TARGET Vulkan::glslang-machineindependent APPEND
627         PROPERTY
628           IMPORTED_CONFIGURATIONS Release)
629       set_property(TARGET Vulkan::glslang-machineindependent
630         PROPERTY
631           IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-machineindependent_LIBRARY}")
632     endif()
633     if(Vulkan_glslang-machineindependent_DEBUG_LIBRARY)
634       set_property(TARGET Vulkan::glslang-machineindependent APPEND
635         PROPERTY
636           IMPORTED_CONFIGURATIONS Debug)
637       set_property(TARGET Vulkan::glslang-machineindependent
638         PROPERTY
639           IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-machineindependent_DEBUG_LIBRARY}")
640     endif()
641   endif()
642
643   if((Vulkan_glslang-genericcodegen_LIBRARY OR Vulkan_glslang-genericcodegen_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-genericcodegen)
644     add_library(Vulkan::glslang-genericcodegen STATIC IMPORTED)
645     set_property(TARGET Vulkan::glslang-genericcodegen
646       PROPERTY
647         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
648     if(Vulkan_glslang-genericcodegen_LIBRARY)
649       set_property(TARGET Vulkan::glslang-genericcodegen APPEND
650         PROPERTY
651           IMPORTED_CONFIGURATIONS Release)
652       set_property(TARGET Vulkan::glslang-genericcodegen
653         PROPERTY
654           IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-genericcodegen_LIBRARY}")
655     endif()
656     if(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY)
657       set_property(TARGET Vulkan::glslang-genericcodegen APPEND
658         PROPERTY
659           IMPORTED_CONFIGURATIONS Debug)
660       set_property(TARGET Vulkan::glslang-genericcodegen
661         PROPERTY
662           IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-genericcodegen_DEBUG_LIBRARY}")
663     endif()
664   endif()
665
666   if((Vulkan_glslang_LIBRARY OR Vulkan_glslang_DEBUG_LIBRARY)
667       AND TARGET Vulkan::glslang-spirv
668       AND TARGET Vulkan::glslang-oglcompiler
669       AND TARGET Vulkan::glslang-osdependent
670       AND TARGET Vulkan::glslang-machineindependent
671       AND TARGET Vulkan::glslang-genericcodegen
672       AND NOT TARGET Vulkan::glslang)
673     add_library(Vulkan::glslang STATIC IMPORTED)
674     set_property(TARGET Vulkan::glslang
675       PROPERTY
676         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
677     if(Vulkan_glslang_LIBRARY)
678       set_property(TARGET Vulkan::glslang APPEND
679         PROPERTY
680           IMPORTED_CONFIGURATIONS Release)
681       set_property(TARGET Vulkan::glslang
682         PROPERTY
683           IMPORTED_LOCATION_RELEASE "${Vulkan_glslang_LIBRARY}")
684     endif()
685     if(Vulkan_glslang_DEBUG_LIBRARY)
686       set_property(TARGET Vulkan::glslang APPEND
687         PROPERTY
688           IMPORTED_CONFIGURATIONS Debug)
689       set_property(TARGET Vulkan::glslang
690         PROPERTY
691           IMPORTED_LOCATION_DEBUG "${Vulkan_glslang_DEBUG_LIBRARY}")
692     endif()
693     target_link_libraries(Vulkan::glslang
694       INTERFACE
695         Vulkan::glslang-spirv
696         Vulkan::glslang-oglcompiler
697         Vulkan::glslang-osdependent
698         Vulkan::glslang-machineindependent
699         Vulkan::glslang-genericcodegen
700     )
701   endif()
702
703   if((Vulkan_shaderc_combined_LIBRARY OR Vulkan_shaderc_combined_DEBUG_LIBRARY) AND NOT TARGET Vulkan::shaderc_combined)
704     add_library(Vulkan::shaderc_combined STATIC IMPORTED)
705     set_property(TARGET Vulkan::shaderc_combined
706       PROPERTY
707         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
708     if(Vulkan_shaderc_combined_LIBRARY)
709       set_property(TARGET Vulkan::shaderc_combined APPEND
710         PROPERTY
711           IMPORTED_CONFIGURATIONS Release)
712       set_property(TARGET Vulkan::shaderc_combined
713         PROPERTY
714           IMPORTED_LOCATION_RELEASE "${Vulkan_shaderc_combined_LIBRARY}")
715     endif()
716     if(Vulkan_shaderc_combined_DEBUG_LIBRARY)
717       set_property(TARGET Vulkan::shaderc_combined APPEND
718         PROPERTY
719           IMPORTED_CONFIGURATIONS Debug)
720       set_property(TARGET Vulkan::shaderc_combined
721         PROPERTY
722           IMPORTED_LOCATION_DEBUG "${Vulkan_shaderc_combined_DEBUG_LIBRARY}")
723     endif()
724
725     if(UNIX)
726       find_package(Threads REQUIRED)
727       target_link_libraries(Vulkan::shaderc_combined
728         INTERFACE
729           Threads::Threads)
730     endif()
731   endif()
732
733   if((Vulkan_SPIRV-Tools_LIBRARY OR Vulkan_SPIRV-Tools_DEBUG_LIBRARY) AND NOT TARGET Vulkan::SPIRV-Tools)
734     add_library(Vulkan::SPIRV-Tools STATIC IMPORTED)
735     set_property(TARGET Vulkan::SPIRV-Tools
736       PROPERTY
737         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
738     if(Vulkan_SPIRV-Tools_LIBRARY)
739       set_property(TARGET Vulkan::SPIRV-Tools APPEND
740         PROPERTY
741           IMPORTED_CONFIGURATIONS Release)
742       set_property(TARGET Vulkan::SPIRV-Tools
743         PROPERTY
744           IMPORTED_LOCATION_RELEASE "${Vulkan_SPIRV-Tools_LIBRARY}")
745     endif()
746     if(Vulkan_SPIRV-Tools_DEBUG_LIBRARY)
747       set_property(TARGET Vulkan::SPIRV-Tools APPEND
748         PROPERTY
749           IMPORTED_CONFIGURATIONS Debug)
750       set_property(TARGET Vulkan::SPIRV-Tools
751         PROPERTY
752           IMPORTED_LOCATION_DEBUG "${Vulkan_SPIRV-Tools_DEBUG_LIBRARY}")
753     endif()
754   endif()
755 endif()
756
757 if(Vulkan_MoltenVK_FOUND)
758   if(Vulkan_MoltenVK_LIBRARY AND NOT TARGET Vulkan::MoltenVK)
759     add_library(Vulkan::MoltenVK SHARED IMPORTED)
760     set_target_properties(Vulkan::MoltenVK
761       PROPERTIES
762         INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_MoltenVK_INCLUDE_DIR}"
763         IMPORTED_LOCATION "${Vulkan_MoltenVK_LIBRARY}"
764     )
765   endif()
766 endif()
767
768 unset(_Vulkan_library_name)
769 unset(_Vulkan_hint_include_search_paths)
770 unset(_Vulkan_hint_executable_search_paths)
771 unset(_Vulkan_hint_library_search_paths)
772
773 cmake_policy(POP)