From 4f0418b079474cb2954f5462c750b77cdd3c0452 Mon Sep 17 00:00:00 2001 From: swinston Date: Tue, 15 Jul 2025 23:45:21 -0700 Subject: [PATCH 01/11] Remove deprecated `Findtinygltf.cmake` file --- attachments/CMake/Findtinygltf.cmake | 162 --------------------------- 1 file changed, 162 deletions(-) delete mode 100644 attachments/CMake/Findtinygltf.cmake diff --git a/attachments/CMake/Findtinygltf.cmake b/attachments/CMake/Findtinygltf.cmake deleted file mode 100644 index 6bbaafa3..00000000 --- a/attachments/CMake/Findtinygltf.cmake +++ /dev/null @@ -1,162 +0,0 @@ -# Findtinygltf.cmake -# -# Finds the tinygltf library -# -# This will define the following variables -# -# tinygltf_FOUND -# tinygltf_INCLUDE_DIRS -# -# and the following imported targets -# -# tinygltf::tinygltf -# - -# First, try to find nlohmann_json -find_package(nlohmann_json QUIET) -if(NOT nlohmann_json_FOUND) - include(FetchContent) - message(STATUS "nlohmann_json not found, fetching from GitHub...") - FetchContent_Declare( - nlohmann_json - GIT_REPOSITORY https://github.com/nlohmann/json.git - GIT_TAG v3.11.2 # Use a specific tag for stability - ) - FetchContent_MakeAvailable(nlohmann_json) -endif() - -# Try to find tinygltf using standard find_package -find_path(tinygltf_INCLUDE_DIR - NAMES tiny_gltf.h - PATHS - ${PC_tinygltf_INCLUDE_DIRS} - /usr/include - /usr/local/include - $ENV{VULKAN_SDK}/include - ${ANDROID_NDK}/sources/third_party - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../external - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/external - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/third_party - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/include - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../external - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../third_party - ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../include - PATH_SUFFIXES tinygltf include -) - -# If not found, use FetchContent to download and build -if(NOT tinygltf_INCLUDE_DIR) - # If not found, use FetchContent to download and build - include(FetchContent) - - message(STATUS "tinygltf not found, fetching from GitHub...") - FetchContent_Declare( - tinygltf - GIT_REPOSITORY https://github.com/syoyo/tinygltf.git - GIT_TAG v2.8.18 # Use a specific tag for stability - ) - - # Set policy to suppress the deprecation warning - if(POLICY CMP0169) - cmake_policy(SET CMP0169 OLD) - endif() - - # Populate the content but don't configure it yet - FetchContent_GetProperties(tinygltf) - if(NOT tinygltf_POPULATED) - FetchContent_Populate(tinygltf) - - # Update the minimum required CMake version to avoid deprecation warning - file(READ "${tinygltf_SOURCE_DIR}/CMakeLists.txt" TINYGLTF_CMAKE_CONTENT) - string(REPLACE "cmake_minimum_required(VERSION 3.6)" - "cmake_minimum_required(VERSION 3.10)" - TINYGLTF_CMAKE_CONTENT "${TINYGLTF_CMAKE_CONTENT}") - file(WRITE "${tinygltf_SOURCE_DIR}/CMakeLists.txt" "${TINYGLTF_CMAKE_CONTENT}") - - # Create a symbolic link to make nlohmann/json.hpp available - if(EXISTS "${tinygltf_SOURCE_DIR}/json.hpp") - file(MAKE_DIRECTORY "${tinygltf_SOURCE_DIR}/nlohmann") - file(CREATE_LINK "${tinygltf_SOURCE_DIR}/json.hpp" "${tinygltf_SOURCE_DIR}/nlohmann/json.hpp" SYMBOLIC) - endif() - - # Set tinygltf to header-only mode - set(TINYGLTF_HEADER_ONLY ON CACHE BOOL "Use header only version" FORCE) - set(TINYGLTF_INSTALL OFF CACHE BOOL "Do not install tinygltf" FORCE) - - # Add the subdirectory after modifying the CMakeLists.txt - add_subdirectory(${tinygltf_SOURCE_DIR} ${tinygltf_BINARY_DIR}) - else() - # If already populated, just make it available - FetchContent_MakeAvailable(tinygltf) - endif() - - # Get the include directory from the target - get_target_property(tinygltf_INCLUDE_DIR tinygltf INTERFACE_INCLUDE_DIRECTORIES) - if(NOT tinygltf_INCLUDE_DIR) - # If we can't get the include directory from the target, use the source directory - FetchContent_GetProperties(tinygltf SOURCE_DIR tinygltf_SOURCE_DIR) - set(tinygltf_INCLUDE_DIR ${tinygltf_SOURCE_DIR}) - endif() -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(tinygltf - REQUIRED_VARS tinygltf_INCLUDE_DIR -) - -if(tinygltf_FOUND) - set(tinygltf_INCLUDE_DIRS ${tinygltf_INCLUDE_DIR}) - - if(NOT TARGET tinygltf::tinygltf) - add_library(tinygltf::tinygltf INTERFACE IMPORTED) - set_target_properties(tinygltf::tinygltf PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${tinygltf_INCLUDE_DIRS}" - INTERFACE_COMPILE_DEFINITIONS "TINYGLTF_IMPLEMENTATION;TINYGLTF_NO_EXTERNAL_IMAGE;TINYGLTF_NO_STB_IMAGE;TINYGLTF_NO_STB_IMAGE_WRITE" - ) - if(TARGET nlohmann_json::nlohmann_json) - target_link_libraries(tinygltf::tinygltf INTERFACE nlohmann_json::nlohmann_json) - endif() - endif() -elseif(TARGET tinygltf) - # If find_package_handle_standard_args failed but we have a tinygltf target from FetchContent - # Create an alias for the tinygltf target - if(NOT TARGET tinygltf::tinygltf) - add_library(tinygltf_wrapper INTERFACE) - target_link_libraries(tinygltf_wrapper INTERFACE tinygltf) - target_compile_definitions(tinygltf_wrapper INTERFACE - TINYGLTF_IMPLEMENTATION - TINYGLTF_NO_EXTERNAL_IMAGE - TINYGLTF_NO_STB_IMAGE - TINYGLTF_NO_STB_IMAGE_WRITE - ) - if(TARGET nlohmann_json::nlohmann_json) - target_link_libraries(tinygltf_wrapper INTERFACE nlohmann_json::nlohmann_json) - endif() - add_library(tinygltf::tinygltf ALIAS tinygltf_wrapper) - endif() - - # Set variables to indicate that tinygltf was found - set(tinygltf_FOUND TRUE) - set(TINYGLTF_FOUND TRUE) - - # Set include directories - get_target_property(tinygltf_INCLUDE_DIR tinygltf INTERFACE_INCLUDE_DIRECTORIES) - if(tinygltf_INCLUDE_DIR) - set(tinygltf_INCLUDE_DIRS ${tinygltf_INCLUDE_DIR}) - else() - # If we can't get the include directory from the target, use the source directory - FetchContent_GetProperties(tinygltf SOURCE_DIR tinygltf_SOURCE_DIR) - set(tinygltf_INCLUDE_DIR ${tinygltf_SOURCE_DIR}) - set(tinygltf_INCLUDE_DIRS ${tinygltf_INCLUDE_DIR}) - - # Explicitly set the include directory on the target - if(TARGET tinygltf) - set_target_properties(tinygltf PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${tinygltf_INCLUDE_DIR}" - ) - endif() - endif() -endif() - -mark_as_advanced(tinygltf_INCLUDE_DIR) From e339d80c2eacb7917dca473af538387ac28f4b4e Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 00:09:49 -0700 Subject: [PATCH 02/11] Add `VulkanHpp` as a required dependency and update module paths - Include `VulkanHpp` in CMake configuration. - Update Vulkan module inclusion paths to use `${VulkanHpp_CPPM_DIR}` over `${Vulkan_INCLUDE_DIR}` for consistency. --- attachments/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index fd1630a2..b0ba6fcc 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -10,6 +10,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") find_package (glfw3 REQUIRED) find_package (glm REQUIRED) find_package (Vulkan REQUIRED) +find_package (VulkanHpp REQUIRED) find_package (tinyobjloader REQUIRED) find_package (TinyGLTF REQUIRED) find_package (KTX REQUIRED) @@ -36,16 +37,16 @@ target_sources(VulkanCppModule PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES BASE_DIRS - "${Vulkan_INCLUDE_DIR}" + "${VulkanHpp_CPPM_DIR}" FILES - "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" + "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" ) # Add the vulkan.cppm file directly as a source file target_sources(VulkanCppModule PRIVATE - "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" + "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" ) find_package(stb REQUIRED) From b905f36c41cf3e1331c48cbbf02477c22abefafd Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 00:26:48 -0700 Subject: [PATCH 03/11] 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. --- attachments/CMake/FindVulkanHpp.cmake | 8 +-- attachments/CMakeLists.txt | 95 +++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 4 deletions(-) diff --git a/attachments/CMake/FindVulkanHpp.cmake b/attachments/CMake/FindVulkanHpp.cmake index 16b13e07..dfa41f23 100644 --- a/attachments/CMake/FindVulkanHpp.cmake +++ b/attachments/CMake/FindVulkanHpp.cmake @@ -219,7 +219,7 @@ if(NOT VulkanHpp_INCLUDE_DIR OR NOT VulkanHpp_CPPM_DIR) file(MAKE_DIRECTORY ${VulkanHpp_CPPM_DIR}/vulkan) # Create vulkan.cppm file - file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" + file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" "// Auto-generated vulkan.cppm file module; #include @@ -288,7 +288,7 @@ endif() # Set the variables include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(VulkanHpp +find_package_handle_standard_args(VulkanHpp REQUIRED_VARS VulkanHpp_INCLUDE_DIR FAIL_MESSAGE "Could NOT find VulkanHpp. Install it or set VulkanHpp_INCLUDE_DIR to the directory containing vulkan/vulkan.hpp" ) @@ -319,7 +319,7 @@ if(VulkanHpp_FOUND) message(STATUS "Creating vulkan.cppm in ${VulkanHpp_CPPM_DIR}") # Create vulkan.cppm file - file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" + file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" "// Auto-generated vulkan.cppm file module; #include @@ -408,7 +408,7 @@ elseif(DEFINED VulkanHpp_SOURCE_DIR OR DEFINED vulkanhpp_SOURCE_DIR) message(STATUS "Creating vulkan.cppm in ${VulkanHpp_CPPM_DIR}") # Create vulkan.cppm file - file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" + file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" "// Auto-generated vulkan.cppm file module; #include diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index b0ba6fcc..07112b1f 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -3,14 +3,101 @@ cmake_minimum_required (VERSION 3.29) # Enable C++ module dependency scanning set(CMAKE_CXX_SCAN_FOR_MODULES ON) +# Check if VULKAN_SDK environment variable is set +if(NOT DEFINED ENV{VULKAN_SDK}) + message(WARNING "VULKAN_SDK environment variable is not set. This may cause issues with finding Vulkan SDK.") +endif() + project (VulkanTutorial) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") find_package (glfw3 REQUIRED) find_package (glm REQUIRED) + +# Try to find Vulkan find_package (Vulkan REQUIRED) + +# Check if Vulkan was found correctly +if(NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR}") + message(WARNING "Vulkan SDK not found in expected location: ${Vulkan_INCLUDE_DIR}") + + # Try to find Vulkan in alternative locations + if(DEFINED ENV{VULKAN_SDK}) + message(STATUS "Trying to find Vulkan SDK in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}") + set(Vulkan_INCLUDE_DIR "$ENV{VULKAN_SDK}/include") + if(EXISTS "${Vulkan_INCLUDE_DIR}") + message(STATUS "Found Vulkan include directory at: ${Vulkan_INCLUDE_DIR}") + + # Update Vulkan library path if needed + if(NOT EXISTS "${Vulkan_LIBRARY}") + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(Vulkan_LIBRARY "$ENV{VULKAN_SDK}/lib/vulkan-1.lib") + else() + set(Vulkan_LIBRARY "$ENV{VULKAN_SDK}/lib/libvulkan.so") + endif() + message(STATUS "Setting Vulkan library to: ${Vulkan_LIBRARY}") + endif() + + # If the Vulkan::Vulkan target already exists, update its properties + if(TARGET Vulkan::Vulkan) + message(STATUS "Updating Vulkan::Vulkan target properties") + set_target_properties(Vulkan::Vulkan PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vulkan_LIBRARY}" + ) + else() + # Create the Vulkan::Vulkan target if it doesn't exist + message(STATUS "Creating Vulkan::Vulkan target") + add_library(Vulkan::Vulkan UNKNOWN IMPORTED) + set_target_properties(Vulkan::Vulkan PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vulkan_LIBRARY}" + ) + endif() + else() + message(FATAL_ERROR "Vulkan include directory not found at: ${Vulkan_INCLUDE_DIR}") + endif() + else() + message(FATAL_ERROR "Vulkan SDK not found. Please install Vulkan SDK or set VULKAN_SDK environment variable.") + endif() +endif() + find_package (VulkanHpp REQUIRED) + +# Check if VulkanHpp_CPPM_DIR is set and exists +if(NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR}") + message(WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR}") + + # Try to find VulkanHpp in VULKAN_SDK + if(DEFINED ENV{VULKAN_SDK}) + message(STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}") + set(VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK}/include") + if(EXISTS "${VulkanHpp_CPPM_DIR}") + message(STATUS "Found VulkanHpp CPPM directory at: ${VulkanHpp_CPPM_DIR}") + + # Check if vulkan.cppm exists + if(NOT EXISTS "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm") + message(STATUS "vulkan.cppm not found, creating it") + file(MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR}/vulkan") + file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" +"// Auto-generated vulkan.cppm file +module; +#include +export module vulkan; +export namespace vk { + using namespace VULKAN_HPP_NAMESPACE; +} +") + endif() + else() + message(FATAL_ERROR "VulkanHpp CPPM directory not found at: ${VulkanHpp_CPPM_DIR}") + endif() + else() + message(FATAL_ERROR "VulkanHpp CPPM directory not found and VULKAN_SDK environment variable is not set.") + endif() +endif() + find_package (tinyobjloader REQUIRED) find_package (TinyGLTF REQUIRED) find_package (KTX REQUIRED) @@ -26,6 +113,11 @@ target_include_directories(VulkanCppModule PRIVATE "${Vulkan_INCLUDE_DIR}" ) + +# Check if Vulkan include directory exists +if(NOT EXISTS "${Vulkan_INCLUDE_DIR}") + message(FATAL_ERROR "Vulkan include directory not found: ${Vulkan_INCLUDE_DIR}. Please install Vulkan SDK or set VULKAN_SDK environment variable.") +endif() target_link_libraries(VulkanCppModule PUBLIC Vulkan::Vulkan @@ -33,6 +125,8 @@ target_link_libraries(VulkanCppModule set_target_properties(VulkanCppModule PROPERTIES CXX_STANDARD 20) +# VulkanHpp_CPPM_DIR is already checked above + target_sources(VulkanCppModule PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES @@ -44,6 +138,7 @@ target_sources(VulkanCppModule # Add the vulkan.cppm file directly as a source file +# (Checks for existence are already done above) target_sources(VulkanCppModule PRIVATE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" From b389bcc1a7066451de0015ea14cc6cf12d118b83 Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 01:20:54 -0700 Subject: [PATCH 04/11] Detect and handle Vulkan SDK version changes in CMake - Extract Vulkan SDK version from environment variable. - Add cache-based version detection to identify changes. - Clear related CMake cache entries on version update. - Cache the current Vulkan SDK version for future checks. --- attachments/CMakeLists.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index 07112b1f..ac9fb738 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -8,6 +8,28 @@ if(NOT DEFINED ENV{VULKAN_SDK}) message(WARNING "VULKAN_SDK environment variable is not set. This may cause issues with finding Vulkan SDK.") endif() +# Extract Vulkan SDK version from path to detect version changes +if(DEFINED ENV{VULKAN_SDK}) + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+" VULKAN_SDK_VERSION "$ENV{VULKAN_SDK}") + + # Check if cached version exists and is different from current version + if(DEFINED CACHE{VULKAN_SDK_CACHED_VERSION} AND NOT VULKAN_SDK_VERSION STREQUAL VULKAN_SDK_CACHED_VERSION) + message(STATUS "Vulkan SDK version changed from ${VULKAN_SDK_CACHED_VERSION} to ${VULKAN_SDK_VERSION}") + message(STATUS "Clearing CMake cache to ensure correct paths are used") + + # Force CMake to reconfigure by removing cache entries related to Vulkan + unset(Vulkan_INCLUDE_DIR CACHE) + unset(Vulkan_LIBRARY CACHE) + unset(VulkanHpp_CPPM_DIR CACHE) + unset(GLSLANG_VALIDATOR CACHE) + unset(SLANGC_EXECUTABLE CACHE) + endif() + + # Store current version in cache + set(VULKAN_SDK_CACHED_VERSION ${VULKAN_SDK_VERSION} CACHE STRING "Cached Vulkan SDK version" FORCE) + message(STATUS "Using Vulkan SDK version: ${VULKAN_SDK_VERSION}") +endif() + project (VulkanTutorial) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") From a91f239e082a10be4df84e6cb065fd6488a3d9e4 Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 01:35:20 -0700 Subject: [PATCH 05/11] Add Vulkan SDK symlink creation and cleanup cached version handling - Update workflow to create and manage Vulkan SDK version-specific symlinks on Linux. - Remove outdated version caching logic from `CMakeLists.txt`. --- .github/workflows/workflow.yml | 65 ++++++++++++++++++++++++++++++++++ attachments/CMakeLists.txt | 21 ----------- 2 files changed, 65 insertions(+), 21 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 50507d43..bccbcb9c 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -307,6 +307,71 @@ jobs: - name: Install Vulkan SDK run: ${{ matrix.vulkan-install }} + - name: Create Vulkan SDK version symlinks (Ubuntu) + if: runner.os == 'Linux' + run: | + # Get the current Vulkan SDK version + CURRENT_VERSION=$(basename $(dirname $VULKAN_SDK)) + echo "Current Vulkan SDK version: $CURRENT_VERSION" + + # Create a directory to store version information + VULKAN_BASE_DIR=$(dirname $(dirname $VULKAN_SDK)) + echo "Vulkan base directory: $VULKAN_BASE_DIR" + + # Create a symlink for the 'latest' directory + mkdir -p $VULKAN_BASE_DIR/latest + ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/latest/x86_64 + echo "Created symlink from latest to $CURRENT_VERSION" + + # Create a file to track the current version for future runs + echo $CURRENT_VERSION > $VULKAN_BASE_DIR/current_version.txt + + # Check if there are any previous versions we need to create symlinks for + if [ -f "$VULKAN_BASE_DIR/previous_versions.txt" ]; then + echo "Found previous versions file, creating symlinks for all previous versions" + while read -r version; do + if [ "$version" != "$CURRENT_VERSION" ] && [ -n "$version" ]; then + echo "Creating symlink from $version to $CURRENT_VERSION" + mkdir -p $VULKAN_BASE_DIR/$version + ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/$version/x86_64 + fi + done < $VULKAN_BASE_DIR/previous_versions.txt + fi + + # Add current version to the list of previous versions for future runs + if [ ! -f "$VULKAN_BASE_DIR/previous_versions.txt" ] || ! grep -q "^$CURRENT_VERSION$" "$VULKAN_BASE_DIR/previous_versions.txt"; then + echo $CURRENT_VERSION >> $VULKAN_BASE_DIR/previous_versions.txt + fi + + # For the first run or if we need to handle hardcoded paths in existing build files, + # create symlinks for known versions that might be referenced + for version in "1.4.313.0" "1.4.321.0"; do + if [ "$version" != "$CURRENT_VERSION" ]; then + echo "Creating symlink from $version to $CURRENT_VERSION" + mkdir -p $VULKAN_BASE_DIR/$version + ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/$version/x86_64 + fi + done + + # Find any version references in build files and create symlinks for them + if [ -d "${{github.workspace}}/attachments/build" ]; then + echo "Scanning build directory for version references..." + # Find all version patterns like X.Y.ZZZ.W in build files + FOUND_VERSIONS=$(grep -r -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" ${{github.workspace}}/attachments/build 2>/dev/null | grep -v "$CURRENT_VERSION" | sort | uniq || echo "") + + for version in $FOUND_VERSIONS; do + if [[ $version =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && [ "$version" != "$CURRENT_VERSION" ]; then + echo "Found version reference in build files: $version, creating symlink" + mkdir -p $VULKAN_BASE_DIR/$version + ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/$version/x86_64 + fi + done + fi + + # List all created symlinks + echo "Created the following Vulkan SDK version symlinks:" + find $VULKAN_BASE_DIR -type l -exec ls -la {} \; + - name: Verify Vulkan Installation (Windows) if: runner.os == 'Windows' run: | diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index ac9fb738..8c6174b2 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -8,27 +8,6 @@ if(NOT DEFINED ENV{VULKAN_SDK}) message(WARNING "VULKAN_SDK environment variable is not set. This may cause issues with finding Vulkan SDK.") endif() -# Extract Vulkan SDK version from path to detect version changes -if(DEFINED ENV{VULKAN_SDK}) - string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+" VULKAN_SDK_VERSION "$ENV{VULKAN_SDK}") - - # Check if cached version exists and is different from current version - if(DEFINED CACHE{VULKAN_SDK_CACHED_VERSION} AND NOT VULKAN_SDK_VERSION STREQUAL VULKAN_SDK_CACHED_VERSION) - message(STATUS "Vulkan SDK version changed from ${VULKAN_SDK_CACHED_VERSION} to ${VULKAN_SDK_VERSION}") - message(STATUS "Clearing CMake cache to ensure correct paths are used") - - # Force CMake to reconfigure by removing cache entries related to Vulkan - unset(Vulkan_INCLUDE_DIR CACHE) - unset(Vulkan_LIBRARY CACHE) - unset(VulkanHpp_CPPM_DIR CACHE) - unset(GLSLANG_VALIDATOR CACHE) - unset(SLANGC_EXECUTABLE CACHE) - endif() - - # Store current version in cache - set(VULKAN_SDK_CACHED_VERSION ${VULKAN_SDK_VERSION} CACHE STRING "Cached Vulkan SDK version" FORCE) - message(STATUS "Using Vulkan SDK version: ${VULKAN_SDK_VERSION}") -endif() project (VulkanTutorial) From 42b34ead1e91f97f2f01657d5e08d68d85039781 Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 09:17:01 -0700 Subject: [PATCH 06/11] Export `detail` namespace symbols in VulkanHpp for improved direct referencing. --- attachments/CMake/FindVulkanHpp.cmake | 15 +++++++++++++++ attachments/CMakeLists.txt | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/attachments/CMake/FindVulkanHpp.cmake b/attachments/CMake/FindVulkanHpp.cmake index dfa41f23..28ab2996 100644 --- a/attachments/CMake/FindVulkanHpp.cmake +++ b/attachments/CMake/FindVulkanHpp.cmake @@ -226,6 +226,11 @@ module; export module vulkan; export namespace vk { using namespace VULKAN_HPP_NAMESPACE; + + // Export detail namespace symbols that might be referenced directly + namespace detail { + using namespace VULKAN_HPP_NAMESPACE::detail; + } } ") endif() @@ -326,6 +331,11 @@ module; export module vulkan; export namespace vk { using namespace VULKAN_HPP_NAMESPACE; + + // Export detail namespace symbols that might be referenced directly + namespace detail { + using namespace VULKAN_HPP_NAMESPACE::detail; + } } ") endif() @@ -415,6 +425,11 @@ module; export module vulkan; export namespace vk { using namespace VULKAN_HPP_NAMESPACE; + + // Export detail namespace symbols that might be referenced directly + namespace detail { + using namespace VULKAN_HPP_NAMESPACE::detail; + } } ") endif() diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index 8c6174b2..6bfebdb7 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -88,6 +88,11 @@ module; export module vulkan; export namespace vk { using namespace VULKAN_HPP_NAMESPACE; + + // Export detail namespace symbols that might be referenced directly + namespace detail { + using namespace VULKAN_HPP_NAMESPACE::detail; + } } ") endif() From 76d9f6541cd4086bff3a1a0730f323290e35e6a9 Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 11:59:19 -0700 Subject: [PATCH 07/11] 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. --- attachments/CMake/FindVulkanHpp.cmake | 36 +++++++++-- attachments/CMakeLists.txt | 91 ++++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 6 deletions(-) diff --git a/attachments/CMake/FindVulkanHpp.cmake b/attachments/CMake/FindVulkanHpp.cmake index 28ab2996..ecb2b174 100644 --- a/attachments/CMake/FindVulkanHpp.cmake +++ b/attachments/CMake/FindVulkanHpp.cmake @@ -215,22 +215,48 @@ if(NOT VulkanHpp_INCLUDE_DIR OR NOT VulkanHpp_CPPM_DIR) set(VulkanHpp_CPPM_DIR ${VulkanHpp_SOURCE_DIR}) else() # If vulkan.cppm doesn't exist, we need to create it - set(VulkanHpp_CPPM_DIR ${CMAKE_CURRENT_BINARY_DIR}/VulkanHpp) - file(MAKE_DIRECTORY ${VulkanHpp_CPPM_DIR}/vulkan) + set(VulkanHpp_CPPM_DIR ${CMAKE_CURRENT_BINARY_DIR}/VulkanHpp) + file(MAKE_DIRECTORY ${VulkanHpp_CPPM_DIR}/vulkan) - # Create vulkan.cppm file - file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" + # Create vulkan.cppm file + file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" "// Auto-generated vulkan.cppm file module; #include export module vulkan; export namespace vk { + // Import symbols from the main namespace using namespace VULKAN_HPP_NAMESPACE; - // Export detail namespace symbols that might be referenced directly + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectFree; + using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; + using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; + using VULKAN_HPP_NAMESPACE::detail::PoolFree; + using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; + using VULKAN_HPP_NAMESPACE::detail::createResultValueType; + using VULKAN_HPP_NAMESPACE::detail::resultCheck; + using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; + + // Export detail namespace for other symbols namespace detail { using namespace VULKAN_HPP_NAMESPACE::detail; } + + // Export raii namespace + namespace raii { + using namespace VULKAN_HPP_RAII_NAMESPACE; + + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; + using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; + } } ") endif() diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index 6bfebdb7..4454210b 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -64,14 +64,78 @@ if(NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR}") endif() endif() +# Include the script to fix vulkan.cppm files +include(${CMAKE_CURRENT_LIST_DIR}/CMake/fix_vulkan_cppm.cmake) + find_package (VulkanHpp REQUIRED) # Check if VulkanHpp_CPPM_DIR is set and exists if(NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR}") message(WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR}") + # First check if vulkan.cppm exists in /usr/include/vulkan + if(EXISTS "/usr/include/vulkan/vulkan.cppm") + message(STATUS "Found vulkan.cppm in /usr/include/vulkan") + + # Create a copy in the build directory that we can modify + set(VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR}/include") + file(MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR}/vulkan") + + # Read the content of the system vulkan.cppm file + file(READ "/usr/include/vulkan/vulkan.cppm" VULKAN_CPPM_CONTENT) + + # Check if it's using the old format (without detail namespace) + if(VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::DispatchLoaderBase" AND + NOT VULKAN_CPPM_CONTENT MATCHES "namespace detail") + message(STATUS "System vulkan.cppm file needs to be updated with detail namespace") + + # Create a modified version that directly imports the detail symbols + file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" +"// Modified vulkan.cppm file +module; +#include +export module vulkan; +export namespace vk { + // Import symbols from the main namespace + using namespace VULKAN_HPP_NAMESPACE; + + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectFree; + using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; + using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; + using VULKAN_HPP_NAMESPACE::detail::PoolFree; + using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; + using VULKAN_HPP_NAMESPACE::detail::createResultValueType; + using VULKAN_HPP_NAMESPACE::detail::resultCheck; + using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; + + // Export detail namespace for other symbols + namespace detail { + using namespace VULKAN_HPP_NAMESPACE::detail; + } + + // Export raii namespace + namespace raii { + using namespace VULKAN_HPP_RAII_NAMESPACE; + + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; + using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; + } +} +") + else() + # Just copy the file as is + file(COPY "/usr/include/vulkan/vulkan.cppm" DESTINATION "${VulkanHpp_CPPM_DIR}/vulkan") + endif() # Try to find VulkanHpp in VULKAN_SDK - if(DEFINED ENV{VULKAN_SDK}) + elseif(DEFINED ENV{VULKAN_SDK}) message(STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}") set(VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK}/include") if(EXISTS "${VulkanHpp_CPPM_DIR}") @@ -93,6 +157,31 @@ export namespace vk { namespace detail { using namespace VULKAN_HPP_NAMESPACE::detail; } + + // Import symbols from the detail namespace directly + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectFree; + using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; + using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; + using VULKAN_HPP_NAMESPACE::detail::PoolFree; + using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; + using VULKAN_HPP_NAMESPACE::detail::createResultValueType; + using VULKAN_HPP_NAMESPACE::detail::resultCheck; + using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; + + // Export raii namespace + namespace raii { + using namespace VULKAN_HPP_RAII_NAMESPACE; + + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; + using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; + } } ") endif() From 0ae3fa8f7dcf8634298d309c4b81574dceee55f7 Mon Sep 17 00:00:00 2001 From: swinston Date: Wed, 16 Jul 2025 12:02:28 -0700 Subject: [PATCH 08/11] Add script to fix outdated `vulkan.cppm` files in CMake setup - Introduce `fix_vulkan_cppm.cmake` to detect and fix `vulkan.cppm` files using outdated formats. - Ensure proper handling of `detail` namespace imports to align with updated standards. - Add logic to manage write permissions and create modified copies when required. --- attachments/CMake/fix_vulkan_cppm.cmake | 147 ++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 attachments/CMake/fix_vulkan_cppm.cmake diff --git a/attachments/CMake/fix_vulkan_cppm.cmake b/attachments/CMake/fix_vulkan_cppm.cmake new file mode 100644 index 00000000..6e1f6dda --- /dev/null +++ b/attachments/CMake/fix_vulkan_cppm.cmake @@ -0,0 +1,147 @@ +# This script checks for vulkan.cppm files and fixes them if they have the old format +# without direct imports from the detail namespace + +# Function to fix a vulkan.cppm file +function(fix_vulkan_cppm_file file_path) + # Read the content of the file + file(READ "${file_path}" VULKAN_CPPM_CONTENT) + + # Check if it's using the old format (without direct detail imports) + if(VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::DispatchLoaderBase" AND + NOT VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase") + message(STATUS "Fixing vulkan.cppm file at: ${file_path}") + + # Create a modified version that directly imports the detail symbols + file(WRITE "${file_path}" +"// Modified vulkan.cppm file +module; +#include +export module vulkan; +export namespace vk { + // Import symbols from the main namespace + using namespace VULKAN_HPP_NAMESPACE; + + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; + using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; + using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectFree; + using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; + using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; + using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; + using VULKAN_HPP_NAMESPACE::detail::PoolFree; + using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; + using VULKAN_HPP_NAMESPACE::detail::createResultValueType; + using VULKAN_HPP_NAMESPACE::detail::resultCheck; + using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; + + // Export detail namespace for other symbols + namespace detail { + using namespace VULKAN_HPP_NAMESPACE::detail; + } + + // Export raii namespace + namespace raii { + using namespace VULKAN_HPP_RAII_NAMESPACE; + + // Import symbols from the detail namespace + using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; + using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; + } +} +") + message(STATUS "Fixed vulkan.cppm file at: ${file_path}") + else() + message(STATUS "vulkan.cppm file at ${file_path} already has the correct format or is not a standard vulkan.cppm file") + endif() +endfunction() + +# Check if vulkan.cppm exists in /usr/include/vulkan +if(EXISTS "/usr/include/vulkan/vulkan.cppm") + message(STATUS "Found vulkan.cppm in /usr/include/vulkan") + + # Try to fix the file directly + execute_process( + COMMAND ${CMAKE_COMMAND} -E echo "Checking write permission for /usr/include/vulkan/vulkan.cppm" + COMMAND_ECHO STDOUT + ) + + # Try to create a temporary file to check write permission + execute_process( + COMMAND ${CMAKE_COMMAND} -E touch /usr/include/vulkan/vulkan.cppm.tmp + RESULT_VARIABLE WRITE_RESULT + ERROR_QUIET + ) + + if(WRITE_RESULT EQUAL 0) + # We have write permission, remove the temporary file + execute_process( + COMMAND ${CMAKE_COMMAND} -E remove /usr/include/vulkan/vulkan.cppm.tmp + ) + + # Fix the file directly + fix_vulkan_cppm_file("/usr/include/vulkan/vulkan.cppm") + else() + message(STATUS "No write permission for /usr/include/vulkan/vulkan.cppm, creating a copy in the build directory") + + # Create a copy in the build directory that we can modify + set(VULKAN_CPPM_COPY "${CMAKE_BINARY_DIR}/include/vulkan/vulkan.cppm") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/vulkan") + file(COPY "/usr/include/vulkan/vulkan.cppm" DESTINATION "${CMAKE_BINARY_DIR}/include/vulkan") + + # Fix the copy + fix_vulkan_cppm_file("${VULKAN_CPPM_COPY}") + + # Add the include directory to the include path + include_directories(BEFORE "${CMAKE_BINARY_DIR}/include") + + # Set the VulkanHpp_CPPM_DIR variable + set(VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR}/include" CACHE PATH "Path to the directory containing vulkan.cppm" FORCE) + endif() +endif() + +# Check if vulkan.cppm exists in the Vulkan SDK +if(DEFINED ENV{VULKAN_SDK} AND EXISTS "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm") + message(STATUS "Found vulkan.cppm in Vulkan SDK") + + # Try to fix the file directly + execute_process( + COMMAND ${CMAKE_COMMAND} -E echo "Checking write permission for $ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm" + COMMAND_ECHO STDOUT + ) + + # Try to create a temporary file to check write permission + execute_process( + COMMAND ${CMAKE_COMMAND} -E touch "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm.tmp" + RESULT_VARIABLE WRITE_RESULT + ERROR_QUIET + ) + + if(WRITE_RESULT EQUAL 0) + # We have write permission, remove the temporary file + execute_process( + COMMAND ${CMAKE_COMMAND} -E remove "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm.tmp" + ) + + # Fix the file directly + fix_vulkan_cppm_file("$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm") + else() + message(STATUS "No write permission for $ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm, creating a copy in the build directory") + + # Create a copy in the build directory that we can modify + set(VULKAN_CPPM_COPY "${CMAKE_BINARY_DIR}/include/vulkan/vulkan.cppm") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/vulkan") + file(COPY "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm" DESTINATION "${CMAKE_BINARY_DIR}/include/vulkan") + + # Fix the copy + fix_vulkan_cppm_file("${VULKAN_CPPM_COPY}") + + # Add the include directory to the include path + include_directories(BEFORE "${CMAKE_BINARY_DIR}/include") + + # Set the VulkanHpp_CPPM_DIR variable + set(VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR}/include" CACHE PATH "Path to the directory containing vulkan.cppm" FORCE) + endif() +endif() From c764f8c3a569d90b2d6c2916b40a441b0661daa0 Mon Sep 17 00:00:00 2001 From: swinston Date: Fri, 18 Jul 2025 16:16:34 -0700 Subject: [PATCH 09/11] Replace `TinyGLTF` with `tinygltf` and redesign fallback behavior for missing library. --- ...{FindTinyGLTF.cmake => Findtinygltf.cmake} | 83 ++++++++++++------- attachments/CMakeLists.txt | 2 +- 2 files changed, 53 insertions(+), 32 deletions(-) rename attachments/CMake/{FindTinyGLTF.cmake => Findtinygltf.cmake} (54%) diff --git a/attachments/CMake/FindTinyGLTF.cmake b/attachments/CMake/Findtinygltf.cmake similarity index 54% rename from attachments/CMake/FindTinyGLTF.cmake rename to attachments/CMake/Findtinygltf.cmake index f01469ae..d1caec25 100644 --- a/attachments/CMake/FindTinyGLTF.cmake +++ b/attachments/CMake/Findtinygltf.cmake @@ -32,7 +32,7 @@ find_path(TinyGLTF_INCLUDE_DIR ) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(TinyGLTF +find_package_handle_standard_args(tinygltf REQUIRED_VARS TinyGLTF_INCLUDE_DIR FAIL_MESSAGE "" # Suppress the error message to allow our fallback ) @@ -51,41 +51,62 @@ if(TinyGLTF_FOUND) endif() endif() else() - # If not found, use FetchContent to download and build - include(FetchContent) + # If not found, create a custom tinygltf implementation + message(STATUS "TinyGLTF not found, creating a custom implementation...") - message(STATUS "TinyGLTF not found, fetching from GitHub...") - FetchContent_Declare( - tinygltf - GIT_REPOSITORY https://github.com/syoyo/tinygltf.git - GIT_TAG v2.8.18 # Use a specific tag for stability + # Create a directory for our custom tinygltf implementation + set(TINYGLTF_DIR "${CMAKE_CURRENT_BINARY_DIR}/tinygltf") + file(REMOVE_RECURSE "${TINYGLTF_DIR}") + file(MAKE_DIRECTORY "${TINYGLTF_DIR}") + + # Download the necessary files directly + file(DOWNLOAD + "https://raw.githubusercontent.com/syoyo/tinygltf/v2.8.18/tiny_gltf.h" + "${TINYGLTF_DIR}/tiny_gltf.h" + SHOW_PROGRESS ) - # Configure tinygltf before making it available - FetchContent_GetProperties(tinygltf) - if(NOT tinygltf_POPULATED) - FetchContent_Populate(tinygltf) - - # Update the minimum required CMake version to avoid deprecation warning - file(READ "${tinygltf_SOURCE_DIR}/CMakeLists.txt" TINYGLTF_CMAKE_CONTENT) - string(REPLACE "cmake_minimum_required(VERSION 3.6)" - "cmake_minimum_required(VERSION 3.10)" - TINYGLTF_CMAKE_CONTENT "${TINYGLTF_CMAKE_CONTENT}") - file(WRITE "${tinygltf_SOURCE_DIR}/CMakeLists.txt" "${TINYGLTF_CMAKE_CONTENT}") - - # Create a symbolic link to make nlohmann/json.hpp available - if(EXISTS "${tinygltf_SOURCE_DIR}/json.hpp") - file(MAKE_DIRECTORY "${tinygltf_SOURCE_DIR}/nlohmann") - file(CREATE_LINK "${tinygltf_SOURCE_DIR}/json.hpp" "${tinygltf_SOURCE_DIR}/nlohmann/json.hpp" SYMBOLIC) - endif() + file(DOWNLOAD + "https://raw.githubusercontent.com/syoyo/tinygltf/v2.8.18/json.hpp" + "${TINYGLTF_DIR}/json.hpp" + SHOW_PROGRESS + ) - # Set tinygltf to header-only mode - set(TINYGLTF_HEADER_ONLY ON CACHE BOOL "Use header only version" FORCE) - set(TINYGLTF_INSTALL OFF CACHE BOOL "Do not install tinygltf" FORCE) + file(DOWNLOAD + "https://raw.githubusercontent.com/syoyo/tinygltf/v2.8.18/stb_image.h" + "${TINYGLTF_DIR}/stb_image.h" + SHOW_PROGRESS + ) - # Add the subdirectory after modifying the CMakeLists.txt - add_subdirectory(${tinygltf_SOURCE_DIR} ${tinygltf_BINARY_DIR}) - endif() + file(DOWNLOAD + "https://raw.githubusercontent.com/syoyo/tinygltf/v2.8.18/stb_image_write.h" + "${TINYGLTF_DIR}/stb_image_write.h" + SHOW_PROGRESS + ) + + # Create a symbolic link to make nlohmann/json.hpp available + file(MAKE_DIRECTORY "${TINYGLTF_DIR}/nlohmann") + file(CREATE_LINK "${TINYGLTF_DIR}/json.hpp" "${TINYGLTF_DIR}/nlohmann/json.hpp" SYMBOLIC) + + # Create a simple CMakeLists.txt file + file(WRITE "${TINYGLTF_DIR}/CMakeLists.txt" " +cmake_minimum_required(VERSION 3.10...3.29) +project(tinygltf) + +if(NOT TARGET tinygltf) + add_library(tinygltf INTERFACE) + target_include_directories(tinygltf INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + target_compile_definitions(tinygltf INTERFACE + TINYGLTF_IMPLEMENTATION + TINYGLTF_NO_EXTERNAL_IMAGE + TINYGLTF_NO_STB_IMAGE + TINYGLTF_NO_STB_IMAGE_WRITE + ) +endif() +") + + # Add the subdirectory + add_subdirectory(${TINYGLTF_DIR} ${CMAKE_CURRENT_BINARY_DIR}/tinygltf-build) # Create an alias for the tinygltf target if(NOT TARGET tinygltf::tinygltf) diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index 4454210b..819d5485 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -194,7 +194,7 @@ export namespace vk { endif() find_package (tinyobjloader REQUIRED) -find_package (TinyGLTF REQUIRED) +find_package (tinygltf REQUIRED) find_package (KTX REQUIRED) # set up Vulkan C++ module From f2c04e5f80852e59774d4eb91f8e713c15216fa5 Mon Sep 17 00:00:00 2001 From: swinston Date: Fri, 18 Jul 2025 16:23:44 -0700 Subject: [PATCH 10/11] Revert the Linux CI changes. --- attachments/CMakeLists.txt | 197 +------------------------------------ 1 file changed, 3 insertions(+), 194 deletions(-) diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index 819d5485..5648cb92 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -3,196 +3,13 @@ cmake_minimum_required (VERSION 3.29) # Enable C++ module dependency scanning set(CMAKE_CXX_SCAN_FOR_MODULES ON) -# Check if VULKAN_SDK environment variable is set -if(NOT DEFINED ENV{VULKAN_SDK}) - message(WARNING "VULKAN_SDK environment variable is not set. This may cause issues with finding Vulkan SDK.") -endif() - - project (VulkanTutorial) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") find_package (glfw3 REQUIRED) find_package (glm REQUIRED) - -# Try to find Vulkan find_package (Vulkan REQUIRED) - -# Check if Vulkan was found correctly -if(NOT Vulkan_FOUND OR NOT EXISTS "${Vulkan_INCLUDE_DIR}") - message(WARNING "Vulkan SDK not found in expected location: ${Vulkan_INCLUDE_DIR}") - - # Try to find Vulkan in alternative locations - if(DEFINED ENV{VULKAN_SDK}) - message(STATUS "Trying to find Vulkan SDK in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}") - set(Vulkan_INCLUDE_DIR "$ENV{VULKAN_SDK}/include") - if(EXISTS "${Vulkan_INCLUDE_DIR}") - message(STATUS "Found Vulkan include directory at: ${Vulkan_INCLUDE_DIR}") - - # Update Vulkan library path if needed - if(NOT EXISTS "${Vulkan_LIBRARY}") - if(CMAKE_SYSTEM_NAME STREQUAL "Windows") - set(Vulkan_LIBRARY "$ENV{VULKAN_SDK}/lib/vulkan-1.lib") - else() - set(Vulkan_LIBRARY "$ENV{VULKAN_SDK}/lib/libvulkan.so") - endif() - message(STATUS "Setting Vulkan library to: ${Vulkan_LIBRARY}") - endif() - - # If the Vulkan::Vulkan target already exists, update its properties - if(TARGET Vulkan::Vulkan) - message(STATUS "Updating Vulkan::Vulkan target properties") - set_target_properties(Vulkan::Vulkan PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR}" - IMPORTED_LOCATION "${Vulkan_LIBRARY}" - ) - else() - # Create the Vulkan::Vulkan target if it doesn't exist - message(STATUS "Creating Vulkan::Vulkan target") - add_library(Vulkan::Vulkan UNKNOWN IMPORTED) - set_target_properties(Vulkan::Vulkan PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIR}" - IMPORTED_LOCATION "${Vulkan_LIBRARY}" - ) - endif() - else() - message(FATAL_ERROR "Vulkan include directory not found at: ${Vulkan_INCLUDE_DIR}") - endif() - else() - message(FATAL_ERROR "Vulkan SDK not found. Please install Vulkan SDK or set VULKAN_SDK environment variable.") - endif() -endif() - -# Include the script to fix vulkan.cppm files -include(${CMAKE_CURRENT_LIST_DIR}/CMake/fix_vulkan_cppm.cmake) - -find_package (VulkanHpp REQUIRED) - -# Check if VulkanHpp_CPPM_DIR is set and exists -if(NOT DEFINED VulkanHpp_CPPM_DIR OR NOT EXISTS "${VulkanHpp_CPPM_DIR}") - message(WARNING "VulkanHpp CPPM directory not found: ${VulkanHpp_CPPM_DIR}") - - # First check if vulkan.cppm exists in /usr/include/vulkan - if(EXISTS "/usr/include/vulkan/vulkan.cppm") - message(STATUS "Found vulkan.cppm in /usr/include/vulkan") - - # Create a copy in the build directory that we can modify - set(VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR}/include") - file(MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR}/vulkan") - - # Read the content of the system vulkan.cppm file - file(READ "/usr/include/vulkan/vulkan.cppm" VULKAN_CPPM_CONTENT) - - # Check if it's using the old format (without detail namespace) - if(VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::DispatchLoaderBase" AND - NOT VULKAN_CPPM_CONTENT MATCHES "namespace detail") - message(STATUS "System vulkan.cppm file needs to be updated with detail namespace") - - # Create a modified version that directly imports the detail symbols - file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" -"// Modified vulkan.cppm file -module; -#include -export module vulkan; -export namespace vk { - // Import symbols from the main namespace - using namespace VULKAN_HPP_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectFree; - using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; - using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; - using VULKAN_HPP_NAMESPACE::detail::PoolFree; - using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; - using VULKAN_HPP_NAMESPACE::detail::createResultValueType; - using VULKAN_HPP_NAMESPACE::detail::resultCheck; - using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; - - // Export detail namespace for other symbols - namespace detail { - using namespace VULKAN_HPP_NAMESPACE::detail; - } - - // Export raii namespace - namespace raii { - using namespace VULKAN_HPP_RAII_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; - using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; - } -} -") - else() - # Just copy the file as is - file(COPY "/usr/include/vulkan/vulkan.cppm" DESTINATION "${VulkanHpp_CPPM_DIR}/vulkan") - endif() - # Try to find VulkanHpp in VULKAN_SDK - elseif(DEFINED ENV{VULKAN_SDK}) - message(STATUS "Trying to find VulkanHpp in VULKAN_SDK environment variable: $ENV{VULKAN_SDK}") - set(VulkanHpp_CPPM_DIR "$ENV{VULKAN_SDK}/include") - if(EXISTS "${VulkanHpp_CPPM_DIR}") - message(STATUS "Found VulkanHpp CPPM directory at: ${VulkanHpp_CPPM_DIR}") - - # Check if vulkan.cppm exists - if(NOT EXISTS "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm") - message(STATUS "vulkan.cppm not found, creating it") - file(MAKE_DIRECTORY "${VulkanHpp_CPPM_DIR}/vulkan") - file(WRITE "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" -"// Auto-generated vulkan.cppm file -module; -#include -export module vulkan; -export namespace vk { - using namespace VULKAN_HPP_NAMESPACE; - - // Export detail namespace symbols that might be referenced directly - namespace detail { - using namespace VULKAN_HPP_NAMESPACE::detail; - } - - // Import symbols from the detail namespace directly - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectFree; - using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; - using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; - using VULKAN_HPP_NAMESPACE::detail::PoolFree; - using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; - using VULKAN_HPP_NAMESPACE::detail::createResultValueType; - using VULKAN_HPP_NAMESPACE::detail::resultCheck; - using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; - - // Export raii namespace - namespace raii { - using namespace VULKAN_HPP_RAII_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; - using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; - } -} -") - endif() - else() - message(FATAL_ERROR "VulkanHpp CPPM directory not found at: ${VulkanHpp_CPPM_DIR}") - endif() - else() - message(FATAL_ERROR "VulkanHpp CPPM directory not found and VULKAN_SDK environment variable is not set.") - endif() -endif() - find_package (tinyobjloader REQUIRED) find_package (tinygltf REQUIRED) find_package (KTX REQUIRED) @@ -208,11 +25,6 @@ target_include_directories(VulkanCppModule PRIVATE "${Vulkan_INCLUDE_DIR}" ) - -# Check if Vulkan include directory exists -if(NOT EXISTS "${Vulkan_INCLUDE_DIR}") - message(FATAL_ERROR "Vulkan include directory not found: ${Vulkan_INCLUDE_DIR}. Please install Vulkan SDK or set VULKAN_SDK environment variable.") -endif() target_link_libraries(VulkanCppModule PUBLIC Vulkan::Vulkan @@ -220,23 +32,20 @@ target_link_libraries(VulkanCppModule set_target_properties(VulkanCppModule PROPERTIES CXX_STANDARD 20) -# VulkanHpp_CPPM_DIR is already checked above - target_sources(VulkanCppModule PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES BASE_DIRS - "${VulkanHpp_CPPM_DIR}" + "${Vulkan_INCLUDE_DIR}" FILES - "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" + "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" ) # Add the vulkan.cppm file directly as a source file -# (Checks for existence are already done above) target_sources(VulkanCppModule PRIVATE - "${VulkanHpp_CPPM_DIR}/vulkan/vulkan.cppm" + "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" ) find_package(stb REQUIRED) From 0344d019690b9a5099a7c66cf300fcaf7cdfe568 Mon Sep 17 00:00:00 2001 From: swinston Date: Fri, 18 Jul 2025 16:30:18 -0700 Subject: [PATCH 11/11] Simplify VulkanHpp configuration and remove outdated Vulkan SDK symlink logic in CI. --- .github/workflows/workflow.yml | 65 ----------- attachments/CMake/FindVulkanHpp.cmake | 41 ------- attachments/CMake/fix_vulkan_cppm.cmake | 147 ------------------------ 3 files changed, 253 deletions(-) delete mode 100644 attachments/CMake/fix_vulkan_cppm.cmake diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index bccbcb9c..50507d43 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -307,71 +307,6 @@ jobs: - name: Install Vulkan SDK run: ${{ matrix.vulkan-install }} - - name: Create Vulkan SDK version symlinks (Ubuntu) - if: runner.os == 'Linux' - run: | - # Get the current Vulkan SDK version - CURRENT_VERSION=$(basename $(dirname $VULKAN_SDK)) - echo "Current Vulkan SDK version: $CURRENT_VERSION" - - # Create a directory to store version information - VULKAN_BASE_DIR=$(dirname $(dirname $VULKAN_SDK)) - echo "Vulkan base directory: $VULKAN_BASE_DIR" - - # Create a symlink for the 'latest' directory - mkdir -p $VULKAN_BASE_DIR/latest - ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/latest/x86_64 - echo "Created symlink from latest to $CURRENT_VERSION" - - # Create a file to track the current version for future runs - echo $CURRENT_VERSION > $VULKAN_BASE_DIR/current_version.txt - - # Check if there are any previous versions we need to create symlinks for - if [ -f "$VULKAN_BASE_DIR/previous_versions.txt" ]; then - echo "Found previous versions file, creating symlinks for all previous versions" - while read -r version; do - if [ "$version" != "$CURRENT_VERSION" ] && [ -n "$version" ]; then - echo "Creating symlink from $version to $CURRENT_VERSION" - mkdir -p $VULKAN_BASE_DIR/$version - ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/$version/x86_64 - fi - done < $VULKAN_BASE_DIR/previous_versions.txt - fi - - # Add current version to the list of previous versions for future runs - if [ ! -f "$VULKAN_BASE_DIR/previous_versions.txt" ] || ! grep -q "^$CURRENT_VERSION$" "$VULKAN_BASE_DIR/previous_versions.txt"; then - echo $CURRENT_VERSION >> $VULKAN_BASE_DIR/previous_versions.txt - fi - - # For the first run or if we need to handle hardcoded paths in existing build files, - # create symlinks for known versions that might be referenced - for version in "1.4.313.0" "1.4.321.0"; do - if [ "$version" != "$CURRENT_VERSION" ]; then - echo "Creating symlink from $version to $CURRENT_VERSION" - mkdir -p $VULKAN_BASE_DIR/$version - ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/$version/x86_64 - fi - done - - # Find any version references in build files and create symlinks for them - if [ -d "${{github.workspace}}/attachments/build" ]; then - echo "Scanning build directory for version references..." - # Find all version patterns like X.Y.ZZZ.W in build files - FOUND_VERSIONS=$(grep -r -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" ${{github.workspace}}/attachments/build 2>/dev/null | grep -v "$CURRENT_VERSION" | sort | uniq || echo "") - - for version in $FOUND_VERSIONS; do - if [[ $version =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && [ "$version" != "$CURRENT_VERSION" ]; then - echo "Found version reference in build files: $version, creating symlink" - mkdir -p $VULKAN_BASE_DIR/$version - ln -sf $VULKAN_SDK $VULKAN_BASE_DIR/$version/x86_64 - fi - done - fi - - # List all created symlinks - echo "Created the following Vulkan SDK version symlinks:" - find $VULKAN_BASE_DIR -type l -exec ls -la {} \; - - name: Verify Vulkan Installation (Windows) if: runner.os == 'Windows' run: | diff --git a/attachments/CMake/FindVulkanHpp.cmake b/attachments/CMake/FindVulkanHpp.cmake index ecb2b174..2c0e23ab 100644 --- a/attachments/CMake/FindVulkanHpp.cmake +++ b/attachments/CMake/FindVulkanHpp.cmake @@ -225,38 +225,7 @@ module; #include export module vulkan; export namespace vk { - // Import symbols from the main namespace using namespace VULKAN_HPP_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectFree; - using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; - using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; - using VULKAN_HPP_NAMESPACE::detail::PoolFree; - using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; - using VULKAN_HPP_NAMESPACE::detail::createResultValueType; - using VULKAN_HPP_NAMESPACE::detail::resultCheck; - using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; - - // Export detail namespace for other symbols - namespace detail { - using namespace VULKAN_HPP_NAMESPACE::detail; - } - - // Export raii namespace - namespace raii { - using namespace VULKAN_HPP_RAII_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; - using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; - } } ") endif() @@ -357,11 +326,6 @@ module; export module vulkan; export namespace vk { using namespace VULKAN_HPP_NAMESPACE; - - // Export detail namespace symbols that might be referenced directly - namespace detail { - using namespace VULKAN_HPP_NAMESPACE::detail; - } } ") endif() @@ -451,11 +415,6 @@ module; export module vulkan; export namespace vk { using namespace VULKAN_HPP_NAMESPACE; - - // Export detail namespace symbols that might be referenced directly - namespace detail { - using namespace VULKAN_HPP_NAMESPACE::detail; - } } ") endif() diff --git a/attachments/CMake/fix_vulkan_cppm.cmake b/attachments/CMake/fix_vulkan_cppm.cmake deleted file mode 100644 index 6e1f6dda..00000000 --- a/attachments/CMake/fix_vulkan_cppm.cmake +++ /dev/null @@ -1,147 +0,0 @@ -# This script checks for vulkan.cppm files and fixes them if they have the old format -# without direct imports from the detail namespace - -# Function to fix a vulkan.cppm file -function(fix_vulkan_cppm_file file_path) - # Read the content of the file - file(READ "${file_path}" VULKAN_CPPM_CONTENT) - - # Check if it's using the old format (without direct detail imports) - if(VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::DispatchLoaderBase" AND - NOT VULKAN_CPPM_CONTENT MATCHES "using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase") - message(STATUS "Fixing vulkan.cppm file at: ${file_path}") - - # Create a modified version that directly imports the detail symbols - file(WRITE "${file_path}" -"// Modified vulkan.cppm file -module; -#include -export module vulkan; -export namespace vk { - // Import symbols from the main namespace - using namespace VULKAN_HPP_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderBase; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderDynamic; - using VULKAN_HPP_NAMESPACE::detail::DispatchLoaderStatic; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroy; - using VULKAN_HPP_NAMESPACE::detail::ObjectDestroyShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectFree; - using VULKAN_HPP_NAMESPACE::detail::ObjectFreeShared; - using VULKAN_HPP_NAMESPACE::detail::ObjectRelease; - using VULKAN_HPP_NAMESPACE::detail::ObjectReleaseShared; - using VULKAN_HPP_NAMESPACE::detail::PoolFree; - using VULKAN_HPP_NAMESPACE::detail::PoolFreeShared; - using VULKAN_HPP_NAMESPACE::detail::createResultValueType; - using VULKAN_HPP_NAMESPACE::detail::resultCheck; - using VULKAN_HPP_NAMESPACE::detail::DynamicLoader; - - // Export detail namespace for other symbols - namespace detail { - using namespace VULKAN_HPP_NAMESPACE::detail; - } - - // Export raii namespace - namespace raii { - using namespace VULKAN_HPP_RAII_NAMESPACE; - - // Import symbols from the detail namespace - using VULKAN_HPP_NAMESPACE::detail::ContextDispatcher; - using VULKAN_HPP_NAMESPACE::detail::DeviceDispatcher; - } -} -") - message(STATUS "Fixed vulkan.cppm file at: ${file_path}") - else() - message(STATUS "vulkan.cppm file at ${file_path} already has the correct format or is not a standard vulkan.cppm file") - endif() -endfunction() - -# Check if vulkan.cppm exists in /usr/include/vulkan -if(EXISTS "/usr/include/vulkan/vulkan.cppm") - message(STATUS "Found vulkan.cppm in /usr/include/vulkan") - - # Try to fix the file directly - execute_process( - COMMAND ${CMAKE_COMMAND} -E echo "Checking write permission for /usr/include/vulkan/vulkan.cppm" - COMMAND_ECHO STDOUT - ) - - # Try to create a temporary file to check write permission - execute_process( - COMMAND ${CMAKE_COMMAND} -E touch /usr/include/vulkan/vulkan.cppm.tmp - RESULT_VARIABLE WRITE_RESULT - ERROR_QUIET - ) - - if(WRITE_RESULT EQUAL 0) - # We have write permission, remove the temporary file - execute_process( - COMMAND ${CMAKE_COMMAND} -E remove /usr/include/vulkan/vulkan.cppm.tmp - ) - - # Fix the file directly - fix_vulkan_cppm_file("/usr/include/vulkan/vulkan.cppm") - else() - message(STATUS "No write permission for /usr/include/vulkan/vulkan.cppm, creating a copy in the build directory") - - # Create a copy in the build directory that we can modify - set(VULKAN_CPPM_COPY "${CMAKE_BINARY_DIR}/include/vulkan/vulkan.cppm") - file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/vulkan") - file(COPY "/usr/include/vulkan/vulkan.cppm" DESTINATION "${CMAKE_BINARY_DIR}/include/vulkan") - - # Fix the copy - fix_vulkan_cppm_file("${VULKAN_CPPM_COPY}") - - # Add the include directory to the include path - include_directories(BEFORE "${CMAKE_BINARY_DIR}/include") - - # Set the VulkanHpp_CPPM_DIR variable - set(VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR}/include" CACHE PATH "Path to the directory containing vulkan.cppm" FORCE) - endif() -endif() - -# Check if vulkan.cppm exists in the Vulkan SDK -if(DEFINED ENV{VULKAN_SDK} AND EXISTS "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm") - message(STATUS "Found vulkan.cppm in Vulkan SDK") - - # Try to fix the file directly - execute_process( - COMMAND ${CMAKE_COMMAND} -E echo "Checking write permission for $ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm" - COMMAND_ECHO STDOUT - ) - - # Try to create a temporary file to check write permission - execute_process( - COMMAND ${CMAKE_COMMAND} -E touch "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm.tmp" - RESULT_VARIABLE WRITE_RESULT - ERROR_QUIET - ) - - if(WRITE_RESULT EQUAL 0) - # We have write permission, remove the temporary file - execute_process( - COMMAND ${CMAKE_COMMAND} -E remove "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm.tmp" - ) - - # Fix the file directly - fix_vulkan_cppm_file("$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm") - else() - message(STATUS "No write permission for $ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm, creating a copy in the build directory") - - # Create a copy in the build directory that we can modify - set(VULKAN_CPPM_COPY "${CMAKE_BINARY_DIR}/include/vulkan/vulkan.cppm") - file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/vulkan") - file(COPY "$ENV{VULKAN_SDK}/include/vulkan/vulkan.cppm" DESTINATION "${CMAKE_BINARY_DIR}/include/vulkan") - - # Fix the copy - fix_vulkan_cppm_file("${VULKAN_CPPM_COPY}") - - # Add the include directory to the include path - include_directories(BEFORE "${CMAKE_BINARY_DIR}/include") - - # Set the VulkanHpp_CPPM_DIR variable - set(VulkanHpp_CPPM_DIR "${CMAKE_BINARY_DIR}/include" CACHE PATH "Path to the directory containing vulkan.cppm" FORCE) - endif() -endif()