diff options
author | Renato Golin <renato.golin@linaro.org> | 2017-04-10 11:26:19 +0100 |
---|---|---|
committer | Renato Golin <renato.golin@linaro.org> | 2017-04-10 14:22:43 +0100 |
commit | db34fec7cb096ba807a3d7cbf251f0d3b1a02e95 (patch) | |
tree | d55a0657cd9a5b775c1131aa2f04af1bbecbc680 /tcwg-llvm-release.sh | |
parent | 9a2db1ab44cabc54a404c87e22f3c4fdefbcd802 (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-x | tcwg-llvm-release.sh | 178 |
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" |