|
8 | 8 | # Determine the directory where this file is located |
9 | 9 | get_filename_component(CPP_LIBRARY_ROOT "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY) |
10 | 10 |
|
| 11 | +# Public function to update project version from git tags after project() has been called. |
| 12 | +# This is useful for projects that need custom setup and can't use cpp_library_setup() |
| 13 | +# but still want automatic git-based versioning. |
| 14 | +# |
| 15 | +# Usage: |
| 16 | +# project(my-library) # No VERSION specified |
| 17 | +# cpp_library_set_version() |
| 18 | +# # Now PROJECT_VERSION and related variables are set from git tags |
| 19 | +# |
| 20 | +# The function respects CPP_LIBRARY_VERSION if set (e.g., by package managers), |
| 21 | +# otherwise queries git tags, stripping the 'v' prefix if present. |
| 22 | +function(cpp_library_set_version) |
| 23 | + # Get version from git tags (respects CPP_LIBRARY_VERSION override) |
| 24 | + _cpp_library_get_git_version(GIT_VERSION) |
| 25 | + |
| 26 | + # Parse version components |
| 27 | + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH "${GIT_VERSION}") |
| 28 | + if(VERSION_MATCH) |
| 29 | + set(VERSION_MAJOR ${CMAKE_MATCH_1}) |
| 30 | + set(VERSION_MINOR ${CMAKE_MATCH_2}) |
| 31 | + set(VERSION_PATCH ${CMAKE_MATCH_3}) |
| 32 | + else() |
| 33 | + set(VERSION_MAJOR 0) |
| 34 | + set(VERSION_MINOR 0) |
| 35 | + set(VERSION_PATCH 0) |
| 36 | + endif() |
| 37 | + |
| 38 | + # Update project version in parent scope |
| 39 | + set(PROJECT_VERSION ${GIT_VERSION} PARENT_SCOPE) |
| 40 | + set(PROJECT_VERSION_MAJOR ${VERSION_MAJOR} PARENT_SCOPE) |
| 41 | + set(PROJECT_VERSION_MINOR ${VERSION_MINOR} PARENT_SCOPE) |
| 42 | + set(PROJECT_VERSION_PATCH ${VERSION_PATCH} PARENT_SCOPE) |
| 43 | + |
| 44 | + message(STATUS "cpp-library: Set project version to ${GIT_VERSION} from git tags") |
| 45 | +endfunction() |
| 46 | + |
11 | 47 | # Enable dependency tracking for accurate find_dependency() generation |
12 | 48 | # This function should be called BEFORE project() to install the dependency provider. |
13 | 49 | # Requires CMake 3.24+. |
@@ -197,27 +233,14 @@ function(cpp_library_setup) |
197 | 233 | set(ARG_REQUIRES_CPP_VERSION 17) |
198 | 234 | endif() |
199 | 235 |
|
200 | | - # Get version from git tags |
201 | | - _cpp_library_get_git_version(GIT_VERSION) |
202 | | - set(ARG_VERSION "${GIT_VERSION}") |
203 | | - |
204 | | - # Parse version components |
205 | | - string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH "${ARG_VERSION}") |
206 | | - if(VERSION_MATCH) |
207 | | - set(ARG_VERSION_MAJOR ${CMAKE_MATCH_1}) |
208 | | - set(ARG_VERSION_MINOR ${CMAKE_MATCH_2}) |
209 | | - set(ARG_VERSION_PATCH ${CMAKE_MATCH_3}) |
210 | | - else() |
211 | | - set(ARG_VERSION_MAJOR 0) |
212 | | - set(ARG_VERSION_MINOR 0) |
213 | | - set(ARG_VERSION_PATCH 0) |
214 | | - endif() |
| 236 | + # Get version from git tags and update project version variables |
| 237 | + cpp_library_set_version() |
215 | 238 |
|
216 | | - # Update project version |
217 | | - set(PROJECT_VERSION ${ARG_VERSION} PARENT_SCOPE) |
218 | | - set(PROJECT_VERSION_MAJOR ${ARG_VERSION_MAJOR} PARENT_SCOPE) |
219 | | - set(PROJECT_VERSION_MINOR ${ARG_VERSION_MINOR} PARENT_SCOPE) |
220 | | - set(PROJECT_VERSION_PATCH ${ARG_VERSION_PATCH} PARENT_SCOPE) |
| 239 | + # Retrieve the version that was just set |
| 240 | + set(ARG_VERSION "${PROJECT_VERSION}") |
| 241 | + set(ARG_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) |
| 242 | + set(ARG_VERSION_MINOR ${PROJECT_VERSION_MINOR}) |
| 243 | + set(ARG_VERSION_PATCH ${PROJECT_VERSION_PATCH}) |
221 | 244 |
|
222 | 245 | # Generate full paths for HEADERS and SOURCES based on conventions |
223 | 246 | set(GENERATED_HEADERS "") |
|
0 commit comments