# Execute git command and return the output Function ( GitExecute COMMAND FORCE OUT_RESULT OUT_SUCCESS ) Set ( ${OUT_SUCCESS} 1 PARENT_SCOPE ) Execute_Process ( COMMAND bash -c "${COMMAND}" RESULT_VARIABLE GIT_RET OUTPUT_VARIABLE GIT_REV ERROR_VARIABLE GIT_ERR ) If ( NOT ${GIT_RET} EQUAL 0 OR NOT "${GIT_ERR}" STREQUAL "" ) If ( FORCE ) Message ( FATAL_ERROR "Unable to execute git command (command=${COMMAND} out=${GIT_REV}; err=${GIT_ERR}; ret=${GIT_RET})" ) Else ( ) Set ( ${OUT_SUCCESS} 0 PARENT_SCOPE ) EndIf ( ) EndIf ( ) Set ( ${OUT_RESULT} "${GIT_REV}" PARENT_SCOPE ) EndFunction ( ) # Get the version by reading the git tag Function ( GitGetVersion GIT_ROOT OUT_MAJOR OUT_MINOR OUT_PATCH OUT_BUILD OUT_HASH OUT_BEHIND OUT_DIRTY ) If ( NOT EXISTS "${GIT_ROOT}/.git" ) Return ( ) EndIf ( ) # Find the latest git tag GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} describe --tags --abbrev=1 --match v[0-9].[0-9]* HEAD" False TAG SUCCESS ) If ( NOT ${SUCCESS} ) Return ( ) EndIf ( ) GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} status -s -uall" True DIRTY SUCCESS ) If ( NOT ${SUCCESS} ) Return ( ) EndIf ( ) GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD" True HASH SUCCESS ) If ( NOT ${SUCCESS} ) Return ( ) EndIf ( ) # Split the git revision string String ( REGEX REPLACE "^v" "" TAG "${TAG}" ) String ( REPLACE "-" ";" SPLIT "${TAG}" ) List ( LENGTH SPLIT COUNT ) If ( ${COUNT} LESS 1 ) Message ( FATAL_ERROR "Unable to split git tag into it's sub components: ${TAG}!" ) EndIf ( ) List ( GET SPLIT 0 VERSION ) If ( ${COUNT} GREATER 1 ) List ( GET SPLIT 1 BEHIND ) Else ( ) Set ( BEHIND 0 ) EndIf ( ) # Split the version String ( STRIP "${VERSION}" SPLIT ) String ( REPLACE "." ";" SPLIT "${SPLIT}" ) List ( LENGTH SPLIT COUNT ) If ( ${COUNT} LESS 2 ) Message ( FATAL_ERROR "Unable to split version string: ${VERSION}!" ) EndIf ( ) # major List ( GET SPLIT 0 TMP ) Set ( ${OUT_MAJOR} ${TMP} PARENT_SCOPE ) # minor List ( GET SPLIT 1 TMP ) Set ( ${OUT_MINOR} ${TMP} PARENT_SCOPE ) # patch If ( ${COUNT} GREATER 2 ) List ( GET SPLIT 2 TMP ) Set ( ${OUT_PATCH} ${TMP} PARENT_SCOPE ) EndIf ( ) # build If ( ${COUNT} GREATER 3 ) List ( GET SPLIT 3 TMP ) Set ( ${OUT_BUILD} ${TMP} PARENT_SCOPE ) EndIf ( ) # hash String ( STRIP "${HASH}" HASH ) Set ( ${OUT_HASH} ${HASH} PARENT_SCOPE ) # behind Set ( ${OUT_BEHIND} ${BEHIND} PARENT_SCOPE ) # dirty If ( DIRTY ) Set ( ${OUT_DIRTY} 1 PARENT_SCOPE ) Else ( ) Set ( ${OUT_DIRTY} 0 PARENT_SCOPE ) EndIf ( ) EndFunction ( ) # Get the git hash og the current commit Function ( GitGetHash GIT_ROOT OUT_HASH ) If ( NOT EXISTS "${GIT_ROOT}/.git" ) Return ( ) EndIf ( ) GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD" True HASH SUCCESS ) If ( NOT ${SUCCESS} ) Return ( ) EndIf ( ) # hash String ( STRIP "${HASH}" HASH ) Set ( ${OUT_HASH} ${HASH} PARENT_SCOPE ) EndFunction ( ) # Checks if the given git repository has uncommitted changes Function ( GitGetIsDirty GIT_ROOT OUT_DIRTY ) If ( NOT EXISTS "${GIT_ROOT}/.git" ) Return ( ) EndIf ( ) GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} status -s -uall" True DIRTY SUCCESS ) If ( NOT ${SUCCESS} ) Return ( ) EndIf ( ) # dirty If ( DIRTY ) Set ( ${OUT_DIRTY} 1 PARENT_SCOPE ) Else ( ) Set ( ${OUT_DIRTY} 0 PARENT_SCOPE ) EndIf ( ) EndFunction ( )