From 2adae5a893333df7e7c8f6f2120f509387d10a75 Mon Sep 17 00:00:00 2001 From: kj16609 Date: Sat, 8 Nov 2025 22:35:24 -0500 Subject: [PATCH] Adds logic for adding the git tag to defines --- modules/git/commit.cmake | 7 ++- modules/git/tag.cmake | 95 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 modules/git/tag.cmake diff --git a/modules/git/commit.cmake b/modules/git/commit.cmake index a2d92d7..3e1fb0c 100644 --- a/modules/git/commit.cmake +++ b/modules/git/commit.cmake @@ -71,10 +71,6 @@ function(addGitBranchDefine TARGET) target_compile_definitions(${TARGET} PRIVATE FGL_GIT_BRANCH="${GIT_BRANCH}") endfunction() -function(addGitTagDefine TARGET) - getGitTag(GIT_TAG) - target_compile_definitions(${TARGET} PRIVATE FGL_GIT_TAG="${GIT_TAG}") -endfunction() function(getIsDirty OUTPUT_VARIABLE) find_package(Git QUIET) @@ -107,9 +103,12 @@ function(addGitDirtyDefine TARGET) target_compile_definitions(${TARGET} PRIVATE FGL_GIT_IS_DIRTY=1) endfunction() +include(modules/git/tag.cmake) + function(AddGitInfo TARGET) addGitCommitDefine(${TARGET}) addGitBranchDefine(${TARGET}) addGitDirtyDefine(${TARGET}) addGitTagDefine(${TARGET}) + addGitUnsyncedDefine(${TARGET}) endfunction() diff --git a/modules/git/tag.cmake b/modules/git/tag.cmake new file mode 100644 index 0000000..7ca41fe --- /dev/null +++ b/modules/git/tag.cmake @@ -0,0 +1,95 @@ +function(getGitTagVersion) + execute_process( + COMMAND git describe --tags --abbrev=0 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + if (NOT GIT_TAG_VERSION) + set(GIT_TAG_VERSION "v0.0.0") + endif () + + string(REGEX MATCH "v?([0-9]+)\\.([0-9]+)\\.([0-9]+)" _ ${GIT_TAG_VERSION}) + if (CMAKE_MATCH_1) + set(VERSION_MAJOR ${CMAKE_MATCH_1}) + else () + set(VERSION_MAJOR 0) + endif () + if (CMAKE_MATCH_2) + set(VERSION_MINOR ${CMAKE_MATCH_2}) + else () + set(VERSION_MINOR 0) + endif () + if (CMAKE_MATCH_3) + set(VERSION_PATCH ${CMAKE_MATCH_3}) + else () + set(VERSION_PATCH 0) + endif () + + set(GIT_TAG_VERSION ${GIT_TAG_VERSION} PARENT_SCOPE) + set(VERSION_MAJOR ${VERSION_MAJOR} PARENT_SCOPE) + set(VERSION_MINOR ${VERSION_MINOR} PARENT_SCOPE) + set(VERSION_PATCH ${VERSION_PATCH} PARENT_SCOPE) +endfunction() + +function(setGitTagVersionDefines TARGET) + getGitTagVersion() + + message("Adding targets to ${TARGET}_X_VERSION") + + target_compile_definitions(${TARGET} PUBLIC + ${TARGET}_MAJOR_VERSION=${VERSION_MAJOR} + ${TARGET}_MINOR_VERSION=${VERSION_MINOR} + ${TARGET}_PATCH_VERSION=${VERSION_PATCH} + ) +endfunction() + +function(addGitTagDefine TARGET) + getGitTag(GIT_TAG) + setGitTagVersionDefines(${TARGET}) + target_compile_definitions(${TARGET} PRIVATE FGL_GIT_TAG="${GIT_TAG}") +endfunction() + +function(getIsUnsynced OUTPUT_VARIABLE) + find_package(Git QUIET) + if (GIT_FOUND) + # Get the commit hash of the latest tag + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-list -n 1 $ (${GIT_EXECUTABLE} describe --tags --abbrev=0) + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE TAG_COMMIT + ERROR_VARIABLE GIT_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + # Get the current commit hash + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE CURRENT_COMMIT + ERROR_VARIABLE GIT_ERROR2 + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if (NOT GIT_ERROR AND NOT GIT_ERROR2) + if (NOT "${CURRENT_COMMIT}" STREQUAL "${TAG_COMMIT}") + set(${OUTPUT_VARIABLE} "1" PARENT_SCOPE) + else () + set(${OUTPUT_VARIABLE} "0" PARENT_SCOPE) + endif () + else () + set(${OUTPUT_VARIABLE} "-1" PARENT_SCOPE) + endif () + else () + set(${OUTPUT_VARIABLE} "-1" PARENT_SCOPE) + endif () +endfunction() + +function(addGitUnsyncedDefine TARGET) + getIsUnsynced(GIT_UNSYNCED) + target_compile_definitions(${TARGET} PRIVATE FGL_GIT_UNSYNCED=${GIT_UNSYNCED}) +endfunction() \ No newline at end of file