@@ -15,6 +15,11 @@ Helper module to get the project's version dynamically. Format is compatible wit
1515
1616include_guard ()
1717list (APPEND CMAKE_MESSAGE_CONTEXT DynamicVersion)
18+ if (POLICY CMP0140)
19+ # Enable using return(PROPAGATE)
20+ # TODO: Remove when cmake 3.25 is commonly distributed
21+ cmake_policy (SET CMP0140 NEW)
22+ endif ()
1823
1924#[==============================================================================================[
2025# Preparations #
@@ -118,9 +123,6 @@ function(dynamic_version)
118123 `${OUTPUT_FOLDER}/.git_commit`
119124 Current commit
120125
121- `${OUTPUT_FOLDER}/.git_distance`
122- Current git distance from tag
123-
124126 ## See also
125127 - [pypa/setuptools_scm](https://github.com/pypa/setuptools_scm)
126128
@@ -227,10 +229,14 @@ function(dynamic_version)
227229 COMMAND_ERROR_IS_FATAL ANY)
228230
229231 # Copy all configured files
230- foreach (file IN ITEMS .DynamicVersion.json .version .git_describe .git_commit .git_distance)
231- if (EXISTS ${file} )
232- file (COPY_FILE ${ARGS_TMP_FOLDER} /${file} ${ARGS_OUTPUT_FOLDER} /${file} )
233- endif ()
232+ foreach (file IN ITEMS .DynamicVersion.json .version .git_describe .git_commit)
233+ if (EXISTS ${ARGS_TMP_FOLDER} /${file} )
234+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
235+ file (COPY_FILE ${ARGS_TMP_FOLDER} /${file} ${ARGS_OUTPUT_FOLDER} /${file} )
236+ else ()
237+ file (COPY ${ARGS_TMP_FOLDER} /${file} DESTINATION ${ARGS_OUTPUT_FOLDER} /)
238+ endif ()
239+ endif ()
234240 endforeach ()
235241
236242 # Check configuration state
@@ -359,13 +365,13 @@ function(get_dynamic_version)
359365 # Set fallback values
360366 if (DEFINED ARGS_FALLBACK_VERSION)
361367 string (JSON data SET
362- ${data} version ${ARGS_FALLBACK_VERSION} )
368+ ${data} version \" ${ARGS_FALLBACK_VERSION} \" )
363369 file (WRITE ${ARGS_TMP_FOLDER} /.DynamicVersion.json ${data} )
364370 file (WRITE ${ARGS_TMP_FOLDER} /.version ${ARGS_FALLBACK_VERSION} )
365371 endif ()
366372 if (DEFINED ARGS_FALLBACK_HASH)
367373 string (JSON data SET
368- ${data} commit ${ARGS_FALLBACK_HASH} )
374+ ${data} commit \" ${ARGS_FALLBACK_HASH} \" )
369375 file (WRITE ${ARGS_TMP_FOLDER} /.DynamicVersion.json ${data} )
370376 file (WRITE ${ARGS_TMP_FOLDER} /.git_commit ${ARGS_FALLBACK_HASH} )
371377 endif ()
@@ -403,8 +409,11 @@ function(get_dynamic_version)
403409 ${data} version \"${CMAKE_MATCH_2} \")
404410 file (WRITE ${ARGS_TMP_FOLDER} /.version ${CMAKE_MATCH_2} )
405411 # Get commit hash
412+ # Cannot use Regex match from here, need to run string(REGEX MATCH) again
413+ # https://gitlab.kitware.com/cmake/cmake/-/issues/23770
406414 file (STRINGS ${ARGS_GIT_ARCHIVAL_FILE} node
407415 REGEX "^node:[ ]?(.*)" )
416+ string (REGEX MATCH "^node:[ ]?(.*)" node "${node} " )
408417 string (JSON data SET
409418 ${data} commit \"${CMAKE_MATCH_1} \")
410419 file (WRITE ${ARGS_TMP_FOLDER} /.git_commit ${CMAKE_MATCH_1} )
@@ -433,13 +442,13 @@ function(get_dynamic_version)
433442 OUTPUT_STRIP_TRAILING_WHITESPACE
434443 COMMAND_ERROR_IS_FATAL ANY)
435444 # Get version and describe-name
436- execute_process (COMMAND ${GIT_EXECUTABLE} describe --tags --match=?[0-9.]*
445+ execute_process (COMMAND ${GIT_EXECUTABLE} describe --tags --long --abbrev=8 -- match=?[0-9.]*
437446 WORKING_DIRECTORY ${ARGS_PROJECT_SOURCE}
438447 OUTPUT_VARIABLE describe-name
439448 OUTPUT_STRIP_TRAILING_WHITESPACE
440449 COMMAND_ERROR_IS_FATAL ANY)
441450 # Match any part containing digits and periods (strips out rc and so on)
442- if (NOT describe-name MATCHES "^([v]?([0-9\\ .]+).* )" )
451+ if (NOT describe-name MATCHES "^([v]?([0-9\\ .]+)-([0-9]+)-g(.*) )" )
443452 message (${error_message_type}
444453 "Version tag is ill-formatted\n "
445454 " Describe-name: ${describe-name}"
@@ -452,26 +461,13 @@ function(get_dynamic_version)
452461 string (JSON data SET
453462 ${data} version \"${CMAKE_MATCH_2} \")
454463 file (WRITE ${ARGS_TMP_FOLDER} /.version ${CMAKE_MATCH_2} )
464+ string (JSON data SET
465+ ${data} distance \"${CMAKE_MATCH_3} \")
466+ string (JSON data SET
467+ ${data} short_sha \"${CMAKE_MATCH_4} \")
455468 string (JSON data SET
456469 ${data} commit \"${git-hash}\")
457470 file (WRITE ${ARGS_TMP_FOLDER} /.git_commit ${git-hash})
458- # Get full describe with distance
459- execute_process (COMMAND ${GIT_EXECUTABLE} describe --tags --long --match=?[0-9.]*
460- WORKING_DIRECTORY ${ARGS_PROJECT_SOURCE}
461- OUTPUT_VARIABLE describe-name -long
462- OUTPUT_STRIP_TRAILING_WHITESPACE
463- COMMAND_ERROR_IS_FATAL ANY)
464- # Match version (as above) and distance
465- if (NOT describe-name -long MATCHES "^([v]?([0-9\\ .]+)-([0-9]+)-.*)" )
466- message (${error_message_type}
467- "Version tag is ill-formatted\n "
468- " Describe-name-long: ${describe-name-long}"
469- )
470- return ()
471- endif ()
472- string (JSON data SET
473- ${data} distance \"${CMAKE_MATCH_3} \")
474- file (WRITE ${ARGS_TMP_FOLDER} /.git_distance ${CMAKE_MATCH_3} )
475471 message (DEBUG
476472 "Found appropriate tag from git"
477473 )
@@ -507,3 +503,5 @@ if (DynamicVersion_RUN)
507503 endif ()
508504 get_dynamic_version(${DynamicVersion_ARGS} )
509505endif ()
506+
507+ list (POP_BACK CMAKE_MESSAGE_CONTEXT)
0 commit comments