Skip to content

Commit b905f36

Browse files
committed
Improve Vulkan SDK and VulkanHpp handling in CMake configuration
- Add checks for `VULKAN_SDK` environment variable with warnings and fallback handling. - Enhance Vulkan SDK detection with alternative paths and auto-setup for missing libraries or targets. - Add CMake logic to validate and create `vulkan.cppm` for `VulkanHpp` if not found. - Ensure all necessary directories and dependencies exist, providing meaningful error messages otherwise.
1 parent e339d80 commit b905f36

File tree

2 files changed

+99
-4
lines changed

2 files changed

+99
-4
lines changed

attachments/CMake/FindVulkanHpp.cmake

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ if(NOT VulkanHpp_INCLUDE_DIR OR NOT VulkanHpp_CPPM_DIR)
219219
file(MAKE_DIRECTORY ${VulkanHpp_CPPM_DIR}/vulkan)
220220

221221
# Create vulkan.cppm file
222-
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
222+
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
223223
"// Auto-generated vulkan.cppm file
224224
module;
225225
#include <vulkan/vulkan.hpp>
@@ -288,7 +288,7 @@ endif()
288288

289289
# Set the variables
290290
include(FindPackageHandleStandardArgs)
291-
find_package_handle_standard_args(VulkanHpp
291+
find_package_handle_standard_args(VulkanHpp
292292
REQUIRED_VARS VulkanHpp_INCLUDE_DIR
293293
FAIL_MESSAGE "Could NOT find VulkanHpp. Install it or set VulkanHpp_INCLUDE_DIR to the directory containing vulkan/vulkan.hpp"
294294
)
@@ -319,7 +319,7 @@ if(VulkanHpp_FOUND)
319319
message(STATUS "Creating vulkan.cppm in ${VulkanHpp_CPPM_DIR}")
320320

321321
# Create vulkan.cppm file
322-
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
322+
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
323323
"// Auto-generated vulkan.cppm file
324324
module;
325325
#include <vulkan/vulkan.hpp>
@@ -408,7 +408,7 @@ elseif(DEFINED VulkanHpp_SOURCE_DIR OR DEFINED vulkanhpp_SOURCE_DIR)
408408
message(STATUS "Creating vulkan.cppm in ${VulkanHpp_CPPM_DIR}")
409409

410410
# Create vulkan.cppm file
411-
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
411+
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
412412
"// Auto-generated vulkan.cppm file
413413
module;
414414
#include <vulkan/vulkan.hpp>

attachments/CMakeLists.txt

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,101 @@ cmake_minimum_required (VERSION 3.29)
33
# Enable C++ module dependency scanning
44
set(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+
611
project (VulkanTutorial)
712

813
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
914

1015
find_package (glfw3 REQUIRED)
1116
find_package (glm REQUIRED)
17+
18+
# Try to find Vulkan
1219
find_package (Vulkan REQUIRED)
20+
21+
# Check if Vulkan was found correctly
22+
if(NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR}")
23+
message(WARNING "Vulkan SDK not found in expected location: ${Vulkan_INCLUDE_DIR}")
24+
25+
# Try to find Vulkan in alternative locations
26+
if(DEFINED ENV{VULKAN_SDK})
27+
message(STATUS "Trying to find Vulkan SDK in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}")
28+
set(Vulkan_INCLUDE_DIR "$ENV{VULKAN_SDK}/include")
29+
if(EXISTS "${Vulkan_INCLUDE_DIR}")
30+
message(STATUS "Found Vulkan include directory at: ${Vulkan_INCLUDE_DIR}")
31+
32+
# Update Vulkan library path if needed
33+
if(NOT EXISTS "${Vulkan_LIBRARY}")
34+
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
35+
set(Vulkan_LIBRARY "$ENV{VULKAN_SDK}/lib/vulkan-1.lib")
36+
else()
37+
set(Vulkan_LIBRARY "$ENV{VULKAN_SDK}/lib/libvulkan.so")
38+
endif()
39+
message(STATUS "Setting Vulkan library to: ${Vulkan_LIBRARY}")
40+
endif()
41+
42+
# If the Vulkan::Vulkan target already exists, update its properties
43+
if(TARGET Vulkan::Vulkan)
44+
message(STATUS "Updating Vulkan::Vulkan target properties")
45+
set_target_properties(Vulkan::Vulkan PROPERTIES
46+
INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR}"
47+
IMPORTED_LOCATION "${Vulkan_LIBRARY}"
48+
)
49+
else()
50+
# Create the Vulkan::Vulkan target if it doesn't exist
51+
message(STATUS "Creating Vulkan::Vulkan target")
52+
add_library(Vulkan::Vulkan UNKNOWN IMPORTED)
53+
set_target_properties(Vulkan::Vulkan PROPERTIES
54+
INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR}"
55+
IMPORTED_LOCATION "${Vulkan_LIBRARY}"
56+
)
57+
endif()
58+
else()
59+
message(FATAL_ERROR "Vulkan include directory not found at: ${Vulkan_INCLUDE_DIR}")
60+
endif()
61+
else()
62+
message(FATAL_ERROR "Vulkan SDK not found. Please install Vulkan SDK or set VULKAN_SDK environment variable.")
63+
endif()
64+
endif()
65+
1366
find_package (VulkanHpp REQUIRED)
67+
68+
# Check if VulkanHpp_CPPM_DIR is set and exists
69+
if(NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR}")
70+
message(WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR}")
71+
72+
# Try to find VulkanHpp in VULKAN_SDK
73+
if(DEFINED ENV{VULKAN_SDK})
74+
message(STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}")
75+
set(VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK}/include")
76+
if(EXISTS "${VulkanHpp_CPPM_DIR}")
77+
message(STATUS "Found VulkanHpp CPPM directory at: ${VulkanHpp_CPPM_DIR}")
78+
79+
# Check if vulkan.cppm exists
80+
if(NOT EXISTS "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm")
81+
message(STATUS "vulkan.cppm not found, creating it")
82+
file(MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR}/vulkan")
83+
file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"
84+
"// Auto-generated vulkan.cppm file
85+
module;
86+
#include <vulkan/vulkan.hpp>
87+
export module vulkan;
88+
export namespace vk {
89+
using namespace VULKAN_HPP_NAMESPACE;
90+
}
91+
")
92+
endif()
93+
else()
94+
message(FATAL_ERROR "VulkanHpp CPPM directory not found at: ${VulkanHpp_CPPM_DIR}")
95+
endif()
96+
else()
97+
message(FATAL_ERROR "VulkanHpp CPPM directory not found and VULKAN_SDK environment variable is not set.")
98+
endif()
99+
endif()
100+
14101
find_package (tinyobjloader REQUIRED)
15102
find_package (TinyGLTF REQUIRED)
16103
find_package (KTX REQUIRED)
@@ -26,13 +113,20 @@ target_include_directories(VulkanCppModule
26113
PRIVATE
27114
"${Vulkan_INCLUDE_DIR}"
28115
)
116+
117+
# Check if Vulkan include directory exists
118+
if(NOT EXISTS "${Vulkan_INCLUDE_DIR}")
119+
message(FATAL_ERROR "Vulkan include directory not found: ${Vulkan_INCLUDE_DIR}. Please install Vulkan SDK or set VULKAN_SDK environment variable.")
120+
endif()
29121
target_link_libraries(VulkanCppModule
30122
PUBLIC
31123
Vulkan::Vulkan
32124
)
33125

34126
set_target_properties(VulkanCppModule PROPERTIES CXX_STANDARD 20)
35127

128+
# VulkanHpp_CPPM_DIR is already checked above
129+
36130
target_sources(VulkanCppModule
37131
PUBLIC
38132
FILE_SET cxx_modules TYPE CXX_MODULES
@@ -44,6 +138,7 @@ target_sources(VulkanCppModule
44138

45139

46140
# Add the vulkan.cppm file directly as a source file
141+
# (Checks for existence are already done above)
47142
target_sources(VulkanCppModule
48143
PRIVATE
49144
"${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm"

0 commit comments

Comments
 (0)