Skip to content

Commit d244696

Browse files
committed
Even more CI & CMake updates
- Added per-configuration Vulkan compatibility table to README
1 parent c0eabc4 commit d244696

7 files changed

Lines changed: 122 additions & 66 deletions

File tree

.github/workflows/generate.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
name: Generate headers
22
on:
3+
workflow_call:
34
pull_request:
45
push:
56
branches:
@@ -12,10 +13,9 @@ jobs:
1213
uses: actions/checkout@v5.0.0
1314
with:
1415
submodules: true
15-
fetch-tags: true
1616
- name: Generate headers
1717
run: |
18-
git fetch --unshallow --tags
19-
cmake -B build -DVMA_HPP_GENERATOR_BUILD=ON -DVMA_HPP_RUN_GENERATOR=ON -DVMA_HPP_DO_UPDATE=ON -DVMA_HPP_SAMPLES_BUILD=OFF
20-
cmake --build build
18+
cmake -B build -DFETCHCONTENT_SOURCE_DIR_VULKAN=@ \
19+
-DVMA_HPP_GENERATOR_BUILD=ON -DVMA_HPP_RUN_GENERATOR=ON -DVMA_HPP_DO_UPDATE=ON -DVMA_HPP_SAMPLES_BUILD=OFF
20+
cmake --build build --target GenerateVmaHpp
2121
git diff --exit-code

.github/workflows/release.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ on:
44
jobs:
55
build:
66
uses: ./.github/workflows/build.yml
7+
generate:
8+
uses: ./.github/workflows/generate.yml
79
release:
810
runs-on: ubuntu-latest
911
permissions:
1012
contents: write
11-
needs:
12-
build
13+
needs: [build, generate]
1314
steps:
1415
- name: Checkout
1516
uses: actions/checkout@v5.0.0
@@ -22,12 +23,11 @@ jobs:
2223
VERSION=`cat build/CMakeCache.txt | grep VMA_HPP_PROJECT_VERSION | cut -d= -f2`
2324
echo "version=$VERSION" | tee -a $GITHUB_OUTPUT
2425
25-
git fetch --unshallow --tags --recurse-submodules=no
2626
BUILD=`git ls-remote --tags --sort='-v:refname' origin "refs/tags/v$VERSION*" | head -n 1 | cut -d+ -f2`
2727
BUILD=$((BUILD+1))
2828
echo "build=$BUILD" | tee -a $GITHUB_OUTPUT
2929
30-
cp VulkanMemoryAllocator/include/vk_mem_alloc.h include
30+
mv VulkanMemoryAllocator/include/vk_mem_alloc.h include
3131
mv include VulkanMemoryAllocator-Hpp
3232
tar czf VulkanMemoryAllocator-Hpp-$VERSION.tar.gz VulkanMemoryAllocator-Hpp
3333
- name: Release

CMakeLists.txt

Lines changed: 7 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ cmake_minimum_required(VERSION 3.8...3.30 FATAL_ERROR)
22

33
project(VulkanMemoryAllocator-Hpp-Generator VERSION 3.3.0 LANGUAGES CXX)
44

