1*90277196SAndroid Build Coastguard Worker# ~~~ 2*90277196SAndroid Build Coastguard Worker# Copyright 2018-2023 The Khronos Group Inc. 3*90277196SAndroid Build Coastguard Worker# Copyright 2018-2023 Valve Corporation 4*90277196SAndroid Build Coastguard Worker# Copyright 2018-2023 LunarG, Inc. 5*90277196SAndroid Build Coastguard Worker# 6*90277196SAndroid Build Coastguard Worker# SPDX-License-Identifier: Apache-2.0 7*90277196SAndroid Build Coastguard Worker# ~~~ 8*90277196SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.15) 9*90277196SAndroid Build Coastguard Worker 10*90277196SAndroid Build Coastguard Worker# NOTE: Parsing the version like this is suboptimal but neccessary due to our release process: 11*90277196SAndroid Build Coastguard Worker# https://github.com/KhronosGroup/Vulkan-Headers/pull/346 12*90277196SAndroid Build Coastguard Worker# 13*90277196SAndroid Build Coastguard Worker# As shown a more robust approach would be just to add basic test code to check the project version. 14*90277196SAndroid Build Coastguard Workerfunction(vlk_get_header_version) 15*90277196SAndroid Build Coastguard Worker set(vulkan_core_header_file "${CMAKE_CURRENT_SOURCE_DIR}/include/vulkan/vulkan_core.h") 16*90277196SAndroid Build Coastguard Worker if (NOT EXISTS ${vulkan_core_header_file}) 17*90277196SAndroid Build Coastguard Worker message(FATAL_ERROR "Couldn't find vulkan_core.h!") 18*90277196SAndroid Build Coastguard Worker endif() 19*90277196SAndroid Build Coastguard Worker 20*90277196SAndroid Build Coastguard Worker file(READ ${vulkan_core_header_file} ver) 21*90277196SAndroid Build Coastguard Worker 22*90277196SAndroid Build Coastguard Worker if (ver MATCHES "#define[ ]+VK_HEADER_VERSION_COMPLETE[ ]+VK_MAKE_API_VERSION\\([ ]*[0-9]+,[ ]*([0-9]+),[ ]*([0-9]+),[ ]*VK_HEADER_VERSION[ ]*\\)") 23*90277196SAndroid Build Coastguard Worker set(MAJOR_VERSION "${CMAKE_MATCH_1}") 24*90277196SAndroid Build Coastguard Worker set(MINOR_VERSION "${CMAKE_MATCH_2}") 25*90277196SAndroid Build Coastguard Worker else() 26*90277196SAndroid Build Coastguard Worker message(FATAL_ERROR "Couldn't get major/minor version") 27*90277196SAndroid Build Coastguard Worker endif() 28*90277196SAndroid Build Coastguard Worker 29*90277196SAndroid Build Coastguard Worker if (ver MATCHES "#define[ ]+VK_HEADER_VERSION[ ]+([0-9]+)") 30*90277196SAndroid Build Coastguard Worker set(PATCH_VERSION "${CMAKE_MATCH_1}") 31*90277196SAndroid Build Coastguard Worker else() 32*90277196SAndroid Build Coastguard Worker message(FATAL_ERROR "Couldn't get the patch version") 33*90277196SAndroid Build Coastguard Worker endif() 34*90277196SAndroid Build Coastguard Worker 35*90277196SAndroid Build Coastguard Worker set(VK_VERSION_STRING "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" PARENT_SCOPE) 36*90277196SAndroid Build Coastguard Workerendfunction() 37*90277196SAndroid Build Coastguard Workervlk_get_header_version() 38*90277196SAndroid Build Coastguard Worker 39*90277196SAndroid Build Coastguard Workerproject(VULKAN_HEADERS LANGUAGES C CXX VERSION ${VK_VERSION_STRING}) 40*90277196SAndroid Build Coastguard Worker 41*90277196SAndroid Build Coastguard Workeradd_library(Vulkan-Headers INTERFACE) 42*90277196SAndroid Build Coastguard Workeradd_library(Vulkan::Headers ALIAS Vulkan-Headers) 43*90277196SAndroid Build Coastguard Workertarget_include_directories(Vulkan-Headers INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>) 44*90277196SAndroid Build Coastguard Worker 45*90277196SAndroid Build Coastguard Workerif (MSVC AND (MSVC_VERSION GREATER_EQUAL "1941") OR 46*90277196SAndroid Build Coastguard Worker CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "16.0" OR 47*90277196SAndroid Build Coastguard Worker CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "14.0") 48*90277196SAndroid Build Coastguard Worker set(COMPILER_SUPPORTS_CXX_MODULES TRUE) 49*90277196SAndroid Build Coastguard Workerendif() 50*90277196SAndroid Build Coastguard Worker 51*90277196SAndroid Build Coastguard Workeroption(VULKAN_HEADERS_ENABLE_MODULE "Enables building of the Vulkan C++ module. Default is true if supported by the CMake version and compilers" ${COMPILER_SUPPORTS_CXX_MODULES}) 52*90277196SAndroid Build Coastguard Worker 53*90277196SAndroid Build Coastguard Workerif (CMAKE_VERSION VERSION_GREATER_EQUAL "3.28" AND VULKAN_HEADERS_ENABLE_MODULE) 54*90277196SAndroid Build Coastguard Worker add_library(Vulkan-Module) 55*90277196SAndroid Build Coastguard Worker add_library(Vulkan::VulkanHppModule ALIAS Vulkan-Module) 56*90277196SAndroid Build Coastguard Worker target_sources(Vulkan-Module 57*90277196SAndroid Build Coastguard Worker PUBLIC 58*90277196SAndroid Build Coastguard Worker FILE_SET module 59*90277196SAndroid Build Coastguard Worker TYPE CXX_MODULES 60*90277196SAndroid Build Coastguard Worker BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include" 61*90277196SAndroid Build Coastguard Worker FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/vulkan/vulkan.cppm" 62*90277196SAndroid Build Coastguard Worker ) 63*90277196SAndroid Build Coastguard Worker target_compile_features(Vulkan-Module PUBLIC cxx_std_20) 64*90277196SAndroid Build Coastguard Worker target_link_libraries(Vulkan-Module PUBLIC Vulkan-Headers) 65*90277196SAndroid Build Coastguard Workerendif () 66*90277196SAndroid Build Coastguard Worker 67*90277196SAndroid Build Coastguard Workerif (CMAKE_VERSION VERSION_LESS "3.21") 68*90277196SAndroid Build Coastguard Worker # https://cmake.org/cmake/help/latest/variable/PROJECT_IS_TOP_LEVEL.html 69*90277196SAndroid Build Coastguard Worker string(COMPARE EQUAL ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} PROJECT_IS_TOP_LEVEL) 70*90277196SAndroid Build Coastguard Workerendif() 71*90277196SAndroid Build Coastguard Worker 72*90277196SAndroid Build Coastguard Workeroption(VULKAN_HEADERS_ENABLE_TESTS "Test Vulkan-Headers" ${PROJECT_IS_TOP_LEVEL}) 73*90277196SAndroid Build Coastguard Workeroption(VULKAN_HEADERS_ENABLE_INSTALL "Install Vulkan-Headers" ${PROJECT_IS_TOP_LEVEL}) 74*90277196SAndroid Build Coastguard Worker 75*90277196SAndroid Build Coastguard Workerif (VULKAN_HEADERS_ENABLE_TESTS) 76*90277196SAndroid Build Coastguard Worker enable_testing() # This is only effective in the top level CMakeLists.txt file. 77*90277196SAndroid Build Coastguard Worker add_subdirectory(tests) 78*90277196SAndroid Build Coastguard Workerendif() 79*90277196SAndroid Build Coastguard Worker 80*90277196SAndroid Build Coastguard Workerif (VULKAN_HEADERS_ENABLE_INSTALL) 81*90277196SAndroid Build Coastguard Worker include(GNUInstallDirs) 82*90277196SAndroid Build Coastguard Worker include(CMakePackageConfigHelpers) 83*90277196SAndroid Build Coastguard Worker 84*90277196SAndroid Build Coastguard Worker install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/vk_video" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 85*90277196SAndroid Build Coastguard Worker install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/vulkan" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 86*90277196SAndroid Build Coastguard Worker # Preserve source permissions https://github.com/KhronosGroup/Vulkan-Headers/issues/336 87*90277196SAndroid Build Coastguard Worker install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/registry" DESTINATION "${CMAKE_INSTALL_DATADIR}/vulkan" USE_SOURCE_PERMISSIONS) 88*90277196SAndroid Build Coastguard Worker 89*90277196SAndroid Build Coastguard Worker set_target_properties(Vulkan-Headers PROPERTIES EXPORT_NAME "Headers") 90*90277196SAndroid Build Coastguard Worker install(TARGETS Vulkan-Headers EXPORT VulkanHeadersConfig INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 91*90277196SAndroid Build Coastguard Worker 92*90277196SAndroid Build Coastguard Worker install(EXPORT VulkanHeadersConfig NAMESPACE "Vulkan::" DESTINATION "share/cmake/VulkanHeaders") 93*90277196SAndroid Build Coastguard Worker 94*90277196SAndroid Build Coastguard Worker set(version_config "${CMAKE_CURRENT_BINARY_DIR}/generated/VulkanHeadersConfigVersion.cmake") 95*90277196SAndroid Build Coastguard Worker write_basic_package_version_file("${version_config}" COMPATIBILITY SameMajorVersion ARCH_INDEPENDENT) 96*90277196SAndroid Build Coastguard Worker install(FILES "${version_config}" DESTINATION "share/cmake/VulkanHeaders") 97*90277196SAndroid Build Coastguard Workerendif() 98