forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			174 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env bash
 | |
| #===- llvm/utils/docker/scripts/checkout.sh ---------------------===//
 | |
| #
 | |
| #                     The LLVM Compiler Infrastructure
 | |
| #
 | |
| # This file is distributed under the University of Illinois Open Source
 | |
| # License. See LICENSE.TXT for details.
 | |
| #
 | |
| #===-----------------------------------------------------------------------===//
 | |
| 
 | |
| set -e
 | |
| 
 | |
| function show_usage() {
 | |
|   cat << EOF
 | |
| Usage: checkout.sh [options]
 | |
| 
 | |
| Checkout svn sources into /tmp/clang-build/src. Used inside a docker container.
 | |
| 
 | |
| Available options:
 | |
|   -h|--help           show this help message
 | |
|   -b|--branch         svn branch to checkout, i.e. 'trunk',
 | |
|                       'branches/release_40'
 | |
|                       (default: 'trunk')
 | |
|   -r|--revision       svn revision to checkout
 | |
|   -c|--cherrypick     revision to cherry-pick. Can be specified multiple times.
 | |
|                       Cherry-picks are performed in the sorted order using the
 | |
|                       following command:
 | |
|                       'svn patch <(svn diff -c \$rev)'.
 | |
|   -p|--llvm-project   name of an svn project to checkout.
 | |
|                       For clang, please use 'clang', not 'cfe'.
 | |
|                       Project 'llvm' is always included and ignored, if
 | |
|                       specified.
 | |
|                       Can be specified multiple times.
 | |
| EOF
 | |
| }
 | |
| 
 | |
| LLVM_SVN_REV=""
 | |
| CHERRYPICKS=""
 | |
| LLVM_BRANCH=""
 | |
| # We always checkout llvm
 | |
| LLVM_PROJECTS="llvm"
 | |
| 
 | |
| function contains_project() {
 | |
|   local TARGET_PROJ="$1"
 | |
|   local PROJ
 | |
|   for PROJ in $LLVM_PROJECTS; do
 | |
|     if [ "$PROJ" == "$TARGET_PROJ" ]; then
 | |
|       return 0
 | |
|     fi
 | |
|   done
 | |
|   return 1
 | |
| }
 | |
| 
 | |
| while [[ $# -gt 0 ]]; do
 | |
|   case "$1" in
 | |
|     -r|--revision)
 | |
|       shift
 | |
|       LLVM_SVN_REV="$1"
 | |
|       shift
 | |
|       ;;
 | |
|     -c|--cherrypick)
 | |
|       shift
 | |
|       CHERRYPICKS="$CHERRYPICKS $1"
 | |
|       shift
 | |
|       ;;
 | |
|     -b|--branch)
 | |
|       shift
 | |
|       LLVM_BRANCH="$1"
 | |
|       shift
 | |
|       ;;
 | |
|     -p|--llvm-project)
 | |
|       shift
 | |
|       PROJ="$1"
 | |
|       shift
 | |
| 
 | |
|       if [ "$PROJ" == "cfe" ]; then
 | |
|         PROJ="clang"
 | |
|       fi
 | |
| 
 | |
|       if ! contains_project "$PROJ" ; then
 | |
|         if [ "$PROJ" == "clang-tools-extra" ] && [ ! contains_project "clang" ]; then
 | |
|           echo "Project 'clang-tools-extra' specified before 'clang'. Adding 'clang' to a list of projects first."
 | |
|           LLVM_PROJECTS="$LLVM_PROJECTS clang"
 | |
|         fi
 | |
|         LLVM_PROJECTS="$LLVM_PROJECTS $PROJ"
 | |
|       else
 | |
|         echo "Project '$PROJ' is already enabled, ignoring extra occurrences."
 | |
|       fi
 | |
|       ;;
 | |
|     -h|--help)
 | |
|       show_usage
 | |
|       exit 0
 | |
|       ;;
 | |
|     *)
 | |
|       echo "Unknown option: $1"
 | |
|       exit 1
 | |
|   esac
 | |
