@@ -3,196 +3,13 @@ cmake_minimum_required (VERSION 3.29)
33# Enable C++ module dependency scanning
44set (CMAKE_CXX_SCAN_FOR_MODULES ON )
55
6- # Check if VULKAN_SDK environment variable is set
7- if (NOT DEFINED ENV{VULKAN_SDK})
8- message (WARNING "VULKAN_SDK environment variable is not set. This may cause issues with finding Vulkan SDK." )
9- endif ()
10-
11-
126project (VulkanTutorial)
137
148list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR} /CMake" )
159
1610find_package (glfw3 REQUIRED)
1711find_package (glm REQUIRED)
18-
19- # Try to find Vulkan
2012find_package (Vulkan REQUIRED)
21-
22- # Check if Vulkan was found correctly
23- if (NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR} " )
24- message (WARNING "Vulkan SDK not found in expected location: ${Vulkan_INCLUDE_DIR} " )
25-
26- # Try to find Vulkan in alternative locations
27- if (DEFINED ENV{VULKAN_SDK})
28- message (STATUS "Trying to find Vulkan SDK in VULKAN_SDK environment variable: $ENV{VULKAN_SDK} " )
29- set (Vulkan_INCLUDE_DIR "$ENV{VULKAN_SDK} /include" )
30- if (EXISTS "${Vulkan_INCLUDE_DIR} " )
31- message (STATUS "Found Vulkan include directory at: ${Vulkan_INCLUDE_DIR} " )
32-
33- # Update Vulkan library path if needed
34- if (NOT EXISTS "${Vulkan_LIBRARY} " )
35- if (CMAKE_SYSTEM_NAME STREQUAL "Windows" )
36- set (Vulkan_LIBRARY "$ENV{VULKAN_SDK} /lib/vulkan-1.lib" )
37- else ()
38- set (Vulkan_LIBRARY "$ENV{VULKAN_SDK} /lib/libvulkan.so" )
39- endif ()
40- message (STATUS "Setting Vulkan library to: ${Vulkan_LIBRARY} " )
41- endif ()
42-
43- # If the Vulkan::Vulkan target already exists, update its properties
44- if (TARGET Vulkan::Vulkan)
45- message (STATUS "Updating Vulkan::Vulkan target properties" )
46- set_target_properties (Vulkan::Vulkan PROPERTIES
47- INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR} "
48- IMPORTED_LOCATION "${Vulkan_LIBRARY} "
49- )
50- else ()
51- # Create the Vulkan::Vulkan target if it doesn't exist
52- message (STATUS "Creating Vulkan::Vulkan target" )
53- add_library (Vulkan::Vulkan UNKNOWN IMPORTED )
54- set_target_properties (Vulkan::Vulkan PROPERTIES
55- INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR} "
56- IMPORTED_LOCATION "${Vulkan_LIBRARY} "
57- )
58- endif ()
59- else ()
60- message (FATAL_ERROR "Vulkan include directory not found at: ${Vulkan_INCLUDE_DIR} " )
61- endif ()
62- else ()
63- message (FATAL_ERROR "Vulkan SDK not found. Please install Vulkan SDK or set VULKAN_SDK environment variable." )
64- endif ()
65- endif ()
66-
67- # Include the script to fix vulkan.cppm files
68- include (${CMAKE_CURRENT_LIST_DIR} /CMake/fix_vulkan_cppm.cmake)
69-
70- find_package (VulkanHpp REQUIRED)
71-
72- # Check if VulkanHpp_CPPM_DIR is set and exists
73- if (NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR} " )
74- message (WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR} " )
75-
76- # First check if vulkan.cppm exists in /usr/include/vulkan
77- if (EXISTS "/usr/include/vulkan/vulkan.cppm" )
78- message (STATUS "Found vulkan.cppm in /usr/include/vulkan" )
79-
80- # Create a copy in the build directory that we can modify
81- set (VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR} /include" )
82- file (MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR} /vulkan" )
83-
84- # Read the content of the system vulkan.cppm file
85- file (READ "/usr/include/vulkan/vulkan.cppm" VULKAN_CPPM_CONTENT)
86-
87- # Check if it's using the old format (without detail namespace)
88- if (VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::DispatchLoaderBase" AND
89- NOT VULKAN_CPPM_CONTENT MATCHES "namespace detail" )
90- message (STATUS "System vulkan.cppm file needs to be updated with detail namespace" )
91-
92- # Create a modified version that directly imports the detail symbols
93- file (WRITE "${VulkanHpp_CPPM_DIR} /vulkan/vulkan.cppm"
94- "// Modified vulkan.cppm file
95- module;
96- #include <vulkan/vulkan.hpp>
97- export module vulkan;
98- export namespace vk {
99- // Import symbols from the main namespace
100- using namespace VULKAN_HPP_NAMESPACE;
101-
102- // Import symbols from the detail namespace
103- using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase;
104- using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic;
105- using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic;
106- using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy;
107- using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared;
108- using VULKAN_HPP_NAMESPACE::detail::ObjectFree;
109- using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared;
110- using VULKAN_HPP_NAMESPACE::detail::ObjectRelease;
111- using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared;
112- using VULKAN_HPP_NAMESPACE::detail::PoolFree;
113- using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared;
114- using VULKAN_HPP_NAMESPACE::detail::createResultValueType;
115- using VULKAN_HPP_NAMESPACE::detail::resultCheck;
116- using VULKAN_HPP_NAMESPACE::detail::DynamicLoader;
117-
118- // Export detail namespace for other symbols
119- namespace detail {
120- using namespace VULKAN_HPP_NAMESPACE::detail;
121- }
122-
123- // Export raii namespace
124- namespace raii {
125- using namespace VULKAN_HPP_RAII_NAMESPACE;
126-
127- // Import symbols from the detail namespace
128- using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher;
129- using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher;
130- }
131- }
132- " )
133- else ()
134- # Just copy the file as is
135- file (COPY "/usr/include/vulkan/vulkan.cppm" DESTINATION "${VulkanHpp_CPPM_DIR} /vulkan" )
136- endif ()
137- # Try to find VulkanHpp in VULKAN_SDK
138- elseif (DEFINED ENV{VULKAN_SDK})
139- message (STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK} " )
140- set (VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK} /include" )
141- if (EXISTS "${VulkanHpp_CPPM_DIR} " )
142- message (STATUS "Found VulkanHpp CPPM directory at: ${VulkanHpp_CPPM_DIR} " )
143-
144- # Check if vulkan.cppm exists
145- if (NOT EXISTS "${VulkanHpp_CPPM_DIR} /vulkan/vulkan.cppm" )
146- message (STATUS "vulkan.cppm not found, creating it" )
147- file (MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR} /vulkan" )
148- file (WRITE "${VulkanHpp_CPPM_DIR} /vulkan/vulkan.cppm"
149- "// Auto-generated vulkan.cppm file
150- module;
151- #include <vulkan/vulkan.hpp>
152- export module vulkan;
153- export namespace vk {
154- using namespace VULKAN_HPP_NAMESPACE;
155-
156- // Export detail namespace symbols that might be referenced directly
157- namespace detail {
158- using namespace VULKAN_HPP_NAMESPACE::detail;
159- }
160-
161- // Import symbols from the detail namespace directly
162- using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase;
163- using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic;
164- using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic;
165- using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy;
166- using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared;
167- using VULKAN_HPP_NAMESPACE::detail::ObjectFree;
168- using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared;
169- using VULKAN_HPP_NAMESPACE::detail::ObjectRelease;
170- using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared;
171- using VULKAN_HPP_NAMESPACE::detail::PoolFree;
172- using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared;
173- using VULKAN_HPP_NAMESPACE::detail::createResultValueType;
174- using VULKAN_HPP_NAMESPACE::detail::resultCheck;
175- using VULKAN_HPP_NAMESPACE::detail::DynamicLoader;
176-
177- // Export raii namespace
178- namespace raii {
179- using namespace VULKAN_HPP_RAII_NAMESPACE;
180-
181- // Import symbols from the detail namespace
182- using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher;
183- using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher;
184- }
185- }
186- " )
187- endif ()
188- else ()
189- message (FATAL_ERROR "VulkanHpp CPPM directory not found at: ${VulkanHpp_CPPM_DIR} " )
190- endif ()
191- else ()
192- message (FATAL_ERROR "VulkanHpp CPPM directory not found and VULKAN_SDK environment variable is not set." )
193- endif ()
194- endif ()
195-
19613find_package (tinyobjloader REQUIRED)
19714find_package (tinygltf REQUIRED)
19815find_package (KTX REQUIRED)
@@ -208,35 +25,27 @@ target_include_directories(VulkanCppModule
20825 PRIVATE
20926 "${Vulkan_INCLUDE_DIR} "
21027)
211-
212- # Check if Vulkan include directory exists
213- if (NOT EXISTS "${Vulkan_INCLUDE_DIR} " )
214- message (FATAL_ERROR "Vulkan include directory not found: ${Vulkan_INCLUDE_DIR} . Please install Vulkan SDK or set VULKAN_SDK environment variable." )
215- endif ()
21628target_link_libraries (VulkanCppModule
21729 PUBLIC
21830 Vulkan::Vulkan
21931)
22032
22133set_target_properties (VulkanCppModule PROPERTIES CXX_STANDARD 20)
22234
223- # VulkanHpp_CPPM_DIR is already checked above
224-
22535target_sources (VulkanCppModule
22636 PUBLIC
22737 FILE_SET cxx_modules TYPE CXX_MODULES
22838 BASE_DIRS
229- "${VulkanHpp_CPPM_DIR } "
39+ "${Vulkan_INCLUDE_DIR } "
23040 FILES
231- "${VulkanHpp_CPPM_DIR } /vulkan/vulkan.cppm"
41+ "${Vulkan_INCLUDE_DIR } /vulkan/vulkan.cppm"
23242)
23343
23444
23545# Add the vulkan.cppm file directly as a source file
236- # (Checks for existence are already done above)
23746target_sources (VulkanCppModule
23847 PRIVATE
239- "${VulkanHpp_CPPM_DIR } /vulkan/vulkan.cppm"
48+ "${Vulkan_INCLUDE_DIR } /vulkan/vulkan.cppm"
24049)
24150
24251find_package (stb REQUIRED)
0 commit comments