FindVulkan.cmake 25 KB

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