update-clang.sh 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/env bash
  2. # Copyright (c) 2012 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. # This script will check out llvm and clang into third_party/llvm and build it.
  6. # Do NOT CHANGE this if you don't know what you're doing -- see
  7. # https://code.google.com/p/chromium/wiki/UpdatingClang
  8. # Reverting problematic clang rolls is safe, though.
  9. CLANG_REVISION=313786
  10. # This is incremented when pushing a new build of Clang at the same revision.
  11. CLANG_SUB_REVISION=1
  12. PACKAGE_VERSION="${CLANG_REVISION}-${CLANG_SUB_REVISION}"
  13. THIS_DIR="$(dirname "${0}")"
  14. LLVM_DIR="${THIS_DIR}/../vendor/llvm"
  15. LLVM_BUILD_DIR="${LLVM_DIR}/../llvm-build/Release+Asserts"
  16. STAMP_FILE="${LLVM_DIR}/../llvm-build/cr_build_revision"
  17. # ${A:-a} returns $A if it's set, a else.
  18. LLVM_REPO_URL=${LLVM_URL:-https://llvm.org/svn/llvm-project}
  19. CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang
  20. S3_URL=https://s3.amazonaws.com/gh-contractor-zcbenz/clang
  21. # Die if any command dies, error on undefined variable expansions.
  22. set -eu
  23. OS="$(uname -s)"
  24. # Check if there's anything to be done, exit early if not.
  25. if [[ -f "${STAMP_FILE}" ]]; then
  26. PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}")
  27. if [[ "${PREVIOUSLY_BUILT_REVISON}" = "${PACKAGE_VERSION}" ]]; then
  28. echo "Clang already at ${PACKAGE_VERSION}"
  29. exit 0
  30. fi
  31. fi
  32. # To always force a new build if someone interrupts their build half way.
  33. rm -f "${STAMP_FILE}"
  34. # Check if there's a prebuilt binary and if so just fetch that. That's faster,
  35. # and goma relies on having matching binary hashes on client and server too.
  36. CDS_FILE="clang-${PACKAGE_VERSION}.tgz"
  37. CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX)
  38. CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}"
  39. if [ "${OS}" = "Linux" ]; then
  40. ARCH="$(uname -m)"
  41. if [ "${ARCH}" = "aarch64" ]; then
  42. CDS_FULL_URL="${S3_URL}/arm64/${CDS_FILE}"
  43. else
  44. CDS_FULL_URL="${CDS_URL}/Linux_x64/${CDS_FILE}"
  45. fi
  46. elif [ "${OS}" = "Darwin" ]; then
  47. CDS_FULL_URL="${CDS_URL}/Mac/${CDS_FILE}"
  48. fi
  49. echo Trying to download prebuilt clang
  50. if which curl > /dev/null; then
  51. curl -L --fail "${CDS_FULL_URL}" -o "${CDS_OUTPUT}" || \
  52. rm -rf "${CDS_OUT_DIR}"
  53. elif which wget > /dev/null; then
  54. wget "${CDS_FULL_URL}" -O "${CDS_OUTPUT}" || rm -rf "${CDS_OUT_DIR}"
  55. else
  56. echo "Neither curl nor wget found. Please install one of these."
  57. exit 1
  58. fi
  59. if [ -f "${CDS_OUTPUT}" ]; then
  60. rm -rf "${LLVM_BUILD_DIR}"
  61. mkdir -p "${LLVM_BUILD_DIR}"
  62. tar -xzf "${CDS_OUTPUT}" -C "${LLVM_BUILD_DIR}"
  63. echo clang "${PACKAGE_VERSION}" unpacked
  64. echo "${PACKAGE_VERSION}" > "${STAMP_FILE}"
  65. rm -rf "${CDS_OUT_DIR}"
  66. exit 0
  67. else
  68. echo Did not find prebuilt clang "${PACKAGE_VERSION}", building
  69. fi