#!/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 "WARNING: No toolchain specified, using the system one" 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"