#!/usr/bin/env bash

# This script executes the matrix loops, exclude tests and cleaning.
# The matrix can be configured with environment variables MATRIX_CC,
# MATRIX_CMAKE and MATRIX_REMOTE (default: MATRIX_CC='gcc clang',
# MATRIX_CMAKE='no yes', MATRIX_REMOTE='no yes').
# It calls the build.sh script which runs one build with setup environment
# variables : CC, CMAKE and REMOTE (default: CC=gcc, CMAKE=no, REMOTE=no).

set -e

# ANSI color escape sequences
ANSI_MAGENTA="\\033[35;1m"
ANSI_RESET="\\033[0m"
uname -a
date
# Install directory prefix
if [ -z "$PREFIX" ]; then
    PREFIX=$(mktemp -d -t libpcap_build_matrix_XXXXXXXX)
    echo "PREFIX set to '$PREFIX'"
    export PREFIX
fi
COUNT=0

travis_fold() {
    local action=${1:?}
    local name=${2:?}
    if [ "$TRAVIS" != true ]; then return; fi
    echo -ne "travis_fold:$action:$LABEL.script.$name\\r"
    sleep 1
}

# Display text in magenta
echo_magenta() {
    echo -ne "$ANSI_MAGENTA"
    echo "$@"
    echo -ne "$ANSI_RESET"
}

touch .devel configure
for CC in ${MATRIX_CC:-gcc clang}; do
    export CC
    # Exclude gcc on macOS (it is just an alias for clang).
    if [ "$CC" = gcc ] && [ "$(uname -s)" = Darwin ]; then
        echo '(skipped)'
        continue
    fi
    for CMAKE in ${MATRIX_CMAKE:-no yes}; do
        export CMAKE
        for REMOTE in ${MATRIX_REMOTE:-no yes}; do
            export REMOTE
            COUNT=$((COUNT+1))
            echo_magenta "===== SETUP $COUNT: CC=$CC CMAKE=$CMAKE REMOTE=$REMOTE ====="
            # LABEL is needed to build the travis fold labels
            LABEL="$CC.$CMAKE.$REMOTE"
            # Run one build with setup environment variables: CC, CMAKE and REMOTE
            ./build.sh
            echo 'Cleaning...'
            travis_fold start cleaning
            if [ "$CMAKE" = yes ]; then rm -rf build; else make distclean; fi
            rm -rf "${PREFIX:?}"/*
            git status -suall
            # Cancel changes in configure
            git checkout configure
            travis_fold end cleaning
        done
    done
done
rm -rf "$PREFIX"
echo_magenta "Tested setup count: $COUNT"
# vi: set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab autoindent :
