FindVulkan.cmake 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  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 CMP0057 NEW)
  153. cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
  154. # Provide compatibility with a common invalid component request that
  155. # was silently ignored prior to CMake 3.24.
  156. if("FATAL_ERROR" IN_LIST Vulkan_FIND_COMPONENTS)
  157. message(AUTHOR_WARNING
  158. "Ignoring unknown component 'FATAL_ERROR'.\n"
  159. "The find_package() command documents no such argument."
  160. )
  161. list(REMOVE_ITEM Vulkan_FIND_COMPONENTS "FATAL_ERROR")
  162. endif()
  163. # For backward compatibility as `FindVulkan` in previous CMake versions allow to retrieve `glslc`
  164. # and `glslangValidator` without requesting the corresponding component.
  165. if(NOT glslc IN_LIST Vulkan_FIND_COMPONENTS)
  166. list(APPEND Vulkan_FIND_COMPONENTS glslc)
  167. endif()
  168. if(NOT glslangValidator IN_LIST Vulkan_FIND_COMPONENTS)
  169. list(APPEND Vulkan_FIND_COMPONENTS glslangValidator)
  170. endif()
  171. if(WIN32)
  172. set(_Vulkan_library_name vulkan-1)
  173. set(_Vulkan_hint_include_search_paths
  174. "$ENV{VULKAN_SDK}/include"
  175. )
  176. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  177. set(_Vulkan_hint_executable_search_paths
  178. "$ENV{VULKAN_SDK}/bin"
  179. )
  180. set(_Vulkan_hint_library_search_paths
  181. "$ENV{VULKAN_SDK}/lib"
  182. "$ENV{VULKAN_SDK}/bin"
  183. )
  184. else()
  185. set(_Vulkan_hint_executable_search_paths
  186. "$ENV{VULKAN_SDK}/bin32"
  187. "$ENV{VULKAN_SDK}/bin"
  188. )
  189. set(_Vulkan_hint_library_search_paths
  190. "$ENV{VULKAN_SDK}/lib32"
  191. "$ENV{VULKAN_SDK}/bin32"
  192. "$ENV{VULKAN_SDK}/lib"
  193. "$ENV{VULKAN_SDK}/bin"
  194. )
  195. endif()
  196. else()
  197. set(_Vulkan_library_name vulkan)
  198. set(_Vulkan_hint_include_search_paths
  199. "$ENV{VULKAN_SDK}/include"
  200. )
  201. set(_Vulkan_hint_executable_search_paths
  202. "$ENV{VULKAN_SDK}/bin"
  203. )
  204. set(_Vulkan_hint_library_search_paths
  205. "$ENV{VULKAN_SDK}/lib"
  206. )
  207. endif()
  208. if(APPLE AND DEFINED ENV{VULKAN_SDK})
  209. cmake_path(SET _MoltenVK_path NORMALIZE "$ENV{VULKAN_SDK}/../MoltenVK")
  210. if(EXISTS "${_MoltenVK_path}")
  211. list(APPEND _Vulkan_hint_include_search_paths
  212. "${_MoltenVK_path}/include"
  213. )
  214. if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
  215. list(APPEND _Vulkan_hint_library_search_paths
  216. "${_MoltenVK_path}/dylib/iOS"
  217. )
  218. elseif(CMAKE_SYSTEM_NAME STREQUAL "tvOS")
  219. list(APPEND _Vulkan_hint_library_search_paths
  220. "${_MoltenVK_path}/dylib/tvOS"
  221. )
  222. else()
  223. list(APPEND _Vulkan_hint_library_search_paths
  224. "${_MoltenVK_path}/dylib/macOS"
  225. )
  226. endif()
  227. endif()
  228. unset(_MoltenVK_path)
  229. endif()
  230. find_path(Vulkan_INCLUDE_DIR
  231. NAMES vulkan/vulkan.h
  232. HINTS
  233. ${_Vulkan_hint_include_search_paths}
  234. )
  235. mark_as_advanced(Vulkan_INCLUDE_DIR)
  236. find_library(Vulkan_LIBRARY
  237. NAMES ${_Vulkan_library_name}
  238. HINTS
  239. ${_Vulkan_hint_library_search_paths}
  240. )
  241. mark_as_advanced(Vulkan_LIBRARY)
  242. if(glslc IN_LIST Vulkan_FIND_COMPONENTS)
  243. find_program(Vulkan_GLSLC_EXECUTABLE
  244. NAMES glslc
  245. HINTS
  246. ${_Vulkan_hint_executable_search_paths}
  247. )
  248. mark_as_advanced(Vulkan_GLSLC_EXECUTABLE)
  249. endif()
  250. if(glslangValidator IN_LIST Vulkan_FIND_COMPONENTS)
  251. find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE
  252. NAMES glslangValidator
  253. HINTS
  254. ${_Vulkan_hint_executable_search_paths}
  255. )
  256. mark_as_advanced(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
  257. endif()
  258. if(glslang IN_LIST Vulkan_FIND_COMPONENTS)
  259. find_library(Vulkan_glslang-spirv_LIBRARY
  260. NAMES SPIRV
  261. HINTS
  262. ${_Vulkan_hint_library_search_paths}
  263. )
  264. mark_as_advanced(Vulkan_glslang-spirv_LIBRARY)
  265. find_library(Vulkan_glslang-spirv_DEBUG_LIBRARY
  266. NAMES SPIRVd
  267. HINTS
  268. ${_Vulkan_hint_library_search_paths}
  269. )
  270. mark_as_advanced(Vulkan_glslang-spirv_DEBUG_LIBRARY)
  271. find_library(Vulkan_glslang-oglcompiler_LIBRARY
  272. NAMES OGLCompiler
  273. HINTS
  274. ${_Vulkan_hint_library_search_paths}
  275. )
  276. mark_as_advanced(Vulkan_glslang-oglcompiler_LIBRARY)
  277. find_library(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY
  278. NAMES OGLCompilerd
  279. HINTS
  280. ${_Vulkan_hint_library_search_paths}
  281. )
  282. mark_as_advanced(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY)
  283. find_library(Vulkan_glslang-osdependent_LIBRARY
  284. NAMES OSDependent
  285. HINTS
  286. ${_Vulkan_hint_library_search_paths}
  287. )
  288. mark_as_advanced(Vulkan_glslang-osdependent_LIBRARY)
  289. find_library(Vulkan_glslang-osdependent_DEBUG_LIBRARY
  290. NAMES OSDependentd
  291. HINTS
  292. ${_Vulkan_hint_library_search_paths}
  293. )
  294. mark_as_advanced(Vulkan_glslang-osdependent_DEBUG_LIBRARY)
  295. find_library(Vulkan_glslang-machineindependent_LIBRARY
  296. NAMES MachineIndependent
  297. HINTS
  298. ${_Vulkan_hint_library_search_paths}
  299. )
  300. mark_as_advanced(Vulkan_glslang-machineindependent_LIBRARY)
  301. find_library(Vulkan_glslang-machineindependent_DEBUG_LIBRARY
  302. NAMES MachineIndependentd
  303. HINTS
  304. ${_Vulkan_hint_library_search_paths}
  305. )
  306. mark_as_advanced(Vulkan_glslang-machineindependent_DEBUG_LIBRARY)
  307. find_library(Vulkan_glslang-genericcodegen_LIBRARY
  308. NAMES GenericCodeGen
  309. HINTS
  310. ${_Vulkan_hint_library_search_paths}
  311. )
  312. mark_as_advanced(Vulkan_glslang-genericcodegen_LIBRARY)
  313. find_library(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY
  314. NAMES GenericCodeGend
  315. HINTS
  316. ${_Vulkan_hint_library_search_paths}
  317. )
  318. mark_as_advanced(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY)
  319. find_library(Vulkan_glslang_LIBRARY
  320. NAMES glslang
  321. HINTS
  322. ${_Vulkan_hint_library_search_paths}
  323. )
  324. mark_as_advanced(Vulkan_glslang_LIBRARY)
  325. find_library(Vulkan_glslang_DEBUG_LIBRARY
  326. NAMES glslangd
  327. HINTS
  328. ${_Vulkan_hint_library_search_paths}
  329. )
  330. mark_as_advanced(Vulkan_glslang_DEBUG_LIBRARY)
  331. endif()
  332. if(shaderc_combined IN_LIST Vulkan_FIND_COMPONENTS)
  333. find_library(Vulkan_shaderc_combined_LIBRARY
  334. NAMES shaderc_combined
  335. HINTS
  336. ${_Vulkan_hint_library_search_paths})
  337. mark_as_advanced(Vulkan_shaderc_combined_LIBRARY)
  338. find_library(Vulkan_shaderc_combined_DEBUG_LIBRARY
  339. NAMES shaderc_combinedd
  340. HINTS
  341. ${_Vulkan_hint_library_search_paths})
  342. mark_as_advanced(Vulkan_shaderc_combined_DEBUG_LIBRARY)
  343. endif()
  344. if(SPIRV-Tools IN_LIST Vulkan_FIND_COMPONENTS)
  345. find_library(Vulkan_SPIRV-Tools_LIBRARY
  346. NAMES SPIRV-Tools
  347. HINTS
  348. ${_Vulkan_hint_library_search_paths})
  349. mark_as_advanced(Vulkan_SPIRV-Tools_LIBRARY)
  350. find_library(Vulkan_SPIRV-Tools_DEBUG_LIBRARY
  351. NAMES SPIRV-Toolsd
  352. HINTS
  353. ${_Vulkan_hint_library_search_paths})
  354. mark_as_advanced(Vulkan_SPIRV-Tools_DEBUG_LIBRARY)
  355. endif()
  356. if(MoltenVK IN_LIST Vulkan_FIND_COMPONENTS)
  357. find_library(Vulkan_MoltenVK_LIBRARY
  358. NAMES MoltenVK
  359. HINTS
  360. ${_Vulkan_hint_library_search_paths})
  361. mark_as_advanced(Vulkan_MoltenVK_LIBRARY)
  362. find_path(Vulkan_MoltenVK_INCLUDE_DIR
  363. NAMES MoltenVK/mvk_vulkan.h
  364. HINTS
  365. ${_Vulkan_hint_include_search_paths}
  366. )
  367. mark_as_advanced(Vulkan_MoltenVK_INCLUDE_DIR)
  368. endif()
  369. if(volk IN_LIST Vulkan_FIND_COMPONENTS)
  370. find_library(Vulkan_volk_LIBRARY
  371. NAMES volk
  372. HINTS
  373. ${_Vulkan_hint_library_search_paths})
  374. mark_as_advanced(Vulkan_Volk_LIBRARY)
  375. endif()
  376. if (dxc IN_LIST Vulkan_FIND_COMPONENTS)
  377. find_library(Vulkan_dxc_LIBRARY
  378. NAMES dxcompiler
  379. HINTS
  380. ${_Vulkan_hint_library_search_paths})
  381. mark_as_advanced(Vulkan_dxc_LIBRARY)
  382. find_program(Vulkan_dxc_EXECUTABLE
  383. NAMES dxc
  384. HINTS
  385. ${_Vulkan_hint_executable_search_paths})
  386. mark_as_advanced(Vulkan_dxc_EXECUTABLE)
  387. endif()
  388. if(Vulkan_GLSLC_EXECUTABLE)
  389. set(Vulkan_glslc_FOUND TRUE)
  390. else()
  391. set(Vulkan_glslc_FOUND FALSE)
  392. endif()
  393. if(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE)
  394. set(Vulkan_glslangValidator_FOUND TRUE)
  395. else()
  396. set(Vulkan_glslangValidator_FOUND FALSE)
  397. endif()
  398. if (Vulkan_dxc_EXECUTABLE)
  399. set(Vulkan_dxc_exe_FOUND TRUE)
  400. else()
  401. set(Vulkan_dxc_exe_FOUND FALSE)
  402. endif()
  403. function(_Vulkan_set_library_component_found component)
  404. cmake_parse_arguments(PARSE_ARGV 1 _ARG
  405. "NO_WARNING"
  406. ""
  407. "DEPENDENT_COMPONENTS")
  408. set(all_dependent_component_found TRUE)
  409. foreach(dependent_component IN LISTS _ARG_DEPENDENT_COMPONENTS)
  410. if(NOT Vulkan_${dependent_component}_FOUND)
  411. set(all_dependent_component_found FALSE)
  412. break()
  413. endif()
  414. endforeach()
  415. if(all_dependent_component_found AND (Vulkan_${component}_LIBRARY OR Vulkan_${component}_DEBUG_LIBRARY))
  416. set(Vulkan_${component}_FOUND TRUE PARENT_SCOPE)
  417. # For Windows Vulkan SDK, third party tools binaries are provided with different MSVC ABI:
  418. # - Release binaries uses a runtime library
  419. # - Debug binaries uses a debug runtime library
  420. # This lead to incompatibilities in linking for some configuration types due to CMake-default or project-configured selected MSVC ABI.
  421. if(WIN32 AND NOT _ARG_NO_WARNING)
  422. if(NOT Vulkan_${component}_LIBRARY)
  423. message(WARNING
  424. "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.")
  425. endif()
  426. if(NOT Vulkan_${component}_DEBUG_LIBRARY)
  427. message(WARNING
  428. "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.")
  429. endif()
  430. endif()
  431. else()
  432. set(Vulkan_${component}_FOUND FALSE PARENT_SCOPE)
  433. endif()
  434. endfunction()
  435. _Vulkan_set_library_component_found(glslang-spirv NO_WARNING)
  436. _Vulkan_set_library_component_found(glslang-oglcompiler NO_WARNING)
  437. _Vulkan_set_library_component_found(glslang-osdependent NO_WARNING)
  438. _Vulkan_set_library_component_found(glslang-machineindependent NO_WARNING)
  439. _Vulkan_set_library_component_found(glslang-genericcodegen NO_WARNING)
  440. _Vulkan_set_library_component_found(glslang DEPENDENT_COMPONENTS glslang-spirv)
  441. _Vulkan_set_library_component_found(shaderc_combined)
  442. _Vulkan_set_library_component_found(SPIRV-Tools)
  443. _Vulkan_set_library_component_found(volk)
  444. _Vulkan_set_library_component_found(dxc)
  445. if(Vulkan_MoltenVK_INCLUDE_DIR AND Vulkan_MoltenVK_LIBRARY)
  446. set(Vulkan_MoltenVK_FOUND TRUE)
  447. else()
  448. set(Vulkan_MoltenVK_FOUND FALSE)
  449. endif()
  450. set(Vulkan_LIBRARIES ${Vulkan_LIBRARY})
  451. set(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR})
  452. # detect version e.g 1.2.189
  453. set(Vulkan_VERSION "")
  454. if(Vulkan_INCLUDE_DIR)
  455. set(VULKAN_CORE_H ${Vulkan_INCLUDE_DIR}/vulkan/vulkan_core.h)
  456. if(EXISTS ${VULKAN_CORE_H})
  457. file(STRINGS ${VULKAN_CORE_H} VulkanHeaderVersionLine REGEX "^#define VK_HEADER_VERSION ")
  458. string(REGEX MATCHALL "[0-9]+" VulkanHeaderVersion "${VulkanHeaderVersionLine}")
  459. file(STRINGS ${VULKAN_CORE_H} VulkanHeaderVersionLine2 REGEX "^#define VK_HEADER_VERSION_COMPLETE ")
  460. string(REGEX MATCHALL "[0-9]+" VulkanHeaderVersion2 "${VulkanHeaderVersionLine2}")
  461. list(LENGTH VulkanHeaderVersion2 _len)
  462. # versions >= 1.2.175 have an additional numbers in front of e.g. '0, 1, 2' instead of '1, 2'
  463. if(_len EQUAL 3)
  464. list(REMOVE_AT VulkanHeaderVersion2 0)
  465. endif()
  466. list(APPEND VulkanHeaderVersion2 ${VulkanHeaderVersion})
  467. list(JOIN VulkanHeaderVersion2 "." Vulkan_VERSION)
  468. endif()
  469. endif()
  470. if(Vulkan_MoltenVK_FOUND)
  471. set(Vulkan_MoltenVK_VERSION "")
  472. if(Vulkan_MoltenVK_INCLUDE_DIR)
  473. set(VK_MVK_MOLTENVK_H ${Vulkan_MoltenVK_INCLUDE_DIR}/MoltenVK/vk_mvk_moltenvk.h)
  474. if(EXISTS ${VK_MVK_MOLTENVK_H})
  475. file(STRINGS ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_MAJOR REGEX "^#define MVK_VERSION_MAJOR ")
  476. string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_MAJOR "${_Vulkan_MoltenVK_VERSION_MAJOR}")
  477. file(STRINGS ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_MINOR REGEX "^#define MVK_VERSION_MINOR ")
  478. string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_MINOR "${_Vulkan_MoltenVK_VERSION_MINOR}")
  479. file(STRINGS ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_PATCH REGEX "^#define MVK_VERSION_PATCH ")
  480. string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_PATCH "${_Vulkan_MoltenVK_VERSION_PATCH}")
  481. set(Vulkan_MoltenVK_VERSION "${_Vulkan_MoltenVK_VERSION_MAJOR}.${_Vulkan_MoltenVK_VERSION_MINOR}.${_Vulkan_MoltenVK_VERSION_PATCH}")
  482. unset(_Vulkan_MoltenVK_VERSION_MAJOR)
  483. unset(_Vulkan_MoltenVK_VERSION_MINOR)
  484. unset(_Vulkan_MoltenVK_VERSION_PATCH)
  485. endif()
  486. endif()
  487. endif()
  488. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  489. find_package_handle_standard_args(Vulkan
  490. REQUIRED_VARS
  491. Vulkan_LIBRARY
  492. Vulkan_INCLUDE_DIR
  493. VERSION_VAR
  494. Vulkan_VERSION
  495. HANDLE_COMPONENTS
  496. )
  497. if(Vulkan_FOUND AND NOT TARGET Vulkan::Vulkan)
  498. add_library(Vulkan::Vulkan UNKNOWN IMPORTED)
  499. set_target_properties(Vulkan::Vulkan PROPERTIES
  500. IMPORTED_LOCATION "${Vulkan_LIBRARIES}"
  501. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  502. endif()
  503. if(Vulkan_FOUND AND NOT TARGET Vulkan::Headers)
  504. add_library(Vulkan::Headers INTERFACE IMPORTED)
  505. set_target_properties(Vulkan::Headers PROPERTIES
  506. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  507. endif()
  508. if(Vulkan_FOUND AND Vulkan_GLSLC_EXECUTABLE AND NOT TARGET Vulkan::glslc)
  509. add_executable(Vulkan::glslc IMPORTED)
  510. set_property(TARGET Vulkan::glslc PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLC_EXECUTABLE}")
  511. endif()
  512. if(Vulkan_FOUND AND Vulkan_GLSLANG_VALIDATOR_EXECUTABLE AND NOT TARGET Vulkan::glslangValidator)
  513. add_executable(Vulkan::glslangValidator IMPORTED)
  514. set_property(TARGET Vulkan::glslangValidator PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE}")
  515. endif()
  516. if(Vulkan_FOUND)
  517. if((Vulkan_glslang-spirv_LIBRARY OR Vulkan_glslang-spirv_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-spirv)
  518. add_library(Vulkan::glslang-spirv STATIC IMPORTED)
  519. set_property(TARGET Vulkan::glslang-spirv
  520. PROPERTY
  521. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  522. if(Vulkan_glslang-spirv_LIBRARY)
  523. set_property(TARGET Vulkan::glslang-spirv APPEND
  524. PROPERTY
  525. IMPORTED_CONFIGURATIONS Release)
  526. set_property(TARGET Vulkan::glslang-spirv
  527. PROPERTY
  528. IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-spirv_LIBRARY}")
  529. endif()
  530. if(Vulkan_glslang-spirv_DEBUG_LIBRARY)
  531. set_property(TARGET Vulkan::glslang-spirv APPEND
  532. PROPERTY
  533. IMPORTED_CONFIGURATIONS Debug)
  534. set_property(TARGET Vulkan::glslang-spirv
  535. PROPERTY
  536. IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-spirv_DEBUG_LIBRARY}")
  537. endif()
  538. endif()
  539. if((Vulkan_glslang-oglcompiler_LIBRARY OR Vulkan_glslang-oglcompiler_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-oglcompiler)
  540. add_library(Vulkan::glslang-oglcompiler STATIC IMPORTED)
  541. set_property(TARGET Vulkan::glslang-oglcompiler
  542. PROPERTY
  543. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  544. if(Vulkan_glslang-oglcompiler_LIBRARY)
  545. set_property(TARGET Vulkan::glslang-oglcompiler APPEND
  546. PROPERTY
  547. IMPORTED_CONFIGURATIONS Release)
  548. set_property(TARGET Vulkan::glslang-oglcompiler
  549. PROPERTY
  550. IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-oglcompiler_LIBRARY}")
  551. endif()
  552. if(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY)
  553. set_property(TARGET Vulkan::glslang-oglcompiler APPEND
  554. PROPERTY
  555. IMPORTED_CONFIGURATIONS Debug)
  556. set_property(TARGET Vulkan::glslang-oglcompiler
  557. PROPERTY
  558. IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-oglcompiler_DEBUG_LIBRARY}")
  559. endif()
  560. endif()
  561. if((Vulkan_glslang-osdependent_LIBRARY OR Vulkan_glslang-osdependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-osdependent)
  562. add_library(Vulkan::glslang-osdependent STATIC IMPORTED)
  563. set_property(TARGET Vulkan::glslang-osdependent
  564. PROPERTY
  565. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  566. if(Vulkan_glslang-osdependent_LIBRARY)
  567. set_property(TARGET Vulkan::glslang-osdependent APPEND
  568. PROPERTY
  569. IMPORTED_CONFIGURATIONS Release)
  570. set_property(TARGET Vulkan::glslang-osdependent
  571. PROPERTY
  572. IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-osdependent_LIBRARY}")
  573. endif()
  574. if(Vulkan_glslang-osdependent_DEBUG_LIBRARY)
  575. set_property(TARGET Vulkan::glslang-osdependent APPEND
  576. PROPERTY
  577. IMPORTED_CONFIGURATIONS Debug)
  578. set_property(TARGET Vulkan::glslang-osdependent
  579. PROPERTY
  580. IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-osdependent_DEBUG_LIBRARY}")
  581. endif()
  582. endif()
  583. if((Vulkan_glslang-machineindependent_LIBRARY OR Vulkan_glslang-machineindependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-machineindependent)
  584. add_library(Vulkan::glslang-machineindependent STATIC IMPORTED)
  585. set_property(TARGET Vulkan::glslang-machineindependent
  586. PROPERTY
  587. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  588. if(Vulkan_glslang-machineindependent_LIBRARY)
  589. set_property(TARGET Vulkan::glslang-machineindependent APPEND
  590. PROPERTY
  591. IMPORTED_CONFIGURATIONS Release)
  592. set_property(TARGET Vulkan::glslang-machineindependent
  593. PROPERTY
  594. IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-machineindependent_LIBRARY}")
  595. endif()
  596. if(Vulkan_glslang-machineindependent_DEBUG_LIBRARY)
  597. set_property(TARGET Vulkan::glslang-machineindependent APPEND
  598. PROPERTY
  599. IMPORTED_CONFIGURATIONS Debug)
  600. set_property(TARGET Vulkan::glslang-machineindependent
  601. PROPERTY
  602. IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-machineindependent_DEBUG_LIBRARY}")
  603. endif()
  604. endif()
  605. if((Vulkan_glslang-genericcodegen_LIBRARY OR Vulkan_glslang-genericcodegen_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-genericcodegen)
  606. add_library(Vulkan::glslang-genericcodegen STATIC IMPORTED)
  607. set_property(TARGET Vulkan::glslang-genericcodegen
  608. PROPERTY
  609. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  610. if(Vulkan_glslang-genericcodegen_LIBRARY)
  611. set_property(TARGET Vulkan::glslang-genericcodegen APPEND
  612. PROPERTY
  613. IMPORTED_CONFIGURATIONS Release)
  614. set_property(TARGET Vulkan::glslang-genericcodegen
  615. PROPERTY
  616. IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-genericcodegen_LIBRARY}")
  617. endif()
  618. if(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY)
  619. set_property(TARGET Vulkan::glslang-genericcodegen APPEND
  620. PROPERTY
  621. IMPORTED_CONFIGURATIONS Debug)
  622. set_property(TARGET Vulkan::glslang-genericcodegen
  623. PROPERTY
  624. IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-genericcodegen_DEBUG_LIBRARY}")
  625. endif()
  626. endif()
  627. if((Vulkan_glslang_LIBRARY OR Vulkan_glslang_DEBUG_LIBRARY)
  628. AND TARGET Vulkan::glslang-spirv
  629. AND NOT TARGET Vulkan::glslang)
  630. add_library(Vulkan::glslang STATIC IMPORTED)
  631. set_property(TARGET Vulkan::glslang
  632. PROPERTY
  633. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  634. if(Vulkan_glslang_LIBRARY)
  635. set_property(TARGET Vulkan::glslang APPEND
  636. PROPERTY
  637. IMPORTED_CONFIGURATIONS Release)
  638. set_property(TARGET Vulkan::glslang
  639. PROPERTY
  640. IMPORTED_LOCATION_RELEASE "${Vulkan_glslang_LIBRARY}")
  641. endif()
  642. if(Vulkan_glslang_DEBUG_LIBRARY)
  643. set_property(TARGET Vulkan::glslang APPEND
  644. PROPERTY
  645. IMPORTED_CONFIGURATIONS Debug)
  646. set_property(TARGET Vulkan::glslang
  647. PROPERTY
  648. IMPORTED_LOCATION_DEBUG "${Vulkan_glslang_DEBUG_LIBRARY}")
  649. endif()
  650. target_link_libraries(Vulkan::glslang
  651. INTERFACE
  652. Vulkan::glslang-spirv
  653. # OGLCompiler library has been fully removed since version 14.0.0
  654. # OSDependent, MachineIndependent, and GenericCodeGen may also be removed in the future.
  655. # See https://github.com/KhronosGroup/glslang/issues/3462
  656. $<TARGET_NAME_IF_EXISTS:Vulkan::glslang-oglcompiler>
  657. $<TARGET_NAME_IF_EXISTS:Vulkan::glslang-osdependent>
  658. $<TARGET_NAME_IF_EXISTS:Vulkan::glslang-machineindependent>
  659. $<TARGET_NAME_IF_EXISTS:Vulkan::glslang-genericcodegen>
  660. )
  661. endif()
  662. if((Vulkan_shaderc_combined_LIBRARY OR Vulkan_shaderc_combined_DEBUG_LIBRARY) AND NOT TARGET Vulkan::shaderc_combined)
  663. add_library(Vulkan::shaderc_combined STATIC IMPORTED)
  664. set_property(TARGET Vulkan::shaderc_combined
  665. PROPERTY
  666. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  667. if(Vulkan_shaderc_combined_LIBRARY)
  668. set_property(TARGET Vulkan::shaderc_combined APPEND
  669. PROPERTY
  670. IMPORTED_CONFIGURATIONS Release)
  671. set_property(TARGET Vulkan::shaderc_combined
  672. PROPERTY
  673. IMPORTED_LOCATION_RELEASE "${Vulkan_shaderc_combined_LIBRARY}")
  674. endif()
  675. if(Vulkan_shaderc_combined_DEBUG_LIBRARY)
  676. set_property(TARGET Vulkan::shaderc_combined APPEND
  677. PROPERTY
  678. IMPORTED_CONFIGURATIONS Debug)
  679. set_property(TARGET Vulkan::shaderc_combined
  680. PROPERTY
  681. IMPORTED_LOCATION_DEBUG "${Vulkan_shaderc_combined_DEBUG_LIBRARY}")
  682. endif()
  683. if(UNIX)
  684. find_package(Threads REQUIRED)
  685. target_link_libraries(Vulkan::shaderc_combined
  686. INTERFACE
  687. Threads::Threads)
  688. endif()
  689. endif()
  690. if((Vulkan_SPIRV-Tools_LIBRARY OR Vulkan_SPIRV-Tools_DEBUG_LIBRARY) AND NOT TARGET Vulkan::SPIRV-Tools)
  691. add_library(Vulkan::SPIRV-Tools STATIC IMPORTED)
  692. set_property(TARGET Vulkan::SPIRV-Tools
  693. PROPERTY
  694. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  695. if(Vulkan_SPIRV-Tools_LIBRARY)
  696. set_property(TARGET Vulkan::SPIRV-Tools APPEND
  697. PROPERTY
  698. IMPORTED_CONFIGURATIONS Release)
  699. set_property(TARGET Vulkan::SPIRV-Tools
  700. PROPERTY
  701. IMPORTED_LOCATION_RELEASE "${Vulkan_SPIRV-Tools_LIBRARY}")
  702. endif()
  703. if(Vulkan_SPIRV-Tools_DEBUG_LIBRARY)
  704. set_property(TARGET Vulkan::SPIRV-Tools APPEND
  705. PROPERTY
  706. IMPORTED_CONFIGURATIONS Debug)
  707. set_property(TARGET Vulkan::SPIRV-Tools
  708. PROPERTY
  709. IMPORTED_LOCATION_DEBUG "${Vulkan_SPIRV-Tools_DEBUG_LIBRARY}")
  710. endif()
  711. endif()
  712. if(Vulkan_volk_LIBRARY AND NOT TARGET Vulkan::volk)
  713. add_library(Vulkan::volk STATIC IMPORTED)
  714. set_property(TARGET Vulkan::volk
  715. PROPERTY
  716. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  717. set_property(TARGET Vulkan::volk APPEND
  718. PROPERTY
  719. IMPORTED_CONFIGURATIONS Release)
  720. set_property(TARGET Vulkan::volk APPEND
  721. PROPERTY
  722. IMPORTED_LOCATION_RELEASE "${Vulkan_volk_LIBRARY}")
  723. if (NOT WIN32)
  724. set_property(TARGET Vulkan::volk APPEND
  725. PROPERTY
  726. IMPORTED_LINK_INTERFACE_LIBRARIES dl)
  727. endif()
  728. endif()
  729. if (Vulkan_dxc_LIBRARY AND NOT TARGET Vulkan::dxc_lib)
  730. add_library(Vulkan::dxc_lib STATIC IMPORTED)
  731. set_property(TARGET Vulkan::dxc_lib
  732. PROPERTY
  733. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
  734. set_property(TARGET Vulkan::dxc_lib APPEND
  735. PROPERTY
  736. IMPORTED_CONFIGURATIONS Release)
  737. set_property(TARGET Vulkan::dxc_lib APPEND
  738. PROPERTY
  739. IMPORTED_LOCATION_RELEASE "${Vulkan_dxc_LIBRARY}")
  740. endif()
  741. if(Vulkan_dxc_EXECUTABLE AND NOT TARGET Vulkan::dxc_exe)
  742. add_executable(Vulkan::dxc_exe IMPORTED)
  743. set_property(TARGET Vulkan::dxc_exe PROPERTY IMPORTED_LOCATION "${Vulkan_dxc_EXECUTABLE}")
  744. endif()
  745. endif()
  746. if(Vulkan_MoltenVK_FOUND)
  747. if(Vulkan_MoltenVK_LIBRARY AND NOT TARGET Vulkan::MoltenVK)
  748. add_library(Vulkan::MoltenVK SHARED IMPORTED)
  749. set_target_properties(Vulkan::MoltenVK
  750. PROPERTIES
  751. INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_MoltenVK_INCLUDE_DIR}"
  752. IMPORTED_LOCATION "${Vulkan_MoltenVK_LIBRARY}"
  753. )
  754. endif()
  755. endif()
  756. unset(_Vulkan_library_name)
  757. unset(_Vulkan_hint_include_search_paths)
  758. unset(_Vulkan_hint_executable_search_paths)
  759. unset(_Vulkan_hint_library_search_paths)
  760. cmake_policy(POP)