|
| 1 | +# GetVersionFromGit.cmake |
| 2 | +# Standalone script to retrieve versioning information from Git or .git_archival.txt. |
| 3 | +# Customizable for any project by setting variables before including this file. |
| 4 | + |
| 5 | +# Configurable variables: |
| 6 | +# - VERSION_PREFIX: Prefix for version tags (default: "v"). |
| 7 | +# - VERSION_SUFFIX: Suffix for version tags (default: "[~+-]([a-zA-Z0-9]+)"). |
| 8 | +# - VERSION_REGEX: Regex to extract version (default: "(?[0-9]+\\.[0-9]+\\.[0-9]+)"). |
| 9 | +# - ARCHIVAL_FILE: Path to .git_archival.txt (default: "${CMAKE_SOURCE_DIR}/.git_archival.txt"). |
| 10 | +# - DESCRIBE_NAME_KEY: Key for describe name in .git_archival.txt (default: "describe-name: "). |
| 11 | +# - COMMIT_HASH_KEY: Key for commit hash in .git_archival.txt (default: "commit: "). |
| 12 | + |
| 13 | +# Default Format Example: |
| 14 | +# 1.2.3 v1.2.3 v1.2.3-rc1 |
| 15 | + |
| 16 | +set(VERSION_PREFIX "v" CACHE STRING "Prefix used in version tags") |
| 17 | +set(VERSION_SUFFIX "[~+-]([a-zA-Z0-9]+)" CACHE STRING "Suffix used in version tags") |
| 18 | +set(VERSION_REGEX "?([0-9]+\\.[0-9]+\\.[0-9]+)" CACHE STRING "Regex for extracting version") |
| 19 | +set(ARCHIVAL_FILE "${CMAKE_SOURCE_DIR}/.git_archival.txt" CACHE STRING "Path to .git_archival.txt") |
| 20 | +set(DESCRIBE_NAME_KEY "describe-name: " CACHE STRING "Key for describe name in .git_archival.txt") |
| 21 | +set(COMMIT_HASH_KEY "commit: " CACHE STRING "Key for commit hash in .git_archival.txt") |
| 22 | + |
| 23 | + |
| 24 | +# Combine prefix and regex |
| 25 | +set(VERSION_REGEX_WITH_PREFIX "^${VERSION_PREFIX}${VERSION_REGEX}") |
| 26 | + |
| 27 | +# Find Git |
| 28 | +find_package(Git) |
| 29 | + |
| 30 | +# Attempt to retrieve version from Git |
| 31 | +if(EXISTS "${CMAKE_SOURCE_DIR}/.git" AND GIT_FOUND) |
| 32 | + message(STATUS "Using git describe for versioning") |
| 33 | + |
| 34 | + # Extract the version string |
| 35 | + execute_process( |
| 36 | + COMMAND git describe --tags --dirty |
| 37 | + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} |
| 38 | + OUTPUT_VARIABLE VERSION_STRING |
| 39 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 40 | + ) |
| 41 | + |
| 42 | + # Extract the commit hash |
| 43 | + execute_process( |
| 44 | + COMMAND git rev-parse HEAD |
| 45 | + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} |
| 46 | + OUTPUT_VARIABLE COMMIT_HASH |
| 47 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 48 | + ) |
| 49 | +else() |
| 50 | + message(STATUS "Using archival file for versioning: ${ARCHIVAL_FILE}") |
| 51 | + if(EXISTS "${ARCHIVAL_FILE}") |
| 52 | + file(READ "${ARCHIVAL_FILE}" ARCHIVAL_CONTENT) |
| 53 | + |
| 54 | + # Extract the describe-name line |
| 55 | + string(REGEX MATCH "${DESCRIBE_NAME_KEY}([^\\n]+)" VERSION_STRING "${ARCHIVAL_CONTENT}") |
| 56 | + if(VERSION_STRING MATCHES "${DESCRIBE_NAME_KEY}(.*)") |
| 57 | + set(VERSION_STRING "${CMAKE_MATCH_1}") |
| 58 | + else() |
| 59 | + message(FATAL_ERROR "Could not extract version from ${ARCHIVAL_FILE}") |
| 60 | + endif() |
| 61 | + |
| 62 | + # Extract the commit hash |
| 63 | + string(REGEX MATCH "${COMMIT_HASH_KEY}([a-f0-9]+)" COMMIT_HASH "${ARCHIVAL_CONTENT}") |
| 64 | + if(COMMIT_HASH MATCHES "${COMMIT_HASH_KEY}([a-f0-9]+)") |
| 65 | + set(COMMIT_HASH "${CMAKE_MATCH_1}") |
| 66 | + else() |
| 67 | + message(FATAL_ERROR "Could not extract commit hash from ${ARCHIVAL_FILE}") |
| 68 | + endif() |
| 69 | + else() |
| 70 | + message(FATAL_ERROR "Neither git describe nor ${ARCHIVAL_FILE} is available for versioning.") |
| 71 | + endif() |
| 72 | +endif() |
| 73 | + |
| 74 | +# Ensure version string format |
| 75 | +if(VERSION_STRING MATCHES "${VERSION_REGEX_WITH_PREFIX}") |
| 76 | + set(VERSION_NO_SUFFIX "${CMAKE_MATCH_1}") |
| 77 | +else() |
| 78 | + message(FATAL_ERROR "Invalid version format: Missing base version in ${VERSION_STRING}") |
| 79 | +endif() |
| 80 | + |
| 81 | +# Check for development state |
| 82 | +if(VERSION_STRING MATCHES "-([0-9]+)-g([0-9a-f]+)") |
| 83 | + set(DEV_STATE "true") |
| 84 | + set(COMMIT_COUNT "${CMAKE_MATCH_1}") |
| 85 | + string(REGEX REPLACE "-([0-9]+)-g([0-9a-f]+)" "" VERSION_WITHOUT_META "${VERSION_STRING}") |
| 86 | +else() |
| 87 | + set(DEV_STATE "false") |
| 88 | + set(VERSION_WITHOUT_META "${VERSION_STRING}") |
| 89 | +endif() |
| 90 | + |
| 91 | +# Split and set version components |
| 92 | +string(REPLACE "." ";" VERSION_LIST "${VERSION_NO_SUFFIX}") |
| 93 | +list(GET VERSION_LIST 0 VERSION_MAJOR) |
| 94 | +list(GET VERSION_LIST 1 VERSION_MINOR) |
| 95 | +list(GET VERSION_LIST 2 VERSION_PATCH) |
| 96 | + |
| 97 | +# Increment patch number for dev versions |
| 98 | +if(DEV_STATE) |
| 99 | + math(EXPR VERSION_PATCH "${VERSION_PATCH} + 1") |
| 100 | +endif() |
| 101 | + |
| 102 | +# Export variables |
| 103 | +set(OPENMC_VERSION_MAJOR "${VERSION_MAJOR}") |
| 104 | +set(OPENMC_VERSION_MINOR "${VERSION_MINOR}") |
| 105 | +set(OPENMC_VERSION_PATCH "${VERSION_PATCH}") |
| 106 | +set(OPENMC_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") |
| 107 | +set(OPENMC_COMMIT_HASH "${COMMIT_HASH}") |
| 108 | +set(OPENMC_DEV_STATE "${DEV_STATE}") |
| 109 | +set(OPENMC_COMMIT_COUNT "${COMMIT_COUNT}") |
0 commit comments