#!/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 BASEDIR=$(dirname "$(readlink -f "$0")") # shellcheck disable=SC1090 . "$BASEDIR/tcwg-llvm-common.sh" # Syntax SYN_WORKSPACE="--workspace=/path/to/workspace" SYN_RELEASE="--release=M.m.p" SYN_CANDIDATE="--candidate=N (or 'final' or 'branch=*')" SYN_BUILDJOBS="--buildjobs=N (def. CPUS)" SYN_TOOLCHAIN="--toolchain=http://url/for/tarball" SYN_TOOLCHAIN_FILE="--toolchain-file= (file name to copy the produced toolchain file name)" SYN_COMPILER="--compiler=clang|gcc" SYN_USENINJA="--use-ninja=true|false" SYNTAX="$0 $SYN_WORKSPACE $SYN_RELEASE $SYN_CANDIDATE $SYN_TOOLCHAIN $SYN_TOOLCHAIN_FILE $SYN_COMPILER $SYN_USENINJA" # Environment Variables and default values WORKSPACE=$(pwd) RELEASE="" CANDIDATE="" RCCALL="" RCTAG="" RCDIR="" CPUS=$(nproc --all) BUILDJOBS=$CPUS TOOLCHAIN="" TOOLCHAIN_FILE="" USENINJA="-use-ninja" # 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 -E -q "^[0-9]+\\.[0-9]\\.[0-9]"; then echo "ERROR: $1" echo "Syntax: $SYN_RELEASE" exit 1 fi shift ;; --candidate) CANDIDATE="$VAL" case "$CANDIDATE" in final) RCCALL="-final" RCTAG="" RCDIR="final";; git-ref=*) GITREF="${CANDIDATE#git-ref=}" RCCALL="-git-ref $GITREF" RCTAG="" RCDIR="`echo $GITREF | sed -e 's,/,_,g'`";; *) if [[ "$CANDIDATE" -gt 0 ]]; then RCCALL="-rc $CANDIDATE" RCTAG="-rc$CANDIDATE" RCDIR="rc$CANDIDATE" else echo "ERROR: $1" echo "Syntax: $SYN_CANDIDATE" exit 1 fi;; esac 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) download_toolchain "$WORKSPACE" "$VAL" shift ;; --compiler) set_compiler "$VAL" shift ;; --toolchain-file) if [ "$VAL" != "" ]; then TOOLCHAIN_FILE="$VAL" else echo "ERROR: Toolchain file '$VAL' not valid" echo "Syntax: $SYN_TOOLCHAIN_FILE" exit 1 fi shift ;; --use-ninja) if [ "$VAL" == "false" ]; then USENINJA="" fi shift ;; *) echo "ERROR: Invalid argument '$1'" echo "Syntax: $SYNTAX" exit 1 ;; esac done # Validate options if [ "$RELEASE" = "" ] || [ "$CANDIDATE" = "" ]; then echo "ERROR: Missing release or candidate" echo "$SYNTAX" exit 1 fi if [ "$WORKSPACE" = "" ] || [ ! -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) OPENMP="" MLIR="" FLANG="-flang" TARGET="$PLATFORM-linux-gnu" LIMITLINKJOBS="" if echo "$PLATFORM" | grep -qi "armv7"; then TARGET="armv7a-linux-gnueabihf" OPENMP="-no-openmp" MLIR="-no-mlir" FLANG="" if [ x"$USENINJA" != x"" ]; then LIMITLINKJOBS="-configure-flags -DLLVM_PARALLEL_LINK_JOBS=$LINKJOBS" fi 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 "TARGET=$TARGET" # Logs LOGBASE="$WORKSPACE/tcwg-llvm" LOGEXT="txt" # Release script RELEASE_SCRIPT="test-release.sh" RELEASE_TAG="llvmorg-${RELEASE}${RCTAG}" SCRIPT_URL=https://raw.githubusercontent.com/llvm/llvm-project/$RELEASE_TAG/llvm/utils/release/$RELEASE_SCRIPT ( cd "$WORKSPACE" curl -o "$RELEASE_SCRIPT" "$SCRIPT_URL" chmod +x $RELEASE_SCRIPT ) # Call script # - ignoring the return value until the end, because of set -e # - we want to push the binary public on success or failre result=0 ( cd "$WORKSPACE" && LC_ALL=C ./$RELEASE_SCRIPT -release $RELEASE $RCCALL -triple $TARGET -j$BUILDJOBS $OPENMP $MLIR $FLANG $USENINJA $LIMITLINKJOBS |& tee "$LOGBASE-release.$LOGEXT" ) & wait $! || result=$? PKGTAG="$RELEASE$RCTAG" PKGNAME="$(push_binary_name "$PKGTAG" "$TARGET")" PUSHTYPE="releases" PUSHDIR="$(push_binary_dir "$PUSHTYPE")" # Ship mkdir "$WORKSPACE/artifacts" cp "$WORKSPACE/$RCDIR/$PKGNAME.$PUSHSUFFIX" "$WORKSPACE/artifacts/" # Force port 22, otherwise our .ssh/config will connect to the host container by # default and we won't be able to access the upload directory ssh -p 22 $PUSHSERVER mkdir -p $PUSHDIR cd "$WORKSPACE/$RCDIR" && scp -P 22 "$PKGNAME.$PUSHSUFFIX" "$(push_scp_url "$PUSHTYPE")" # Dump URL echo "TOOLCHAIN URL: $(push_wget_url "$PKGTAG" "$TARGET" "$PUSHTYPE")" # Create toolchain file (wget URL) if [ "$TOOLCHAIN_FILE" != "" ]; then echo "toolchain=$(push_wget_url "$PKGTAG" "$TARGET" "$PUSHTYPE")" >> "$TOOLCHAIN_FILE" fi exit $result