From 0439fddabd1566c6e6bffa2faf255b2e7ef13cc3 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Sun, 14 May 2023 05:54:57 +0200 Subject: [PATCH] cmake: Generate properly formatted versions from git --- CMakeLists.txt | 137 ++++++++++++++++++++----------------------------- 1 file changed, 56 insertions(+), 81 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 84e58f6..bd6eaee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,99 +151,74 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git") ) if(EXISTS "${GIT}") - # Determine the version by exist tag match. - execute_process(COMMAND "${GIT}" tag "--sort=-v:refname" "--points-at" HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + # Try and calculate the exist version using git. + execute_process(COMMAND "${GIT}" describe --tags --long --abbrev=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL "")) - # Some minor string editing so the output conforms to SemVer 2.0.0. - string(REGEX REPLACE "[\r\n]+.*" "" GIT_OUTPUT "${GIT_OUTPUT}") + # Result will be MAJOR.MINOR.PATCH-TWEAK-gHASH + string(REPLACE "-" ";" GIT_OUTPUT "${GIT_OUTPUT}") + string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}") - # Parse as SemVer 2.0.0 - version(PARSE GIT_OUTPUT "${GIT_OUTPUT}" REQUIRE "PATCH;TWEAK") - if(GIT_OUTPUT_PRERELEASE) - string(SUBSTRING "${GIT_OUTPUT_PRERELEASE}" 1 -1 GIT_OUTPUT_TWEAK) - string(SUBSTRING "${GIT_OUTPUT_PRERELEASE}" 0 1 GIT_OUTPUT_PRERELEASE) + # Split into components + list(GET GIT_OUTPUT 0 GIT_OUTPUT_MAJOR) + list(GET GIT_OUTPUT 1 GIT_OUTPUT_MINOR) + list(GET GIT_OUTPUT 2 GIT_OUTPUT_PATCH) + list(GET GIT_OUTPUT 3 GIT_OUTPUT_TWEAK) + list(GET GIT_OUTPUT 4 GIT_OUTPUT_BUILD) - if(NOT GIT_OUTPUT_TWEAK STREQUAL GIT_OUTPUT_TWEAK) - message(WARNING "'git' tag mismatches detected version: '${GIT_OUTPUT_TWEAK}' != '${GIT_OUTPUT_TWEAK}'.") - endif() - endif() - - # Update our global version. - version(GENERATE _VERSION COMPRESS - MAJOR "${GIT_OUTPUT_MAJOR}" - MINOR "${GIT_OUTPUT_MINOR}" - PATCH "${GIT_OUTPUT_PATCH}" - TWEAK "${GIT_OUTPUT_TWEAK}" - PRERELEASE "${GIT_OUTPUT_PRERELEASE}" - BUILD "${_VERSION_BUILD}" - REQUIRE "PATCH;TWEAK" - ) - else() - # Try and calculate the exist version using git. - execute_process(COMMAND "${GIT}" describe --tags --long --abbrev=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL "")) - # Result will be MAJOR.MINOR.PATCH-TWEAK-gHASH - string(REPLACE "-" ";" GIT_OUTPUT "${GIT_OUTPUT}") - string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}") - - # Split into components - list(GET GIT_OUTPUT 0 GIT_OUTPUT_MAJOR) - list(GET GIT_OUTPUT 1 GIT_OUTPUT_MINOR) - list(GET GIT_OUTPUT 2 GIT_OUTPUT_PATCH) - list(GET GIT_OUTPUT 3 GIT_OUTPUT_TWEAK) - list(GET GIT_OUTPUT 4 GIT_OUTPUT_BUILD) - - # Special case: Tag contains prerelease - if(GIT_OUTPUT_PATCH MATCHES "([0-9]+)([a-zA-Z]+)([0-9]*)") - # Patch requires special parsing. - set(GIT_OUTPUT_PATCH "${CMAKE_MATCH_1}") - MATH(EXPR GIT_OUTPUT_TWEAK "${GIT_OUTPUT_TWEAK} + ${CMAKE_MATCH_3}") - - # Modify the global version - version(MODIFY _VERSION "${_VERSION}" COMPRESS - MAJOR "${GIT_OUTPUT_MAJOR}" - MINOR "${GIT_OUTPUT_MINOR}" - PATCH "${GIT_OUTPUT_PATCH}" - TWEAK "${GIT_OUTPUT_TWEAK}" - BUILD "${GIT_OUTPUT_BUILD}" - PRERELEASE "a" - REQUIRE "PATCH;TWEAK" - ) + # Special case: Tag contains prerelease + if(GIT_OUTPUT_PATCH MATCHES "([0-9]+)([a-zA-Z]+)([0-9]*)") + # Patch requires special parsing. + set(GIT_OUTPUT_PATCH "${CMAKE_MATCH_1}") + if(CMAKE_MATCH_3 GREATER 0) + set(GIT_OUTPUT_PRERELEASE "${CMAKE_MATCH_2}") else() - # Modify the global version - version(MODIFY _VERSION "${_VERSION}" COMPRESS - MAJOR "${GIT_OUTPUT_MAJOR}" - MINOR "${GIT_OUTPUT_MINOR}" - PATCH "${GIT_OUTPUT_PATCH}" - TWEAK "${GIT_OUTPUT_TWEAK}" - BUILD "${GIT_OUTPUT_BUILD}" - PRERELEASE "a" - REQUIRE "PATCH;TWEAK" - ) + set(GIT_OUTPUT_PRERELEASE "a") endif() + MATH(EXPR GIT_OUTPUT_TWEAK "${GIT_OUTPUT_TWEAK} + ${CMAKE_MATCH_3}") + + # Modify the global version + version(MODIFY _VERSION "${_VERSION}" COMPRESS + MAJOR "${GIT_OUTPUT_MAJOR}" + MINOR "${GIT_OUTPUT_MINOR}" + PATCH "${GIT_OUTPUT_PATCH}" + TWEAK "${GIT_OUTPUT_TWEAK}" + BUILD "${GIT_OUTPUT_BUILD}" + PRERELEASE "${GIT_OUTPUT_PRERELEASE}" + REQUIRE "PATCH;TWEAK" + ) else() - execute_process(COMMAND "${GIT}" rev-list --count HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - message(STATUS "GIT=${GIT_RESULT},${GIT_OUTPUT},${GIT_ERROR}") + # Modify the global version + version(MODIFY _VERSION "${_VERSION}" COMPRESS + MAJOR "${GIT_OUTPUT_MAJOR}" + MINOR "${GIT_OUTPUT_MINOR}" + PATCH "${GIT_OUTPUT_PATCH}" + TWEAK "${GIT_OUTPUT_TWEAK}" + BUILD "${GIT_OUTPUT_BUILD}" + PRERELEASE "a" + REQUIRE "PATCH;TWEAK" + ) + endif() + else() + execute_process(COMMAND "${GIT}" rev-list --count HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL "")) + version(MODIFY _VERSION "${_VERSION}" COMPRESS + TWEAK "${GIT_OUTPUT}" + PRERELEASE "a" + REQUIRE "PATCH;TWEAK" + ) + + # Determine the build using git. + execute_process(COMMAND "${GIT}" log -1 "--pretty=format:g%h" --abbrev=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL "")) version(MODIFY _VERSION "${_VERSION}" COMPRESS - TWEAK "${GIT_OUTPUT}" - PRERELEASE "a" + BUILD "${GIT_OUTPUT}" REQUIRE "PATCH;TWEAK" ) - - execute_process(COMMAND "${GIT}" log -1 "--pretty=format:g%h" --abbrev=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL "")) - version(MODIFY _VERSION "${_VERSION}" COMPRESS - BUILD "${GIT_OUTPUT}" - PRERELEASE "a" - REQUIRE "PATCH;TWEAK" - ) - else() - message(WARNING "Failed to detect full version with 'git'.") - endif() else() - message(WARNING "Failed to automatically detect version with 'git'.") + message(WARNING "Failed to detect build version with 'git'.") endif() + else() + message(WARNING "Failed to automatically detect version with 'git'.") endif() endif() else()