summaryrefslogtreecommitdiff
path: root/tcwg-llvm-release.sh
diff options
context:
space:
mode:
authorRenato Golin <renato.golin@linaro.org>2017-04-10 11:26:19 +0100
committerRenato Golin <renato.golin@linaro.org>2017-04-10 14:22:43 +0100
commitdb34fec7cb096ba807a3d7cbf251f0d3b1a02e95 (patch)
treed55a0657cd9a5b775c1131aa2f04af1bbecbc680 /tcwg-llvm-release.sh
parent9a2db1ab44cabc54a404c87e22f3c4fdefbcd802 (diff)
tcwg-llvm-release.sh: New script
Adding a Jenkins script to run the LLVM release on a matrix job. This script won't do much more than call the already existing and tested upstream 'test-release.sh'. This is the official way to release LLVM. Change-Id: Id65ed06356bbc10123d482097d82099fc887b9a4
Diffstat (limited to 'tcwg-llvm-release.sh')
-rwxr-xr-xtcwg-llvm-release.sh178
1 files changed, 178 insertions, 0 deletions
diff --git a/tcwg-llvm-release.sh b/tcwg-llvm-release.sh
new file mode 100755
index 00000000..6efc502a
--- /dev/null
+++ b/tcwg-llvm-release.sh
@@ -0,0 +1,178 @@
+#!/usr/bin/env bash
+
+# This script does the LLVM release process by checking out the appropriate
+# test-release.sh script and running it. You may want to call this script from
+# a jenkins job that run natively on ARM/AArch64 and triggers a test-suite
+# build afterwards.
+
+set -exu
+set -o pipefail
+
+# Syntax
+SYN_WORKSPACE="--workspace=/path/to/workspace"
+SYN_RELEASE="--release=M.m.p"
+SYN_CANDIDATE="--candidate=N (or 'final')"
+SYN_BUILDJOBS="--buildjobs=N (def. CPUS)"
+SYN_TOOLCHAIN="--toolchain=http://url/for/tarball"
+SYNTAX="$0 $SYN_WORKSPACE $SYN_RELEASE $SYN_CANDIDATE $SYN_TOOLCHAIN"
+
+# Environment Variables and default values
+WORKSPACE=$(pwd)
+RELEASE=""
+CANDIDATE=""
+RCCALL=""
+RCTAG=""
+RCDIR=""
+CPUS=$(nproc --all)
+BUILDJOBS=$CPUS
+TOOLCHAIN=""
+CC=""
+CXX=""
+
+# Command line parsing
+while [ "$#" -gt 0 ]; do
+ ARG=$(echo "$1" | cut -d "=" -f 1)
+ VAL=$(echo "$1" | cut -d "=" -s -f 2)
+ case "$ARG" in
+ --release)
+ RELEASE="$VAL"
+ if ! echo "$RELEASE" | grep -q "^[0-9]\\.[0-9]\\.[0-9]"; then
+ echo "ERROR: $1"
+ echo "Syntax: $SYN_RELEASE"
+ exit 1
+ fi
+ shift ;;
+ --candidate)
+ CANDIDATE="$VAL"
+ if [[ "$CANDIDATE" = "final" ]]; then
+ RCCALL="-final"
+ RCTAG=""
+ RCDIR="final"
+ elif [[ "$CANDIDATE" -gt 0 ]]; then
+ RCCALL="-rc $CANDIDATE"
+ RCTAG="-rc$CANDIDATE"
+ RCDIR="rc$CANDIDATE"
+ else
+ echo "ERROR: $1"
+ echo "Syntax: $SYN_CANDIDATE"
+ exit 1
+ fi
+
+ shift ;;
+ --workspace)
+ if [ -d "$VAL" ]; then
+ WORKSPACE="$VAL"
+ else
+ echo "ERROR: $1"
+ echo "Syntax: $SYN_WORKSPACE"
+ exit 1
+ fi
+ shift ;;
+ --buildjobs)
+ if [ "$VAL" -gt 0 ]; then
+ BUILDJOBS="$VAL"
+ else
+ echo "ERROR: Build jobs '$VAL' not valid"
+ echo "Syntax: $SYN_BUILDJOBS"
+ exit 1
+ fi
+ shift ;;
+ --toolchain)
+ if [ "$VAL" != "" ]; then
+ TOOLCHAIN="$VAL"
+ file=$(basename "$VAL")
+ dir=$(echo "$file" | sed 's/\.tar.*//g')
+ # Download the toolchain
+ if [ ! -d "$WORKSPACE/$dir" ]; then
+ echo "No dir '$WORKSPACE/$dir'..."
+ if [ ! -f "$WORKSPACE/$file" ]; then
+ echo "No file '$WORKSPACE/$file'..."
+ echo "Downloading from '$VAL'"
+ wget -q "$VAL" -O "$WORKSPACE/$file"
+ fi
+ echo "Unpacking '$WORKSPACE/$file'"
+ tar xf "$WORKSPACE/$file" -C "$WORKSPACE"
+ fi
+ # Clang or GCC?
+ if [ -f "$WORKSPACE/$dir/bin/clang" ]; then
+ export CC="$WORKSPACE/$dir/bin/clang"
+ export CXX="$WORKSPACE/$dir/bin/clang++"
+ elif [ -f "$WORKSPACE/$dir/bin/gcc" ]; then
+ export CC="$WORKSPACE/$dir/bin/gcc"
+ export CXX="$WORKSPACE/$dir/bin/g++"
+ else
+ echo "ERROR: Toolchain '$VAL' has no known compiler in $dir/bin"
+ echo "Syntax: $SYN_TOOLCHAIN"
+ exit 1
+ fi
+ else
+ echo "ERROR: Toolchain '$VAL' not valid"
+ echo "Syntax: $SYN_TOOLCHAIN"
+ exit 1
+ fi
+ shift ;;
+ *)
+ echo "ERROR: Invalid argument '$1'"
+ echo "Syntax: $SYNTAX"
+ exit 1
+ ;;
+ esac
+done
+
+# Validate options
+if [ "$WORKSPACE" = "" -o ! -d "$WORKSPACE" ]; then
+ echo "ERROR: Missing workspace"
+ echo "$SYNTAX"
+ exit 1
+fi
+if [ "$BUILDJOBS" = "" ]; then
+ echo "ERROR: Missing number of build jobs"
+ echo "$SYNTAX"
+ exit 1
+fi
+
+# Additional Options
+platform=$(uname -m)
+TRIPLE="$platform-linux-gnu"
+if echo "$platform" | grep -qi "armv7"; then
+ TRIPLE="armv7a-linux-gnueabihf"
+elif ! echo "$platform" | grep -qi "aarch64" && \
+ ! echo "$platform" | grep -qi "x86_64"; then
+ echo "ERROR: Don't recognise platform $platform"
+ exit 1
+fi
+
+# Dump
+echo "RELEASE = $RELEASE"
+echo "CANDIDATE = $CANDIDATE"
+echo "RCCALL = $RCCALL"
+echo "RCTAG = $RCTAG"
+echo "RCDIR = $RCDIR"
+echo "BUILDJOBS = $BUILDJOBS"
+echo "TOOLCHAIN = $TOOLCHAIN"
+echo "CC = $CC"
+echo "CXX = $CXX"
+echo "TRIPLE=$TRIPLE"
+
+# Logs
+LOGBASE="$WORKSPACE/tcwg-llvm"
+LOGEXT="txt"
+
+# Release script
+RELEASE_SCRIPT="test-release.sh"
+SVN_RELEASE_TAG="release_$(echo $RELEASE | awk 'BEGIN { FS="." }; { print $1 $2 }')"
+SCRIPT_URL=http://llvm.org/svn/llvm-project/llvm/branches/$SVN_RELEASE_TAG/utils/release/test-release.sh
+cd "$WORKSPACE" && svn cat $SCRIPT_URL > $RELEASE_SCRIPT
+cd "$WORKSPACE" && chmod +x $RELEASE_SCRIPT
+
+# Call script
+cd "$WORKSPACE" && $RELEASE_SCRIPT -release $RELEASE $RCCALL -triple $TRIPLE -j$BUILDJOBS
+
+# Ship
+PKGNAME=clang+llvm-$RELEASE$RCTAG-$TRIPLE
+PKGDIR="$WORKSPACE/$PKGNAME"
+PUSHDIR=public_html/builds/releases/$PKGNAME
+FILESERVER=dev-01.tcwglab
+
+ssh $FILESERVER mkdir -p $PUSHDIR
+cd "$WORKSPACE/$RCDIR" && scp "$PKGNAME.tar.xz" $FILESERVER:"$PUSHDIR"