install-toolchains.sh 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env bash
  2. set -euxo pipefail
  3. LLVM_VERSION="9.0.0" # This is not necessarily guaranteed (e.g. we might use the system compiler)
  4. install_clang() {
  5. local cc="clang++" osversion="" url="" urlbase="https://releases.llvm.org" targetdir="/usr/local"
  6. case "${OSTYPE}" in
  7. msys)
  8. osversion=win
  9. if [ "${HOSTTYPE}" != "${HOSTTYPE%64}" ]; then
  10. osversion="${osversion}64"
  11. else
  12. osversion="${osversion}32"
  13. fi
  14. url="${urlbase}/${LLVM_VERSION}/LLVM-${LLVM_VERSION}-${osversion}.exe"
  15. cc="clang-cl"
  16. ;;
  17. linux-gnu)
  18. osversion="${OSTYPE}-$(sed -n -e '/^PRETTY_NAME/ { s/^[^=]*="\(.*\)"/\1/g; s/ /-/; s/\([0-9]*\.[0-9]*\)\.[0-9]*/\1/; s/ .*//; p }' /etc/os-release | tr '[:upper:]' '[:lower:]')"
  19. ;;
  20. darwin*)
  21. osversion="darwin-apple"
  22. ;;
  23. esac
  24. if [ -z "${url}" ]; then
  25. url="${urlbase}/${LLVM_VERSION}/clang+llvm-${LLVM_VERSION}-${HOSTTYPE}-${osversion}.tar.xz"
  26. fi
  27. if ! command -v "${cc}"; then
  28. case "${osversion}" in
  29. linux-gnu-ubuntu*)
  30. sudo apt-get install -qq -o=Dpkg::Use-Pty=0 clang clang-format clang-tidy
  31. ;;
  32. *) # Fallback for all platforms is to download from LLVM's site, but avoided until necessary
  33. local target="./${url##*/}"
  34. curl -f -s -L -R --show-error -o "${target}" "${url}"
  35. if [ "${OSTYPE}" = "msys" ]; then
  36. mkdir -p -- "${targetdir}"
  37. 7z x -bsp0 -bso0 "${target}" -o"${targetdir}"
  38. MSYS2_ARG_CONV_EXCL="*" Reg Add "HKLM\SOFTWARE\LLVM\LLVM" /ve /t REG_SZ /f /reg:32 \
  39. /d "$(cygpath -w -- "${targetdir}")" > /dev/null
  40. rm -f -- "${target}"
  41. else
  42. sudo tar -x -J --strip-components=1 -f "${target}" -C "${targetdir}"
  43. fi
  44. ;;
  45. esac
  46. fi
  47. "${cc}" --version
  48. }
  49. install_toolchains() {
  50. local uses_clang=1 some_lightweight_target="//:sha256"
  51. if bazel aquery --config=get-toolchain --output=textproto "${some_lightweight_target}" |
  52. grep "external_Slocal_Uconfig_Ucc_Cmsvc_Ucompiler_Ufiles" > /dev/null; then
  53. # We detected that we use MSVC, not Clang
  54. uses_clang=0
  55. fi
  56. if [ 0 -ne "${uses_clang}" ]; then
  57. install_clang "$@"
  58. fi
  59. }
  60. install_toolchains "$@"