find_compiler.sh 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # shellcheck shell=bash
  2. HOST_COMPILER=""
  3. is_supported_compiler() {
  4. local COMPILER="$1"
  5. if [ -z "$COMPILER" ]; then
  6. return 1
  7. fi
  8. local VERSION=""
  9. VERSION="$($COMPILER -dumpversion 2> /dev/null)" || return 1
  10. local MAJOR_VERSION=""
  11. MAJOR_VERSION="${VERSION%%.*}"
  12. if $COMPILER --version 2>&1 | grep "Apple clang" >/dev/null; then
  13. # Apple Clang version check
  14. BUILD_VERSION=$(echo | $COMPILER -dM -E - | grep __apple_build_version__ | cut -d ' ' -f3)
  15. # Xcode 14.3, based on upstream LLVM 15
  16. [ "$BUILD_VERSION" -ge 14030022 ] && return 0
  17. elif $COMPILER --version 2>&1 | grep "clang" >/dev/null; then
  18. # Clang version check
  19. [ "$MAJOR_VERSION" -ge 17 ] && return 0
  20. else
  21. # GCC version check
  22. [ "$MAJOR_VERSION" -ge 13 ] && return 0
  23. fi
  24. return 1
  25. }
  26. find_newest_compiler() {
  27. local BEST_VERSION=0
  28. local BEST_CANDIDATE=""
  29. for CANDIDATE in "$@"; do
  30. if ! command -v "$CANDIDATE" >/dev/null 2>&1; then
  31. continue
  32. fi
  33. if ! $CANDIDATE -dumpversion >/dev/null 2>&1; then
  34. continue
  35. fi
  36. local VERSION=""
  37. VERSION="$($CANDIDATE -dumpversion)"
  38. local MAJOR_VERSION="${VERSION%%.*}"
  39. if [ "$MAJOR_VERSION" -gt "$BEST_VERSION" ]; then
  40. BEST_VERSION=$MAJOR_VERSION
  41. BEST_CANDIDATE="$CANDIDATE"
  42. fi
  43. done
  44. HOST_COMPILER=$BEST_CANDIDATE
  45. }
  46. pick_host_compiler() {
  47. CC=${CC:-"cc"}
  48. CXX=${CXX:-"c++"}
  49. if is_supported_compiler "$CC" && is_supported_compiler "$CXX"; then
  50. return
  51. fi
  52. find_newest_compiler clang clang-17 clang-18 /opt/homebrew/opt/llvm/bin/clang
  53. if is_supported_compiler "$HOST_COMPILER"; then
  54. export CC="${HOST_COMPILER}"
  55. export CXX="${HOST_COMPILER/clang/clang++}"
  56. return
  57. fi
  58. find_newest_compiler egcc gcc gcc-13 gcc-14 /usr/local/bin/gcc-{13,14} /opt/homebrew/bin/gcc-{13,14}
  59. if is_supported_compiler "$HOST_COMPILER"; then
  60. export CC="${HOST_COMPILER}"
  61. export CXX="${HOST_COMPILER/gcc/g++}"
  62. return
  63. fi
  64. if [ "$(uname -s)" = "Darwin" ]; then
  65. die "Please make sure that Xcode 14.3, Homebrew Clang 17, or higher is installed."
  66. else
  67. die "Please make sure that GCC version 13, Clang version 17, or higher is installed."
  68. fi
  69. }