You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 regels
3.9 KiB

  1. # Execute git command and return the output
  2. Function ( GitExecute COMMAND FORCE OUT_RESULT OUT_SUCCESS )
  3. Set ( ${OUT_SUCCESS} 1 PARENT_SCOPE )
  4. Execute_Process ( COMMAND
  5. bash -c "${COMMAND}"
  6. RESULT_VARIABLE
  7. GIT_RET
  8. OUTPUT_VARIABLE
  9. GIT_REV
  10. ERROR_VARIABLE
  11. GIT_ERR )
  12. If ( NOT ${GIT_RET} EQUAL 0
  13. OR NOT "${GIT_ERR}" STREQUAL "" )
  14. If ( FORCE )
  15. Message ( FATAL_ERROR "Unable to execute git command (command=${COMMAND} out=${GIT_REV}; err=${GIT_ERR}; ret=${GIT_RET})" )
  16. Else ( )
  17. Set ( ${OUT_SUCCESS} 0 PARENT_SCOPE )
  18. EndIf ( )
  19. EndIf ( )
  20. Set ( ${OUT_RESULT} "${GIT_REV}" PARENT_SCOPE )
  21. EndFunction ( )
  22. # Get the version by reading the git tag
  23. Function ( GitGetVersion GIT_ROOT OUT_MAJOR OUT_MINOR OUT_PATCH OUT_BUILD OUT_HASH OUT_BEHIND OUT_DIRTY )
  24. If ( NOT EXISTS "${GIT_ROOT}/.git" )
  25. Return ( )
  26. EndIf ( )
  27. # Find the latest git tag
  28. GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} describe --tags --abbrev=1 --match v[0-9].[0-9]* HEAD" False TAG SUCCESS )
  29. If ( NOT ${SUCCESS} )
  30. Return ( )
  31. EndIf ( )
  32. GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} status -s -uall" True DIRTY SUCCESS )
  33. If ( NOT ${SUCCESS} )
  34. Return ( )
  35. EndIf ( )
  36. GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD" True HASH SUCCESS )
  37. If ( NOT ${SUCCESS} )
  38. Return ( )
  39. EndIf ( )
  40. # Split the git revision string
  41. String ( REGEX REPLACE "^v" "" TAG "${TAG}" )
  42. String ( REPLACE "-" ";" SPLIT "${TAG}" )
  43. List ( LENGTH SPLIT COUNT )
  44. If ( ${COUNT} LESS 1 )
  45. Message ( FATAL_ERROR "Unable to split git tag into it's sub components: ${TAG}!" )
  46. EndIf ( )
  47. List ( GET SPLIT 0 VERSION )
  48. If ( ${COUNT} GREATER 1 )
  49. List ( GET SPLIT 1 BEHIND )
  50. Else ( )
  51. Set ( BEHIND 0 )
  52. EndIf ( )
  53. # Split the version
  54. String ( STRIP "${VERSION}" SPLIT )
  55. String ( REPLACE "." ";" SPLIT "${SPLIT}" )
  56. List ( LENGTH SPLIT COUNT )
  57. If ( ${COUNT} LESS 2 )
  58. Message ( FATAL_ERROR "Unable to split version string: ${VERSION}!" )
  59. EndIf ( )
  60. # major
  61. List ( GET SPLIT 0 TMP )
  62. Set ( ${OUT_MAJOR} ${TMP} PARENT_SCOPE )
  63. # minor
  64. List ( GET SPLIT 1 TMP )
  65. Set ( ${OUT_MINOR} ${TMP} PARENT_SCOPE )
  66. # patch
  67. If ( ${COUNT} GREATER 2 )
  68. List ( GET SPLIT 2 TMP )
  69. Set ( ${OUT_PATCH} ${TMP} PARENT_SCOPE )
  70. EndIf ( )
  71. # build
  72. If ( ${COUNT} GREATER 3 )
  73. List ( GET SPLIT 3 TMP )
  74. Set ( ${OUT_BUILD} ${TMP} PARENT_SCOPE )
  75. EndIf ( )
  76. # hash
  77. String ( STRIP "${HASH}" HASH )
  78. Set ( ${OUT_HASH} ${HASH} PARENT_SCOPE )
  79. # behind
  80. Set ( ${OUT_BEHIND} ${BEHIND} PARENT_SCOPE )
  81. # dirty
  82. If ( DIRTY )
  83. Set ( ${OUT_DIRTY} 1 PARENT_SCOPE )
  84. Else ( )
  85. Set ( ${OUT_DIRTY} 0 PARENT_SCOPE )
  86. EndIf ( )
  87. EndFunction ( )
  88. # Get the git hash og the current commit
  89. Function ( GitGetHash GIT_ROOT OUT_HASH )
  90. If ( NOT EXISTS "${GIT_ROOT}/.git" )
  91. Return ( )
  92. EndIf ( )
  93. GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD" True HASH SUCCESS )
  94. If ( NOT ${SUCCESS} )
  95. Return ( )
  96. EndIf ( )
  97. # hash
  98. String ( STRIP "${HASH}" HASH )
  99. Set ( ${OUT_HASH} ${HASH} PARENT_SCOPE )
  100. EndFunction ( )
  101. # Checks if the given git repository has uncommitted changes
  102. Function ( GitGetIsDirty GIT_ROOT OUT_DIRTY )
  103. If ( NOT EXISTS "${GIT_ROOT}/.git" )
  104. Return ( )
  105. EndIf ( )
  106. GitExecute ( "git -C ${CMAKE_CURRENT_SOURCE_DIR} status -s -uall" True DIRTY SUCCESS )
  107. If ( NOT ${SUCCESS} )
  108. Return ( )
  109. EndIf ( )
  110. # dirty
  111. If ( DIRTY )
  112. Set ( ${OUT_DIRTY} 1 PARENT_SCOPE )
  113. Else ( )
  114. Set ( ${OUT_DIRTY} 0 PARENT_SCOPE )
  115. EndIf ( )
  116. EndFunction ( )