2020-03-19 20:12:25 +00:00
# Copyright(c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of NVIDIA CORPORATION nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2022-12-20 09:09:01 +00:00
cmake_minimum_required ( VERSION 3.12 )
2020-03-19 20:12:25 +00:00
set_property ( GLOBAL PROPERTY USE_FOLDERS ON )
project ( VulkanHppGenerator )
2020-04-12 19:49:12 +00:00
find_program ( CLANG_FORMAT_EXECUTABLE NAMES clang-format )
if ( CLANG_FORMAT_EXECUTABLE )
2020-05-04 14:27:19 +00:00
# get the clang-format version string
execute_process ( COMMAND ${ CLANG_FORMAT_EXECUTABLE } "--version" OUTPUT_VARIABLE clangFormatVersion )
# filter out the actual version
2020-08-12 13:27:05 +00:00
string ( REGEX MATCH [0123456789.]+ clangFormatVersion "${clangFormatVersion}" )
2021-03-23 09:52:56 +00:00
# we need at least version 7.0.0 !
if ( clangFormatVersion VERSION_LESS 7.0.0 )
message ( WARNING " Found too old clang-format version <" ${ clangFormatVersion } ">, we need version 7 and up to nicely format vulkan.hpp and vulkan_raii.hpp" )
else ( )
message ( STATUS " Found clang-format version <" ${ clangFormatVersion } ">." )
2020-05-04 14:27:19 +00:00
add_definitions ( -DCLANG_FORMAT_EXECUTABLE= "${CLANG_FORMAT_EXECUTABLE}" )
2021-10-25 16:30:32 +00:00
if ( clangFormatVersion VERSION_LESS 11.0.0 )
2021-03-23 09:52:56 +00:00
message ( STATUS " Using .clang-format version 7." )
file ( READ ".clang-format_7" clangFormat )
2022-12-12 16:30:35 +00:00
elseif ( clangFormatVersion VERSION_LESS 12.0.0 )
message ( STATUS " Using .clang-format version 11." )
file ( READ ".clang-format_11" clangFormat )
elseif ( clangFormatVersion VERSION_LESS 13.0.0 )
message ( STATUS " Using .clang-format version 12." )
file ( READ ".clang-format_12" clangFormat )
elseif ( clangFormatVersion VERSION_LESS 14.0.0 )
message ( STATUS " Using .clang-format version 13." )
file ( READ ".clang-format_13" clangFormat )
2023-01-16 16:38:34 +00:00
elseif ( clangFormatVersion VERSION_LESS 15.0.0 )
2022-12-12 16:30:35 +00:00
message ( STATUS " Using .clang-format version 14." )
file ( READ ".clang-format_14" clangFormat )
2023-01-16 16:38:34 +00:00
else ( )
message ( STATUS " Using .clang-format version 15." )
file ( READ ".clang-format_15" clangFormat )
2021-03-23 09:52:56 +00:00
endif ( )
file ( WRITE ".clang-format" ${ clangFormat } )
2020-05-04 14:27:19 +00:00
endif ( )
2020-04-12 19:49:12 +00:00
else ( )
2021-03-23 09:52:56 +00:00
message ( WARNING " Could not find clang-format. Generated vulkan.hpp and vulkan_raii.hpp will not be nicely formatted." )
2020-04-12 19:49:12 +00:00
endif ( )
2020-07-30 07:21:05 +00:00
if ( NOT DEFINED CMAKE_CXX_STANDARD )
set ( CMAKE_CXX_STANDARD 11 )
endif ( )
2021-03-11 09:35:30 +00:00
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
2020-07-30 07:21:05 +00:00
2022-07-07 08:22:21 +00:00
message ( STATUS "CMAKE_CXX_STANDARD = <${CMAKE_CXX_STANDARD}>" )
2020-03-19 20:12:25 +00:00
2020-07-27 10:08:03 +00:00
if ( NOT DEFINED VulkanRegistry_DIR )
if ( DEFINED VULKAN_HPP_VULKAN_HEADERS_SRC_DIR )
2020-10-26 08:16:34 +00:00
set ( VulkanRegistry_DIR "${VULKAN_HPP_VULKAN_HEADERS_SRC_DIR}/registry" )
2020-07-27 10:08:03 +00:00
else ( )
2020-10-21 08:58:34 +00:00
set ( VulkanRegistry_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Vulkan-Headers/registry" )
2020-07-27 10:08:03 +00:00
endif ( )
2020-03-19 20:12:25 +00:00
endif ( )
2020-10-21 08:58:34 +00:00
file ( TO_NATIVE_PATH ${ VulkanRegistry_DIR } /vk.xml vk_spec )
2020-03-19 20:12:25 +00:00
string ( REPLACE "\\" "\\\\" vk_spec ${ vk_spec } )
add_definitions ( -DVK_SPEC= "${vk_spec}" )
2020-07-27 10:08:03 +00:00
if ( NOT DEFINED VulkanHeaders_INCLUDE_DIR )
if ( DEFINED VULKAN_HPP_PATH )
2020-08-24 13:58:53 +00:00
set ( VulkanHeaders_INCLUDE_DIR ${ VULKAN_HPP_PATH } )
2020-07-27 10:08:03 +00:00
else ( )
set ( VulkanHeaders_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
endif ( )
2020-03-19 20:12:25 +00:00
endif ( )
2020-07-27 10:08:03 +00:00
include_directories ( ${ VulkanHeaders_INCLUDE_DIR } )
2020-03-19 20:12:25 +00:00
set ( HEADERS
V u l k a n H p p G e n e r a t o r . h p p
)
set ( SOURCES
V u l k a n H p p G e n e r a t o r . c p p
)
if ( NOT DEFINED VULKAN_HPP_TINYXML2_SRC_DIR )
set ( VULKAN_HPP_TINYXML2_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tinyxml2" )
endif ( )
set ( TINYXML2_SOURCES
$ { V U L K A N _ H P P _ T I N Y X M L 2 _ S R C _ D I R } / t i n y x m l 2 . c p p
)
set ( TINYXML2_HEADERS
$ { V U L K A N _ H P P _ T I N Y X M L 2 _ S R C _ D I R } / t i n y x m l 2 . h
)
source_group ( headers FILES ${ HEADERS } )
source_group ( sources FILES ${ SOURCES } )
source_group ( TinyXML2\\headers FILES ${ TINYXML2_HEADERS } )
source_group ( TinyXML2\\sources FILES ${ TINYXML2_SOURCES } )
add_executable ( VulkanHppGenerator
$ { H E A D E R S }
$ { S O U R C E S }
$ { T I N Y X M L 2 _ S O U R C E S }
$ { T I N Y X M L 2 _ H E A D E R S }
)
2022-08-19 15:29:51 +00:00
set ( VK_GENERATED_VULKAN_HEADERS
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ e n u m s . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ f o r m a t _ t r a i t s . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ f u n c s . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ h a n d l e s . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ h a s h . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ r a i i . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ s t a t i c _ a s s e r t i o n s . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ s t r u c t s . h p p
$ { V u l k a n H e a d e r s _ I N C L U D E _ D I R } / v u l k a n / v u l k a n _ t o _ s t r i n g . h p p
)
2022-08-19 13:44:49 +00:00
file ( TO_NATIVE_PATH ${ VulkanHeaders_INCLUDE_DIR } /vulkan/vulkan.hpp vulkan_hpp )
string ( REPLACE "\\" "\\\\" vulkan_hpp ${ vulkan_hpp } )
2022-08-02 08:00:16 +00:00
target_compile_definitions ( ${ PROJECT_NAME } PUBLIC -DBASE_PATH= "${CMAKE_SOURCE_DIR}" )
2022-07-26 09:13:43 +00:00
2022-09-06 16:22:04 +00:00
set_property ( TARGET ${ PROJECT_NAME } PROPERTY CXX_STANDARD 20 )
2020-03-19 20:12:25 +00:00
2020-09-30 10:00:32 +00:00
if ( MSVC )
2022-07-26 09:13:43 +00:00
target_compile_options ( ${ PROJECT_NAME } PRIVATE /W4 /WX )
2021-01-07 15:04:52 +00:00
if ( MSVC_VER GREATER_EQUAL 1910 )
2022-07-26 09:13:43 +00:00
target_compile_options ( ${ PROJECT_NAME } PRIVATE /permissive- )
2021-01-07 15:04:52 +00:00
endif ( )
2020-09-30 10:00:32 +00:00
else ( MSVC )
2022-07-26 09:13:43 +00:00
target_compile_options ( ${ PROJECT_NAME } PRIVATE -Wall -Wextra -pedantic -Werror )
2020-09-30 10:00:32 +00:00
endif ( MSVC )
2022-07-26 09:13:43 +00:00
target_include_directories ( ${ PROJECT_NAME } PRIVATE ${ VULKAN_HPP_TINYXML2_SRC_DIR } )
2020-03-19 20:12:25 +00:00
option ( VULKAN_HPP_RUN_GENERATOR "Run the HPP generator" OFF )
if ( VULKAN_HPP_RUN_GENERATOR )
add_custom_command (
2022-07-26 09:13:43 +00:00
C O M M A N D $ { P R O J E C T _ N A M E }
2020-03-19 20:12:25 +00:00
O U T P U T " $ { v u l k a n _ h p p } "
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
2022-07-26 09:13:43 +00:00
C O M M E N T " r u n $ { P R O J E C T _ N A M E } "
D E P E N D S $ { P R O J E C T _ N A M E } " $ { v k _ s p e c } " )
2020-03-19 20:12:25 +00:00
add_custom_target ( build_vulkan_hpp ALL
D E P E N D S " $ { v u l k a n _ h p p } " " $ { v k _ s p e c } " )
endif ( )
2022-08-10 09:19:06 +00:00
option ( VULKAN_HPP_PRECOMPILE "Precompile vulkan.hpp and vulkan_raii.hpp for sample builds" ON )
function ( vulkan_hpp__setup_sample )
set ( options )
2022-09-01 06:53:55 +00:00
set ( oneValueArgs FOLDER NAME PCH_REUSE )
2022-08-10 09:19:06 +00:00
set ( multiValueArgs HEADERS INCLUDE_DIRS LIBS PCH SOURCES )
cmake_parse_arguments ( TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( ${ TARGET_NAME } STREQUAL "" )
message ( FATAL_ERROR "NAME must be defined in vulkan_hpp__setup_sample" )
endif ( )
project ( ${ TARGET_NAME } )
add_executable ( ${ TARGET_NAME } ${ TARGET_HEADERS } ${ TARGET_SOURCES } )
if ( TARGET_INCLUDE_DIRS )
target_include_directories ( ${ TARGET_NAME } PUBLIC ${ TARGET_INCLUDE_DIRS } )
endif ( )
if ( TARGET_FOLDER )
set_target_properties ( ${ TARGET_NAME } PROPERTIES FOLDER "${TARGET_FOLDER}" )
endif ( )
2022-09-01 06:53:55 +00:00
if ( VULKAN_HPP_PRECOMPILE )
if ( TARGET_PCH_REUSE )
target_precompile_headers ( ${ TARGET_NAME } REUSE_FROM "${TARGET_PCH_REUSE}" )
elseif ( TARGET_PCH )
target_precompile_headers ( ${ TARGET_NAME } PRIVATE "${TARGET_PCH}" )
endif ( )
2022-08-10 09:19:06 +00:00
endif ( )
if ( TARGET_LIBS )
target_link_libraries ( ${ TARGET_NAME } PRIVATE "${TARGET_LIBS}" )
endif ( )
endfunction ( )
function ( vulkan_hpp__setup_sample_static )
set ( options )
set ( oneValueArgs NAME )
set ( multiValueArgs )
cmake_parse_arguments ( TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( NOT SAMPLES_BUILD_ONLY_DYNAMIC )
find_package ( Vulkan REQUIRED )
vulkan_hpp__setup_sample (
N A M E $ { T A R G E T _ N A M E }
F O L D E R S a m p l e s
P C H < v u l k a n / v u l k a n . h p p >
S O U R C E S $ { T A R G E T _ N A M E } . c p p
L I B S $ { V u l k a n _ L I B R A R I E S } )
target_compile_definitions ( 01_InitInstance PUBLIC VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=0 )
endif ( )
endfunction ( )
function ( vulkan_hpp__setup_sample_dynamic )
set ( options )
set ( oneValueArgs NAME )
set ( multiValueArgs HEADERS INCLUDE_DIRS SOURCES )
cmake_parse_arguments ( TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( NOT TARGET_SOURCES )
set ( TARGET_SOURCES ${ TARGET_NAME } .cpp )
endif ( )
vulkan_hpp__setup_sample (
N A M E $ { T A R G E T _ N A M E }
F O L D E R S a m p l e s
2022-09-01 06:53:55 +00:00
P C H _ R E U S E u t i l s
2022-08-10 09:19:06 +00:00
I N C L U D E _ D I R S $ { T A R G E T _ I N C L U D E _ D I R S }
H E A D E R S $ { T A R G E T _ H E A D E R S }
S O U R C E S $ { T A R G E T _ S O U R C E S }
L I B S u t i l s )
endfunction ( )
function ( vulkan_hpp__setup_sample_raii )
set ( options )
set ( oneValueArgs NAME )
set ( multiValueArgs HEADERS INCLUDE_DIRS SOURCES )
cmake_parse_arguments ( TARGET "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
if ( NOT TARGET_SOURCES )
set ( TARGET_SOURCES ${ TARGET_NAME } .cpp )
endif ( )
vulkan_hpp__setup_sample (
N A M E R A I I _ $ { T A R G E T _ N A M E }
F O L D E R R A I I _ S a m p l e s
2022-09-01 06:53:55 +00:00
P C H _ R E U S E u t i l s
2022-08-10 09:19:06 +00:00
I N C L U D E _ D I R S $ { T A R G E T _ I N C L U D E _ D I R S }
H E A D E R S $ { T A R G E T _ H E A D E R S }
S O U R C E S $ { T A R G E T _ S O U R C E S }
L I B S u t i l s )
endfunction ( )
2020-03-19 20:12:25 +00:00
option ( SAMPLES_BUILD "Build samples" OFF )
if ( SAMPLES_BUILD )
# external libraries
add_subdirectory ( glm )
set ( GLFW_BUILD_EXAMPLES OFF )
set ( GLFW_BUILD_TESTS OFF )
add_subdirectory ( glfw )
add_subdirectory ( glslang )
# samples
add_subdirectory ( samples )
2021-02-17 09:49:59 +00:00
add_subdirectory ( RAII_Samples )
2020-03-19 20:12:25 +00:00
endif ( )
option ( TESTS_BUILD "Build tests" OFF )
if ( TESTS_BUILD )
add_subdirectory ( tests )
endif ( )
if ( ${ VULKAN_HPP_INSTALL } )
2022-08-19 15:29:51 +00:00
include ( GNUInstallDirs )
install ( FILES ${ VK_GENERATED_VULKAN_HEADERS } DESTINATION ${ CMAKE_INSTALL_INCLUDEDIR } /vulkan )
2020-03-19 20:12:25 +00:00
endif ( )