| done
 | |
| 
 | |
| if [ "$LLVM_BRANCH" == "" ]; then
 | |
|   LLVM_BRANCH="trunk"
 | |
| fi
 | |
| 
 | |
| if [ "$LLVM_SVN_REV" != "" ]; then
 | |
|   SVN_REV_ARG="-r$LLVM_SVN_REV"
 | |
|   echo "Checking out svn revision r$LLVM_SVN_REV."
 | |
| else
 | |
|   SVN_REV_ARG=""
 | |
|   echo "Checking out latest svn revision."
 | |
| fi
 | |
| 
 | |
| # Sort cherrypicks and remove duplicates.
 | |
| CHERRYPICKS="$(echo "$CHERRYPICKS" | xargs -n1 | sort | uniq | xargs)"
 | |
| 
 | |
| function apply_cherrypicks() {
 | |
|   local CHECKOUT_DIR="$1"
 | |
| 
 | |
|   [ "$CHERRYPICKS" == "" ] || echo "Applying cherrypicks"
 | |
|   pushd "$CHECKOUT_DIR"
 | |
| 
 | |
|   # This function is always called on a sorted list of cherrypicks.
 | |
|   for CHERRY_REV in $CHERRYPICKS; do
 | |
|     echo "Cherry-picking r$CHERRY_REV into $CHECKOUT_DIR"
 | |
| 
 | |
|     local PATCH_FILE="$(mktemp)"
 | |
|     svn diff -c $CHERRY_REV > "$PATCH_FILE"
 | |
|     svn patch "$PATCH_FILE"
 | |
|     rm "$PATCH_FILE"
 | |
|   done
 | |
| 
 | |
|   popd
 | |
| }
 | |
| 
 | |
| CLANG_BUILD_DIR=/tmp/clang-build
 | |
| 
 | |
| # Get the sources from svn.
 | |
| echo "Checking out sources from svn"
 | |
| mkdir -p "$CLANG_BUILD_DIR/src"
 | |
| for LLVM_PROJECT in $LLVM_PROJECTS; do
 | |
|   if [ "$LLVM_PROJECT" == "clang" ]; then
 | |
|     SVN_PROJECT="cfe"
 | |
|   else
 | |
|     SVN_PROJECT="$LLVM_PROJECT"
 | |
|   fi
 | |
| 
 | |
|   if [ "$SVN_PROJECT" != "clang-tools-extra" ]; then
 | |
|     CHECKOUT_DIR="$CLANG_BUILD_DIR/src/$LLVM_PROJECT"
 | |
|   else
 | |
|     CHECKOUT_DIR="$CLANG_BUILD_DIR/src/clang/tools/extra"
 | |
|   fi
 | |
| 
 | |
|   echo "Checking out https://llvm.org/svn/llvm-project/$SVN_PROJECT to $CHECKOUT_DIR"
 | |
|   svn co -q $SVN_REV_ARG \
 | |
|     "https://llvm.org/svn/llvm-project/$SVN_PROJECT/$LLVM_BRANCH" \
 | |
|     "$CHECKOUT_DIR"
 | |
| 
 | |
|   # We apply cherrypicks to all repositories regardless of whether the revision
 | |
|   # changes this repository or not. For repositories not affected by the
 | |
|   # cherrypick, applying the cherrypick is a no-op.
 | |
|   apply_cherrypicks "$CHECKOUT_DIR"
 | |
| done
 | |
| 
 | |
| CHECKSUMS_FILE="/tmp/checksums/checksums.txt"
 | |
| 
 | |
| if [ -f "$CHECKSUMS_FILE" ]; then
 | |
|   echo "Validating checksums for LLVM checkout..."
 | |
|   python "$(dirname $0)/llvm_checksum/llvm_checksum.py" -c "$CHECKSUMS_FILE" \
 | |
|     --partial --multi_dir "$CLANG_BUILD_DIR/src"
 | |
| else
 | |
|   echo "Skipping checksumming checks..."
 | |
| fi
 | |
| 
 | |
| echo "Done"
 |