cc-version.sh 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Print the C compiler name and its version in a 5 or 6-digit form.
  5. # Also, perform the minimum version check.
  6. set -e
  7. # Print the C compiler name and some version components.
  8. get_c_compiler_info()
  9. {
  10. cat <<- EOF | "$@" -E -P -x c - 2>/dev/null
  11. #if defined(__clang__)
  12. Clang __clang_major__ __clang_minor__ __clang_patchlevel__
  13. #elif defined(__GNUC__)
  14. GCC __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
  15. #else
  16. unknown
  17. #endif
  18. EOF
  19. }
  20. # Convert the version string x.y.z to a canonical 5 or 6-digit form.
  21. get_canonical_version()
  22. {
  23. IFS=.
  24. set -- $1
  25. echo $((10000 * $1 + 100 * $2 + $3))
  26. }
  27. # $@ instead of $1 because multiple words might be given, e.g. CC="ccache gcc".
  28. orig_args="$@"
  29. set -- $(get_c_compiler_info "$@")
  30. name=$1
  31. min_tool_version=$(dirname $0)/min-tool-version.sh
  32. case "$name" in
  33. GCC)
  34. version=$2.$3.$4
  35. min_version=$($min_tool_version gcc)
  36. ;;
  37. Clang)
  38. version=$2.$3.$4
  39. min_version=$($min_tool_version llvm)
  40. ;;
  41. *)
  42. echo "$orig_args: unknown C compiler" >&2
  43. exit 1
  44. ;;
  45. esac
  46. cversion=$(get_canonical_version $version)
  47. min_cversion=$(get_canonical_version $min_version)
  48. if [ "$cversion" -lt "$min_cversion" ]; then
  49. echo >&2 "***"
  50. echo >&2 "*** C compiler is too old."
  51. echo >&2 "*** Your $name version: $version"
  52. echo >&2 "*** Minimum $name version: $min_version"
  53. echo >&2 "***"
  54. exit 1
  55. fi
  56. echo $name $cversion