5-
set(VMA_HPP_VULKAN_MIN_HEADERS "1.4.327" CACHE INTERNAL "Minimal Vulkan-Headers revision (headers)")
6-
set(VMA_HPP_VULKAN_MIN_MODULES "1.4.344" CACHE INTERNAL "Minimal Vulkan-Headers revision (modules)")
7-
85
if (CMAKE_VERSION VERSION_LESS "3.21")
96
# https://cmake.org/cmake/help/latest/variable/PROJECT_IS_TOP_LEVEL.html
107
string(COMPARE EQUAL ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} PROJECT_IS_TOP_LEVEL)
@@ -17,27 +14,7 @@ option(VMA_HPP_DO_UPDATE "Update VMA submodule" OFF)
1714
set(VMA_HPP_INPUT_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/VulkanMemoryAllocator/include/vk_mem_alloc.h" CACHE FILEPATH "Input vk_mem_alloc.h file")
1815

1916
if (VMA_HPP_DO_UPDATE)
20-
# VMA_HPP_VMA_REVISION can be overridden from the command line, but does not persist in cache
21-
if (NOT DEFINED VMA_HPP_VMA_REVISION)
22-
set(VMA_HPP_VMA_REVISION "v${PROJECT_VERSION}")
23-
endif ()
24-
25-
# Find Git.
26-
find_package(Git)
27-
if (NOT Git_FOUND)
28-
message(FATAL_ERROR "Git not found. VMA_HPP_DO_UPDATE is not available.")
29-
endif ()
30-
31-
# Init the submodule.
32-
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update
33-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND_ERROR_IS_FATAL ANY)
34-
35-
# Checkout proper revision.
36-
message(STATUS "Updating VulkanMemoryAllocator submodule to ${VMA_HPP_VMA_REVISION}")
37-
execute_process(COMMAND ${GIT_EXECUTABLE} -c advice.detachedHead=false checkout "${VMA_HPP_VMA_REVISION}"
38-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/VulkanMemoryAllocator" COMMAND_ERROR_IS_FATAL ANY)
39-
execute_process(COMMAND ${GIT_EXECUTABLE} pull
40-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/VulkanMemoryAllocator" ERROR_QUIET)
17+
include(tools/UpdateSubmodule.cmake)
4118
endif ()
4219

4320
if (NOT TARGET Vulkan::Headers AND NOT TARGET Vulkan::Hpp)
@@ -46,7 +23,7 @@ if (NOT TARGET Vulkan::Headers AND NOT TARGET Vulkan::Hpp)
4623
if ("${FETCHCONTENT_SOURCE_DIR_VULKAN}" STREQUAL "@")
4724
find_package(VulkanHeaders CONFIG)
4825
if (NOT VulkanHeaders_FOUND)
49-
find_package(Vulkan REQUIRED)
26+
find_package(Vulkan)
5027
endif ()
5128
else ()
5229
include(FetchContent)
@@ -78,41 +55,14 @@ if (NOT ${PROJECT_VERSION} STREQUAL ${VMA_HPP_PROJECT_VERSION})
7855
endif ()
7956

8057
if (VMA_HPP_DO_UPDATE)
81-
# Find VMA version in the VMA header.
82-
file(READ "${VMA_HPP_INPUT_HEADER}" VMA_HPP_VMA_SOURCE)
83-
string(REGEX MATCH "<b>Version\\s*([^<]+)\\s*</b>" _ ${VMA_HPP_VMA_SOURCE})
84-
string(STRIP ${CMAKE_MATCH_1} VMA_HPP_VMA_VERSION)
85-
86-
# Update versions in the README.
87-
message(STATUS "Updating README with VMA ${VMA_HPP_VMA_VERSION} and Vulkan ${VMA_HPP_VULKAN_MIN_HEADERS} / ${VMA_HPP_VULKAN_MIN_MODULES}")
88-
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/README.md" VMA_HPP_README)
89-
string(REPLACE ";" "\\;" VMA_HPP_README "${VMA_HPP_README}") # Do not mess up semicolons in the README
90-
string(REGEX REPLACE "<!--VER-->[^<]*<!--/VER-->" "<!--VER-->${VMA_HPP_VMA_VERSION}<!--/VER-->" VMA_HPP_README "${VMA_HPP_README}")
91-
string(REGEX REPLACE "<!--VK_HEADERS-->[^<]*<!--/VK_HEADERS-->" "<!--VK_HEADERS-->${VMA_HPP_VULKAN_MIN_HEADERS}<!--/VK_HEADERS-->" VMA_HPP_README "${VMA_HPP_README}")
92-
string(REGEX REPLACE "<!--VK_MODULES-->[^<]*<!--/VK_MODULES-->" "<!--VK_MODULES-->${VMA_HPP_VULKAN_MIN_MODULES}<!--/VK_MODULES-->" VMA_HPP_README "${VMA_HPP_README}")
93-
file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/README.md" ${VMA_HPP_README})
94-
95-
# Generate "imported" utility header.
96-
set(VMA_HPP_IMPORTED_HEADER "// Generated from the list of VMA-Hpp headers (vk_mem_alloc*.hpp).
97-
// See https://clang.llvm.org/docs/StandardCPlusPlusModules.html#providing-a-header-to-skip-parsing-redundant-headers")
98-
file(GLOB VMA_HPP_HEADER_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/include/vk_mem_alloc*.hpp")
99-
foreach(VMA_HPP_HEADER_FILE ${VMA_HPP_HEADER_FILES})
100-
if (NOT ${VMA_HPP_HEADER_FILE} STREQUAL "vk_mem_alloc_imported.hpp" AND
101-
NOT ${VMA_HPP_HEADER_FILE} STREQUAL "vk_mem_alloc_static_assertions.hpp")
102-
string(REGEX MATCH "vk_mem_alloc(.*)\.hpp" _ ${VMA_HPP_HEADER_FILE})
103-
string(TOUPPER "${CMAKE_MATCH_1}" VMA_HPP_HEADER_GUARD)
104-
string(APPEND VMA_HPP_IMPORTED_HEADER "
105-
106-
#ifndef VULKAN_MEMORY_ALLOCATOR${VMA_HPP_HEADER_GUARD}_HPP
107-
#define VULKAN_MEMORY_ALLOCATOR${VMA_HPP_HEADER_GUARD}_HPP
108-
#endif")
109-
endif ()
110-
endforeach()
111-
file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/include/vk_mem_alloc_imported.hpp" ${VMA_HPP_IMPORTED_HEADER})
58+
function(generate_files)
59+
include(tools/GenerateFiles.cmake)
60+
endfunction()
61+
generate_files()
11262
endif ()
11363

11464
if (VMA_HPP_GENERATOR_BUILD)
115-
add_executable(VmaHppGenerator VmaHppGenerator.cpp)
65+
add_executable(VmaHppGenerator tools/VmaHppGenerator.cpp)
11666
set_property(TARGET VmaHppGenerator PROPERTY CXX_STANDARD 17)
11767
set_property(TARGET VmaHppGenerator PROPERTY CXX_STANDARD_REQUIRED ON)
11868
set_property(TARGET VmaHppGenerator PROPERTY CXX_EXTENSIONS OFF)

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,16 @@ consistent and compatible with Vulkan C++ bindings ([Vulkan-Hpp](https://github.
99
#### Requirements
1010

1111
- C++11 or newer
12-
- [Vulkan](https://github.com/KhronosGroup/Vulkan-Headers) **<!--VK_HEADERS-->1.4.327<!--/VK_HEADERS-->** (headers) / **<!--VK_MODULES-->1.4.344<!--/VK_MODULES-->** (module) or newer
12+
- <details>
13+
<summary><a href="https://github.com/KhronosGroup/Vulkan-Headers">Vulkan</a> <b><!--MIN_VK-->1.4.327<!--/MIN_VK--></b> or newer <sup>(?)</sup></summary><!--MIN_VK_TABLE-->
14+
15+
`​ ​ ​ ​ ​Min Vulkan​ ​ ​ ​ ​` `​ ​Tested configurations​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​`<br>
16+
`#include` `​ ​ ​import` `​ ​Flags​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​`<br>
17+
`​ ​1.4.327` `​ ​1.4.344` `​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​`<br>
18+
`​ ​1.4.327` `​ ​1.4.344` `-DVULKAN_HPP_NO_EXCEPTIONS​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​`<br>
19+
`​ ​1.4.327` `​ ​1.4.344` `-DVULKAN_HPP_NO_SMART_HANDLE​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​`<br>
20+
`​ ​1.4.327` `​ ​1.4.344` `-DVULKAN_HPP_USE_REFLECT -DVULKAN_HPP_HANDLES_MOVE_EXCHANGE​ ​`<br>
21+
<!--/MIN_VK_TABLE--></details>
1322
- [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
1423
- *[GitHub releases](https://github.com/YaaZ/VulkanMemoryAllocator-Hpp/releases) is the recommended way to get VMA-Hpp,
1524
they already include a compatible `vk_mem_alloc.h` header*

tools/GenerateFiles.cmake

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
2+
function(pad_configuration_table_entry RESULT INPUT LENGTH)
3+
string(LENGTH "${INPUT}" L)
4+
math(EXPR L "${LENGTH} - ${L}")
5+
string(REPEAT "~" ${L} R)
6+
set(${RESULT} "${R}" PARENT_SCOPE)
7+
endfunction()
8+
9+
function(generate_configuration_table)
10+
# Find testing configurations in the GH workflow.
11+
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/.github/workflows/build-custom-vulkan.yml" WORKFLOW_SOURCE)
12+
set(REGEX "build +\\$\{{ *env\.vk *\\|\\| *env\.modules *&& *'v([^']+)' *\\|\\| *'v([^']+)'}} *([^\n$]*)")
13+
string(REGEX MATCHALL "${REGEX}" CONFIGS ${WORKFLOW_SOURCE})
14+
# Prepare padded line segments.
15+
set(CONFIG_LINES " `~~~~Min Vulkan~~~~` `~Tested configurations;`#include` `~~import` `~Flags")
16+
set(LONGEST_LINE 0)
17+
foreach(CONFIG ${CONFIGS})
18+
string(REGEX MATCH "${REGEX}" _ ${CONFIG})
19+
pad_configuration_table_entry(PAD_1 "${CMAKE_MATCH_1}" 8)
20+
pad_configuration_table_entry(PAD_2 "${CMAKE_MATCH_2}" 8)
21+
string(LENGTH "${CMAKE_MATCH_3}" L)
22+
if(L GREATER LONGEST_LINE)
23+
set(LONGEST_LINE ${L})
24+
elseif (L EQUAL 0)
25+
set(MIN_VULKAN "${CMAKE_MATCH_2}" PARENT_SCOPE) # Remember Vulkan version for default configuration.
26+
endif()
27+
list(APPEND CONFIG_LINES "`${PAD_2}${CMAKE_MATCH_2}` `${PAD_1}${CMAKE_MATCH_1}` `${CMAKE_MATCH_3}")
28+
endforeach()
29+
# Build a table of configurations.
30+
set(CONFIG_TABLE "\n\n ")
31+
foreach(CONFIG_LINE ${CONFIG_LINES})
32+
pad_configuration_table_entry(PAD "${CONFIG_LINE}" "24 + ${LONGEST_LINE}")
33+
string(APPEND CONFIG_TABLE " ${CONFIG_LINE}${PAD}`<br>\n ")
34+
endforeach()
35+
# Replace placeholders with padding sequences.
36+
string(REPLACE "~" "​ ​" CONFIG_TABLE "${CONFIG_TABLE}")
37+
string(REPLACE "​​" "​" CONFIG_TABLE "${CONFIG_TABLE}")
38+
set(CONFIG_TABLE "${CONFIG_TABLE}" PARENT_SCOPE)
39+
endfunction()
40+
generate_configuration_table()
41+
42+
# Find VMA version in the VMA header.
43+
file(READ "${VMA_HPP_INPUT_HEADER}" VMA_SOURCE)
44+
string(REGEX MATCH "<b>Version\\s*([^<]+)\\s*</b>" _ ${VMA_SOURCE})
45+
string(STRIP ${CMAKE_MATCH_1} VMA_VERSION)
46+
47+
# Update versions in the README.
48+
function(replace_readme PLACEHOLDER CONTENT)
49+
string(REGEX REPLACE "<!--${PLACEHOLDER}-->([^<]*<[^!])*[^<]*<!--/${PLACEHOLDER}-->" "<!--${PLACEHOLDER}-->${CONTENT}<!--/${PLACEHOLDER}-->" README_SOURCE "${README_SOURCE}")
50+
set(README_SOURCE "${README_SOURCE}" PARENT_SCOPE)
51+
endfunction()
52+
message(STATUS "Updating README with VMA ${VMA_VERSION} and Vulkan ${MIN_VULKAN}")
53+
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/README.md" README_SOURCE)
54+
string(REPLACE ";" "\\;" README_SOURCE "${README_SOURCE}") # Do not mess up semicolons in the README
55+
replace_readme(VER "${VMA_VERSION}")
56+
replace_readme(MIN_VK "${MIN_VULKAN}")
57+
replace_readme(MIN_VK_TABLE "${CONFIG_TABLE}")
58+
file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/README.md" ${README_SOURCE})
59+
60+
# Generate "imported" utility header.
61+
set(IMPORTED_HEADER "// Generated from the list of VMA-Hpp headers (vk_mem_alloc*.hpp).
62+
// See https://clang.llvm.org/docs/StandardCPlusPlusModules.html#providing-a-header-to-skip-parsing-redundant-headers")
63+
file(GLOB HEADER_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/include/vk_mem_alloc*.hpp")
64+
foreach(HEADER_FILE ${HEADER_FILES})
65+
if (NOT ${HEADER_FILE} STREQUAL "vk_mem_alloc_imported.hpp" AND
66+
NOT ${HEADER_FILE} STREQUAL "vk_mem_alloc_static_assertions.hpp")
67+
string(REGEX MATCH "vk_mem_alloc(.*)\.hpp" _ ${HEADER_FILE})
68+
string(TOUPPER "${CMAKE_MATCH_1}" HEADER_GUARD)
69+
string(APPEND IMPORTED_HEADER "
70+
71+
#ifndef VULKAN_MEMORY_ALLOCATOR${HEADER_GUARD}_HPP
72+
#define VULKAN_MEMORY_ALLOCATOR${HEADER_GUARD}_HPP
73+
#endif")
74+
endif ()
75+
endforeach()
76+
file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/include/vk_mem_alloc_imported.hpp" ${IMPORTED_HEADER})

tools/UpdateSubmodule.cmake

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
# VMA_HPP_VMA_REVISION can be overridden from the command line, but does not persist in cache
3+
if (NOT DEFINED VMA_HPP_VMA_REVISION)
4+
set(VMA_HPP_VMA_REVISION "v${PROJECT_VERSION}")
5+
endif ()
6+
7+
find_package(Git)
8+
if (NOT Git_FOUND)
9+
message(FATAL_ERROR "Git not found. VMA_HPP_DO_UPDATE is not available.")
10+
endif ()
11+
12+
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init
13+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND_ERROR_IS_FATAL ANY)
14+
15+
message(STATUS "Updating VulkanMemoryAllocator submodule to ${VMA_HPP_VMA_REVISION}")
16+
execute_process(COMMAND ${GIT_EXECUTABLE} fetch origin tag "${VMA_HPP_VMA_REVISION}"
17+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/VulkanMemoryAllocator" COMMAND_ERROR_IS_FATAL ANY)
18+
execute_process(COMMAND ${GIT_EXECUTABLE} -c advice.detachedHead=false checkout "${VMA_HPP_VMA_REVISION}"
19+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/VulkanMemoryAllocator" COMMAND_ERROR_IS_FATAL ANY)
20+
execute_process(COMMAND ${GIT_EXECUTABLE} pull
21+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/VulkanMemoryAllocator" ERROR_QUIET)

0 commit comments

Comments
 (0)