checkout.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/usr/bin/env bash
  2. #===- llvm/utils/docker/scripts/checkout.sh ---------------------===//
  3. #
  4. # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. # See https://llvm.org/LICENSE.txt for license information.
  6. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. #
  8. #===-----------------------------------------------------------------------===//
  9. set -e
  10. function show_usage() {
  11. cat << EOF
  12. Usage: checkout.sh [options]
  13. Checkout svn sources into /tmp/clang-build/src. Used inside a docker container.
  14. Available options:
  15. -h|--help show this help message
  16. -b|--branch svn branch to checkout, i.e. 'trunk',
  17. 'branches/release_40'
  18. (default: 'trunk')
  19. -r|--revision svn revision to checkout
  20. -c|--cherrypick revision to cherry-pick. Can be specified multiple times.
  21. Cherry-picks are performed in the sorted order using the
  22. following command:
  23. 'svn patch <(svn diff -c \$rev)'.
  24. -p|--llvm-project name of an svn project to checkout.
  25. For clang, please use 'clang', not 'cfe'.
  26. Project 'llvm' is always included and ignored, if
  27. specified.
  28. Can be specified multiple times.
  29. EOF
  30. }
  31. LLVM_SVN_REV=""
  32. CHERRYPICKS=""
  33. LLVM_BRANCH=""
  34. # We always checkout llvm
  35. LLVM_PROJECTS="llvm"
  36. function contains_project() {
  37. local TARGET_PROJ="$1"
  38. local PROJ
  39. for PROJ in $LLVM_PROJECTS; do
  40. if [ "$PROJ" == "$TARGET_PROJ" ]; then
  41. return 0
  42. fi
  43. done
  44. return 1
  45. }
  46. while [[ $# -gt 0 ]]; do
  47. case "$1" in
  48. -r|--revision)
  49. shift
  50. LLVM_SVN_REV="$1"
  51. shift
  52. ;;
  53. -c|--cherrypick)
  54. shift
  55. CHERRYPICKS="$CHERRYPICKS $1"
  56. shift
  57. ;;
  58. -b|--branch)
  59. shift
  60. LLVM_BRANCH="$1"
  61. shift
  62. ;;
  63. -p|--llvm-project)
  64. shift
  65. PROJ="$1"
  66. shift
  67. if [ "$PROJ" == "cfe" ]; then
  68. PROJ="clang"
  69. fi
  70. if ! contains_project "$PROJ" ; then
  71. if [ "$PROJ" == "clang-tools-extra" ] && [ ! contains_project "clang" ]; then
  72. echo "Project 'clang-tools-extra' specified before 'clang'. Adding 'clang' to a list of projects first."
  73. LLVM_PROJECTS="$LLVM_PROJECTS clang"
  74. fi
  75. LLVM_PROJECTS="$LLVM_PROJECTS $PROJ"
  76. else
  77. echo "Project '$PROJ' is already enabled, ignoring extra occurrences."
  78. fi
  79. ;;
  80. -h|--help)
  81. show_usage
  82. exit 0
  83. ;;
  84. *)
  85. echo "Unknown option: $1"
  86. exit 1
  87. esac
  88. done
  89. if [ "$LLVM_BRANCH" == "" ]; then
  90. LLVM_BRANCH="trunk"
  91. fi
  92. if [ "$LLVM_SVN_REV" != "" ]; then
  93. SVN_REV_ARG="-r$LLVM_SVN_REV"
  94. echo "Checking out svn revision r$LLVM_SVN_REV."
  95. else
  96. SVN_REV_ARG=""
  97. echo "Checking out latest svn revision."
  98. fi
  99. # Sort cherrypicks and remove duplicates.
  100. CHERRYPICKS="$(echo "$CHERRYPICKS" | xargs -n1 | sort | uniq | xargs)"
  101. function apply_cherrypicks() {
  102. local CHECKOUT_DIR="$1"
  103. [ "$CHERRYPICKS" == "" ] || echo "Applying cherrypicks"
  104. pushd "$CHECKOUT_DIR"
  105. # This function is always called on a sorted list of cherrypicks.
  106. for CHERRY_REV in $CHERRYPICKS; do
  107. echo "Cherry-picking r$CHERRY_REV into $CHECKOUT_DIR"
  108. local PATCH_FILE="$(mktemp)"
  109. svn diff -c $CHERRY_REV > "$PATCH_FILE"
  110. svn patch "$PATCH_FILE"
  111. rm "$PATCH_FILE"
  112. done
  113. popd
  114. }
  115. CLANG_BUILD_DIR=/tmp/clang-build
  116. # Get the sources from svn.
  117. echo "Checking out sources from svn"
  118. mkdir -p "$CLANG_BUILD_DIR/src"
  119. for LLVM_PROJECT in $LLVM_PROJECTS; do
  120. if [ "$LLVM_PROJECT" == "clang" ]; then
  121. SVN_PROJECT="cfe"
  122. else
  123. SVN_PROJECT="$LLVM_PROJECT"
  124. fi
  125. if [ "$SVN_PROJECT" != "clang-tools-extra" ]; then
  126. CHECKOUT_DIR="$CLANG_BUILD_DIR/src/$LLVM_PROJECT"
  127. else
  128. CHECKOUT_DIR="$CLANG_BUILD_DIR/src/clang/tools/extra"
  129. fi
  130. echo "Checking out https://llvm.org/svn/llvm-project/$SVN_PROJECT to $CHECKOUT_DIR"
  131. svn co -q $SVN_REV_ARG \
  132. "https://llvm.org/svn/llvm-project/$SVN_PROJECT/$LLVM_BRANCH" \
  133. "$CHECKOUT_DIR"
  134. # We apply cherrypicks to all repositories regardless of whether the revision
  135. # changes this repository or not. For repositories not affected by the
  136. # cherrypick, applying the cherrypick is a no-op.
  137. apply_cherrypicks "$CHECKOUT_DIR"
  138. done
  139. CHECKSUMS_FILE="/tmp/checksums/checksums.txt"
  140. if [ -f "$CHECKSUMS_FILE" ]; then
  141. echo "Validating checksums for LLVM checkout..."
  142. python "$(dirname $0)/llvm_checksum/llvm_checksum.py" -c "$CHECKSUMS_FILE" \
  143. --partial --multi_dir "$CLANG_BUILD_DIR/src"
  144. else
  145. echo "Skipping checksumming checks..."
  146. fi
  147. echo "Done"