summaryrefslogtreecommitdiffhomepage
path: root/CMakeLists.txt
blob: 7ab25eb0b49bd682b51cb1294a6ef0175b9da100 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# ~~~
# Copyright (c) 2018 Valve Corporation
# Copyright (c) 2018 LunarG, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ~~~

# CMake project initialization ---------------------------------------------------------------------------------------------------
# This section contains pre-project() initialization, and ends with the project() command.

cmake_minimum_required(VERSION 3.10.2)

# NONE = this project has no language toolchain requirement.
project(Vulkan-Headers NONE)
file(READ "include/vulkan/vulkan_core.h" ver)
string(REGEX MATCH "#define[ ]+VK_HEADER_VERSION_COMPLETE[ ]+VK_MAKE_VERSION\\([ ]*([0-9]+),[ ]*([0-9]+),[ ]*VK_HEADER_VERSION[ ]*\\)" _ ${ver})
set(VK_VERSION_MAJOR "${CMAKE_MATCH_1}")
set(VK_VERSION_MINOR "${CMAKE_MATCH_2}")
string(REGEX MATCH "#define[ ]+VK_HEADER_VERSION[ ]+([0-9]+)" _ ${ver})
set(VK_HEADER_VERSION "${CMAKE_MATCH_1}")
# check if version parsing was successful
if(VK_VERSION_MAJOR STREQUAL "")
    message(FATAL_ERROR "Error reading major version from 'include/vulkan/vulkan_core.h'")
endif()
if(VK_VERSION_MINOR STREQUAL "")
    message(FATAL_ERROR "Error reading minor version from 'include/vulkan/vulkan_core.h'")
endif()
if(VK_HEADER_VERSION STREQUAL "")
    message(FATAL_ERROR "Error reading header version from 'include/vulkan/vulkan_core.h'")
endif()
set(VK_VERSION_STRING "${VK_VERSION_MAJOR}.${VK_VERSION_MINOR}.${VK_HEADER_VERSION}")
message(STATUS "Found Vulkan-Headers VK_VERSION_STRING '${VK_VERSION_STRING}'")

option(VULKAN_HEADERS_SKIP_INSTALL "Skip install" OFF)

# User-interface declarations ----------------------------------------------------------------------------------------------------
# This section contains variables that affect development GUIs (e.g. CMake GUI and IDEs), such as option(), folders, and variables
# with the CACHE property.

include(GNUInstallDirs)

if(WIN32 AND CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    # Windows: if install locations not set by user, set install prefix to "<build_dir>\install".
    set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "default install path" FORCE)
endif()

# --------------------------------------------------------------------------------------------------------------------------------

# define exported targets for nested project builds to consume
add_library(Vulkan-Headers INTERFACE)
target_include_directories(Vulkan-Headers INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
add_library(Vulkan::Headers ALIAS Vulkan-Headers)

add_library(Vulkan-Registry INTERFACE)
target_include_directories(Vulkan-Registry INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/registry>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_DATADIR}/vulkan>
)
add_library(Vulkan::Registry ALIAS Vulkan-Registry)

# Installation
# This adds the following files to the install target
# - Vulkan Header files
# - Vulkan Registry files
# - CMake config files generated by CMake
#   - VulkanHeadersConfig.cmake:        searched for by find_package(VulkanHeaders)
#   - VulkanHeadersConfigVersion.cmake: provides version numbers
#   - VulkanHeadersTargets.cmake:       CMake target definitions used by config file
if(NOT VULKAN_HEADERS_SKIP_INSTALL)
    set(config_install_dir "${CMAKE_INSTALL_DATADIR}/cmake/VulkanHeaders")
    set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
    set(version_config "${generated_dir}/VulkanHeadersConfigVersion.cmake")
    set(project_config "${generated_dir}/VulkanHeadersConfig.cmake")
    set(TARGETS_EXPORT_NAME "VulkanHeadersTargets")
    set(namespace "Vulkan::")

    include(CMakePackageConfigHelpers)
    write_basic_package_version_file(
        "${version_config}"
        VERSION ${VK_VERSION_STRING}
        COMPATIBILITY AnyNewerVersion
    )
    configure_package_config_file(
        "cmake/Config.cmake.in"
        "${project_config}"
        INSTALL_DESTINATION "${config_install_dir}"
    )
    install(
        TARGETS Vulkan-Headers Vulkan-Registry
        EXPORT "${TARGETS_EXPORT_NAME}"
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
    install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/vulkan"
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    )
    install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/registry"
        DESTINATION ${CMAKE_INSTALL_DATADIR}/vulkan
    )
    install(FILES "${project_config}" "${version_config}"
        DESTINATION "${config_install_dir}"
    )
    install(
        EXPORT "${TARGETS_EXPORT_NAME}"
        NAMESPACE "${namespace}"
        DESTINATION "${config_install_dir}")

    # uninstall target
    if(NOT TARGET uninstall)
        configure_file(
            "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
            "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
            IMMEDIATE
            @ONLY)
        add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
    endif()
endif()