make_git_source_version.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #!/usr/bin/env sh
  2. # shellcheck disable=SC3040
  3. # vim: filetype=sh:tabstop=4:tw=76
  4. # shellcheck disable=SC2006,SC2046,SC2065
  5. test _$(printf '%s' "asdf" 2> /dev/null) != "_asdf" > /dev/null &&
  6. printf '%s\n' \
  7. "Error: This shell seems to be csh, which is not supported." &&
  8. exit 1
  9. set +e > /dev/null 2>&1
  10. set +u > /dev/null 2>&1
  11. # shellcheck disable=SC2046
  12. eval export $(locale 2> /dev/null) > /dev/null 2>&1 || true
  13. DUALCASE=1 && export DUALCASE
  14. LC_ALL=C && export LC_ALL
  15. LANGUAGE=C && export LANGUAGE
  16. LANG=C && export LANG
  17. (unset CDPATH > /dev/null 2>&1) > /dev/null 2>&1 &&
  18. unset CDPATH > /dev/null 2>&1
  19. if [ ".${ZSH_VERSION:-}" != "." ] &&
  20. (emulate sh 2> /dev/null) > /dev/null 2>&1; then
  21. emulate sh > /dev/null 2>&1
  22. NULLCMD=: && export NULLCMD
  23. # shellcheck disable=SC2142
  24. alias -g '${1+"$@"}'='"$@"' > /dev/null 2>&1
  25. unalias -a > /dev/null 2>&1 || true > /dev/null 2>&1
  26. unalias -m '*' > /dev/null 2>&1
  27. disable -f -m '*' > /dev/null 2>&1
  28. setopt pipefail > /dev/null 2>&1
  29. POSIXLY_CORRECT=1 && export POSIXLY_CORRECT
  30. POSIX_ME_HARDER=1 && export POSIX_ME_HARDER
  31. elif [ ".${BASH_VERSION:-}" != "." ] &&
  32. (set -o posix 2> /dev/null) > /dev/null 2>&1; then
  33. set -o posix > /dev/null 2>&1
  34. set -o pipefail > /dev/null 2>&1
  35. POSIXLY_CORRECT=1 && export POSIXLY_CORRECT
  36. POSIX_ME_HARDER=1 && export POSIX_ME_HARDER
  37. unalias -a > /dev/null 2>&1 || true > /dev/null 2>&1
  38. fi
  39. for as_var in BASH_ENV ENV MAIL MAILPATH; do
  40. # shellcheck disable=SC1083,SC2015
  41. eval test x\${"${as_var:?}"+set} = xset &&
  42. (
  43. (unset "${as_var:-}") ||
  44. {
  45. printf >&2 '%s\n' \
  46. "Error: clear environment failed."
  47. exit 1
  48. }
  49. ) &&
  50. unset "${as_var:-}" || true
  51. done
  52. TZ="UTC" && export TZ > /dev/null 2>&1
  53. set -u > /dev/null 2>&1
  54. set -e > /dev/null 2>&1
  55. get_git_info()
  56. {
  57. if command command true 2> /dev/null 1>&2; then
  58. if command git version 2> /dev/null 1>&2; then
  59. GITTEST=$(git version 2> /dev/null)
  60. # shellcheck disable=SC2236
  61. if [ -n "${GITTEST:-}" ] &&
  62. [ ! -z "${GITTEST:-}" ]; then
  63. BRANCH=$(git branch --show-current 2> /dev/null)
  64. CDDATE=" "$(git show -s --format="%cd" \
  65. --date="format:%Y-%m-%d" 2> /dev/null)
  66. GITVER=$(git describe --long --dirty --tags --always \
  67. 2> /dev/null)
  68. if [ ! -n "${BRANCH:-}" ] ||
  69. [ -z "${BRANCH:-}" ]; then
  70. BRANCH="nobranch"
  71. fi
  72. if [ "${BRANCH:-}" = "master" ] ||
  73. [ "${BRANCH:-}" = "main" ] ||
  74. [ "${BRANCH:-}" = "trunk" ] ||
  75. [ "${BRANCH:-}" = "nobranch" ]; then
  76. if [ -n "${GITVER:-}" ] &&
  77. [ ! -z "${GITVER:-}" ]; then
  78. GIT_OUT=$(printf '%s' \
  79. "${GITVER:?}${CDDATE:?}" |
  80. sed -e 's/-0-g.* / /' \
  81. -e 's/-[0-9]\+-g/+-g/')
  82. fi
  83. else
  84. if [ -n "${GITVER:-}" ] &&
  85. [ ! -z "${GITVER:-}" ]; then
  86. GIT_OUT=$(printf '%s' \
  87. "${GITVER:?}-${BRANCH:?}${CDDATE:?}" |
  88. sed -e 's/-0-g.* / /' \
  89. -e 's/-[0-9]\+-g/+-g/')
  90. fi
  91. fi
  92. fi
  93. else
  94. printf >&2 '%s\n' \
  95. "Error: git version failed."
  96. exit 1
  97. fi
  98. else
  99. printf >&2 '%s\n' \
  100. "Error: command true failed."
  101. exit 1
  102. fi
  103. GIT_SOURCE_INFO="${GIT_OUT:-0.0.0} "
  104. GIT_SOURCE_XFRM=$(printf '%s\n' "${GIT_SOURCE_INFO:?}" | \
  105. sed -e 's/VERSION_//' -e 's/_/\./g' 2> /dev/null) ||
  106. {
  107. printf >&2 '%s\n' \
  108. "Error: sed failed."
  109. exit 1
  110. }
  111. # shellcheck disable=SC2236
  112. if [ -n "${GIT_SOURCE_XFRM:-}" ] &&
  113. [ ! -z "${GIT_SOURCE_XFRM:-}" ]; then
  114. printf '%s\n' \
  115. "${GIT_SOURCE_XFRM:?}"
  116. else
  117. printf '%s\n' \
  118. "${GIT_SOURCE_INFO:?}"
  119. fi
  120. }
  121. get_utc_date()
  122. {
  123. UTC_BLD_DATE=$(TZ=UTC date -u "+%Y-%m-%d" 2> /dev/null) ||
  124. {
  125. printf >&2 '%s\n' \
  126. "Error: date failed."
  127. exit 1
  128. }
  129. # shellcheck disable=SC2236
  130. if [ -n "${UTC_BLD_DATE:-}" ] &&
  131. [ ! -z "${UTC_BLD_DATE:-}" ]; then
  132. UTC_BLD_DATE_INFO="(compiled ${UTC_BLD_DATE:?})"
  133. else
  134. UTC_BLD_DATE_INFO=""
  135. fi
  136. printf '%s\n' \
  137. "${UTC_BLD_DATE_INFO:-}"
  138. }
  139. BUILD_VER="$(get_git_info)" ||
  140. {
  141. printf >&2 '%s\n' \
  142. "Error: get_git_info() failed."
  143. exit 1
  144. }
  145. BUILD_UTC="$(get_utc_date)" ||
  146. {
  147. printf >&2 '%s\n' \
  148. "Error: get_utc_date() failed."
  149. exit 1
  150. }
  151. test "${REPRODUCIBLE:-}" = "1" &&
  152. {
  153. BUILD_UTC=""
  154. }
  155. # shellcheck disable=SC1003
  156. printf '%s\n' \
  157. '/* NOTICE: Auto-generated by "make_git_source_version.sh" */' \
  158. "/* MODIFICATIONS MADE DIRECTLY TO THIS FILE WILL BE LOST. */" \
  159. "" \
  160. "#ifndef GIT_SOURCE_VERSION_VERINFO_H" \
  161. "#define GIT_SOURCE_VERSION_VERINFO_H" \
  162. "" \
  163. '#define GIT_SOURCE_VERSION \' \
  164. " \"${BUILD_VER:?}${BUILD_UTC:-}\"" \
  165. "" \
  166. "#endif /* GIT_SOURCE_VERSION_VERINFO_H */" \
  167. > "./verinfo.h" ||
  168. {
  169. printf >&2 '%s\n' \
  170. "Error: writing verinfo.h failed."
  171. exit 1
  172. }
  173. # Local Variables:
  174. # mode: sh
  175. # sh-shell: sh
  176. # sh-indentation: 4
  177. # sh-basic-offset: 4
  178. # tab-width: 4
  179. # End: