sphinxrev.cmake 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # this cmake file fully replaces all old things like svnxrev, hgxrev, etc scripts.
  2. cmake_minimum_required ( VERSION 3.17 )
  3. # guess version strings from current git repo
  4. function ( guess_from_git )
  5. if (NOT EXISTS "${MANTICORE_SOURCE_DIR}/.git")
  6. return ()
  7. endif ()
  8. find_package ( Git QUIET )
  9. if (NOT GIT_FOUND)
  10. return ()
  11. endif ()
  12. # without this in some environments you can get error "detected dubious ownership in repository"
  13. # `git config --global --add safe.directory '*'` in the docker image it runs in may not help. TODO: check why
  14. execute_process ( COMMAND "${GIT_EXECUTABLE}" config --global --add safe.directory "${MANTICORE_SOURCE_DIR}")
  15. # extract short has as SPH_GIT_COMMIT_ID
  16. execute_process ( COMMAND "${GIT_EXECUTABLE}" log -1 --format=%h
  17. WORKING_DIRECTORY "${MANTICORE_SOURCE_DIR}"
  18. RESULT_VARIABLE res
  19. OUTPUT_VARIABLE SPH_GIT_COMMIT_ID
  20. ERROR_QUIET
  21. OUTPUT_STRIP_TRAILING_WHITESPACE )
  22. set ( SPH_GIT_COMMIT_ID "${SPH_GIT_COMMIT_ID}" PARENT_SCOPE )
  23. # extract timestamp and make number YYMMDDHH from it
  24. execute_process ( COMMAND "${GIT_EXECUTABLE}" log -1 --date=format-local:"%y%m%d%H" --format=%cd
  25. WORKING_DIRECTORY "${MANTICORE_SOURCE_DIR}"
  26. RESULT_VARIABLE res
  27. OUTPUT_VARIABLE GIT_TIMESTAMP_ID
  28. OUTPUT_STRIP_TRAILING_WHITESPACE )
  29. string ( SUBSTRING "${GIT_TIMESTAMP_ID}" 1 8 GIT_TIMESTAMP_ID )
  30. set ( GIT_TIMESTAMP_ID ${GIT_TIMESTAMP_ID} PARENT_SCOPE )
  31. # timestamp for reproducible packages
  32. execute_process ( COMMAND "${GIT_EXECUTABLE}" log -1 --pretty=%ct
  33. WORKING_DIRECTORY "${MANTICORE_SOURCE_DIR}"
  34. RESULT_VARIABLE res
  35. OUTPUT_VARIABLE GIT_EPOCH_ID
  36. ERROR_QUIET
  37. OUTPUT_STRIP_TRAILING_WHITESPACE )
  38. set ( SOURCE_DATE_EPOCH ${GIT_EPOCH_ID} PARENT_SCOPE )
  39. # extract branch name (top of 'git status -s -b'), throw out leading '## '
  40. execute_process ( COMMAND "${GIT_EXECUTABLE}" status -s -b
  41. WORKING_DIRECTORY "${MANTICORE_SOURCE_DIR}"
  42. RESULT_VARIABLE res
  43. OUTPUT_VARIABLE GIT_BRANCH_ID
  44. ERROR_QUIET
  45. OUTPUT_STRIP_TRAILING_WHITESPACE )
  46. string ( REGEX REPLACE "\n.*$" "" GIT_BRANCH_ID "${GIT_BRANCH_ID}" )
  47. string ( REPLACE "## " "" GIT_BRANCH_ID "${GIT_BRANCH_ID}" )
  48. set ( GIT_BRANCH_ID "git branch ${GIT_BRANCH_ID}" PARENT_SCOPE )
  49. endfunction ()
  50. # guess version strings from template header file (git archive mark it there)
  51. function ( extract_from_git_slug HEADER )
  52. if (EXISTS "${HEADER}")
  53. FILE ( STRINGS "${HEADER}" _CONTENT )
  54. foreach (LINE ${_CONTENT})
  55. # match definitions like - // GIT_*_ID VALUE
  56. if ("${LINE}" MATCHES "^//[ \t]+(GIT_.*_ID)[ \t]\"(.*)\"")
  57. set ( ${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" )
  58. endif ()
  59. endforeach ()
  60. if (GIT_COMMIT_ID STREQUAL "$Format:%h$")
  61. return () # no slug
  62. endif ()
  63. # commit id
  64. set ( SPH_GIT_COMMIT_ID "${GIT_COMMIT_ID}" PARENT_SCOPE )
  65. # timestamp
  66. string ( REPLACE "-" "" GIT_TIMESTAMP_ID "${GIT_TIMESTAMP_ID}" )
  67. string ( SUBSTRING "${GIT_TIMESTAMP_ID}" 2 6 GIT_TIMESTAMP_ID )
  68. set ( GIT_TIMESTAMP_ID "${GIT_TIMESTAMP_ID}" PARENT_SCOPE )
  69. # epoch for packaging
  70. set ( SOURCE_DATE_EPOCH ${GIT_EPOCH_ID} PARENT_SCOPE )
  71. # branch id
  72. set ( GIT_BRANCH_ID "from tarball" PARENT_SCOPE )
  73. endif ()
  74. endfunction ()
  75. # function definitions finished, execution starts from here
  76. ##################################
  77. # first try to use binary git
  78. guess_from_git ()
  79. # 2-nd try - if we build from git archive. Correct hash and date provided then, but no branch
  80. if (NOT SPH_GIT_COMMIT_ID)
  81. extract_from_git_slug ( "${MANTICORE_SOURCE_DIR}/src/sphinxversion.h.in" )
  82. endif ()
  83. # extract version number string from sphinxversion.h.in
  84. if (NOT VERNUMBERS)
  85. FILE ( STRINGS "${MANTICORE_SOURCE_DIR}/src/sphinxversion.h.in" _STRINGS LIMIT_COUNT 500
  86. REGEX "^#define[ \t]+VERNUMBERS.*" )
  87. STRING ( REGEX REPLACE ".*\"(.*)\"(.*)$" "\\1" VERNUMBERS "${_STRINGS}" )
  88. endif ()
  89. if (NOT SPH_GIT_COMMIT_ID)
  90. # nothing found, fall back to fake 'developer' version. That is ok if sources mirrored to another host without .git
  91. message ( STATUS "Dev mode, no guess, using predefined version" )
  92. if (NOT VERNUMBERS)
  93. set ( VERNUMBERS "0.0.1" )
  94. endif ()
  95. set ( GIT_TIMESTAMP_ID "220512" )
  96. set ( SPH_GIT_COMMIT_ID "DEADBEEF" )
  97. set ( BUILD_TAG "devmode" )
  98. set ( GIT_BRANCH_ID "developer version" )
  99. set ( SOURCE_DATE_EPOCH "1607089638" )
  100. set ( DEV_BUILD ON )
  101. endif ()
  102. set ( GDB_SOURCE_DIR "${MANTICORE_SOURCE_DIR}" )
  103. # All info collected (we need SPH_GIT_COMMIT_ID, GIT_TIMESTAMP_ID, GIT_BRANCH_ID and BUILD_TAG, if any)
  104. set ( VERFILE "${MANTICORE_BINARY_DIR}/config/gen_sphinxversion.h" )
  105. configure_file ( "${MANTICORE_SOURCE_DIR}/src/sphinxversion.h.in" "${VERFILE}" )
  106. configure_file ( "${MANTICORE_SOURCE_DIR}/dist/CPackOptions.cmake.in" "${MANTICORE_BINARY_DIR}/config/CPackOptions.cmake" @ONLY )
  107. # configure packaging
  108. SET ( ENV{SOURCE_DATE_EPOCH} "${SOURCE_DATE_EPOCH}" ) # that makes builds reproducable
  109. SET ( CPACK_PACKAGE_VERSION "${VERNUMBERS}-${GIT_TIMESTAMP_ID}-${SPH_GIT_COMMIT_ID}" )
  110. string ( TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_PACKAGE_NAME_LOWERCASE )
  111. SET ( CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME_LOWERCASE}-${CPACK_PACKAGE_VERSION}" )
  112. SET ( CPACK_RPM_PACKAGE_VERSION "${VERNUMBERS}_${GIT_TIMESTAMP_ID}.${SPH_GIT_COMMIT_ID}" )