FindVulkan.cmake 28 KB

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