Skip to content

Commit 76d9f65

Browse files
committed
Enhance vulkan.cppm management in CMake for VulkanHpp
- Add logic to create or update `vulkan.cppm` with improved namespace exports. - Handle detection and modification of system `vulkan.cppm` files. - Include script for fixing outdated `vulkan.cppm` implementations.
1 parent 42b34ea commit 76d9f65

File tree

2 files changed

+121
-6
lines changed

2 files changed

+121
-6
lines changed

attachments/CMake/FindVulkanHpp.cmake

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,22 +215,48 @@ if(NOT VulkanHpp_INCLUDE_DIR OR NOT VulkanHpp_CPPM_DIR)
215215
set(VulkanHpp_CPPM_DIR ${VulkanHpp_SOURCE_DIR})
216216
else()
217217
# If vulkan.cppm doesn't exist, we need to create it
218-
set(VulkanHpp_CPPM_DIR ${CMAKE_CURRENT_BINARY_DIR}/VulkanHpp)
219-
file(MAKE_DIRECTORY ${VulkanHpp_CPPM_DIR}/vulkan)
218+
set(VulkanHpp_CPPM_DIR ${CMAKE_CURRENT_BINARY_DIR}/VulkanHpp)
219+
file(MAKE_DIRECTORY ${VulkanHpp_CPPM_DIR}/vulkan)
220220

221-
# Create vulkan.cppm file
222-
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
221+
# Create vulkan.cppm file
222+
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
223223
"// Auto-generated vulkan.cppm file
224224
module;
225225
#include <vulkan/vulkan.hpp>
226226
export module vulkan;
227227
export namespace vk {
228+
// Import symbols from the main namespace
228229
using namespace VULKAN_HPP_NAMESPACE;
229230
230-
// Export detail namespace symbols that might be referenced directly
231+
// Import symbols from the detail namespace
232+
using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase;
233+
using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic;
234+
using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic;
235+
using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy;
236+
using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared;
237+
using VULKAN_HPP_NAMESPACE::detail::ObjectFree;
238+
using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared;
239+
using VULKAN_HPP_NAMESPACE::detail::ObjectRelease;
240+
using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared;
241+
using VULKAN_HPP_NAMESPACE::detail::PoolFree;
242+
using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared;
243+
using VULKAN_HPP_NAMESPACE::detail::createResultValueType;
244+
using VULKAN_HPP_NAMESPACE::detail::resultCheck;
245+
using VULKAN_HPP_NAMESPACE::detail::DynamicLoader;
246+
247+
// Export detail namespace for other symbols
231248
namespace detail {
232249
using namespace VULKAN_HPP_NAMESPACE::detail;
233250
}
251+
252+
// Export raii namespace
253+
namespace raii {
254+
using namespace VULKAN_HPP_RAII_NAMESPACE;
255+
256+
// Import symbols from the detail namespace
257+
using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher;
258+
using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher;
259+
}
234260
}
235261
")
236262
endif()

attachments/CMakeLists.txt

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,78 @@ if(NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR}")
6464
endif()
6565
endif()
6666

67+
# Include the script to fix vulkan.cppm files
68+
include(${CMAKE_CURRENT_LIST_DIR}/CMake/fix_vulkan_cppm.cmake)
69+
6770
find_package (VulkanHpp REQUIRED)
6871

6972
# Check if VulkanHpp_CPPM_DIR is set and exists
7073
if(NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR}")
7174
message(WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR}")
7275

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()
73137
# Try to find VulkanHpp in VULKAN_SDK
74-
if(DEFINED ENV{VULKAN_SDK})
138+
elseif(DEFINED ENV{VULKAN_SDK})
75139
message(STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}")
76140
set(VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK}/include")
77141
if(EXISTS "${VulkanHpp_CPPM_DIR}")
@@ -93,6 +157,31 @@ export namespace vk {
93157
namespace detail {
94158
using namespace VULKAN_HPP_NAMESPACE::detail;
95159
}
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+
}
96185
}
97186
")
98187
endif()

0 commit comments

Comments
 (0)