#!/bin/sh
#
# Common routines for docker test scripts.
#
# Copyright (c) 2016 Red Hat Inc.
#
# Authors:
#  Fam Zheng <famz@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2
# or (at your option) any later version. See the COPYING file in
# the top-level directory.

# This might be set by ENV of a docker container... it is always
# overriden by TARGET_LIST if the user sets it. We special case
# "none" to allow for other options like --disable-tcg to restrict the
# builds we eventually do.
if test "$DEF_TARGET_LIST" = "none"; then
    DEF_TARGET_LIST=""
else
    DEF_TARGET_LIST=${DEF_TARGET_LIST:-"x86_64-softmmu,aarch64-softmmu"}
fi

requires_binary()
{
    found=0
    for c in $@; do
        for d in /bin /usr/bin /usr/local/bin
        do
            if test -f "$d/$c"
            then
                found=1
            fi
        done
    done
    if test "$found" != "1"
    then
        echo "Prerequisite '$c' not present, skip"
        exit 0
    fi
}

configure_qemu()
{
    config_opts="--enable-werror \
                 ${TARGET_LIST:+--target-list=${TARGET_LIST}} \
                 --prefix=$INSTALL_DIR \
                 $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS \
                 $@"
    echo "Configure options:"
    echo $config_opts
    $QEMU_SRC/configure $config_opts || \
        { cat config.log && test_fail "Failed to run 'configure'"; }
}

build_qemu()
{
    configure_qemu $@
    make $MAKEFLAGS
}

check_qemu()
{
    # default to make check unless the caller specifies
    if [ $# = 0 ]; then
        INVOCATION="${TEST_COMMAND:-make $MAKEFLAGS check}"
    else
        INVOCATION="make $MAKEFLAGS $@"
    fi

    $INVOCATION
}

test_fail()
{
    echo "$@"
    exit 1
}

prep_fail()
{
    echo "$@"
    exit 2
}

install_qemu()
{
    make install $MAKEFLAGS DESTDIR=$PWD/=destdir
    ret=$?
    rm -rf $PWD/=destdir
    return $ret
}
