#!/bin/bash

RESULT_BUF=`echo -e ------------------------------------------------------------`
RESULT_PASS_COUNT=0
RESULT_FAIL_COUNT=0

function result_log
{
	if [ $1 -eq 0 ]; then
		RESULT_BUF="`printf \"%s\n%55s\tpass\" \"$RESULT_BUF\" \"$2\"`"
		RESULT_PASS_COUNT=$(($RESULT_PASS_COUNT + 1))
	else
		RESULT_BUF="`printf \"%s\n%55s\tfail\" \"$RESULT_BUF\" \"$2\"`"
		RESULT_FAIL_COUNT=$(($RESULT_FAIL_COUNT + 1))
	fi
}

function result_print
{
	printf "%s" "$RESULT_BUF"
	echo -e "\n------------------------------------------------------------"
	printf "pass\t$RESULT_PASS_COUNT\n"
	printf "fail\t$RESULT_FAIL_COUNT\n"

	exit $RESULT_FAIL_COUNT
}

function get_build_arch
{
	case `uname -m` in
	    arm*)
	        BUILD_ARCH=ARM;;
	    aarch64*)
	        BUILD_ARCH=AARCH64;;
	    i?86*)
		BUILD_ARCH=IA32;;
	    x86_64*)
		BUILD_ARCH=X64;;
	    *)
	        BUILD_ARCH=other;;
	esac
}

function set_cross_compile
{
	get_build_arch

	echo "Target: $PLATFORM_ARCH"
	echo "Build: $BUILD_ARCH"
 	if [ "$PLATFORM_ARCH" = "$BUILD_ARCH" ]; then
	    TEMP_CROSS_COMPILE=
	else
	    case "$PLATFORM_ARCH" in
		AARCH64)
                    if [ X"$CROSS_COMPILE_64" != X"" ]; then
                        TEMP_CROSS_COMPILE="$CROSS_COMPILE_64"
                    else
                        TEMP_CROSS_COMPILE=aarch64-linux-gnu-
                    fi
                ;;
		ARM)
		    TEMP_CROSS_COMPILE=arm-linux-gnueabihf- ;;
		IA32)
		    TEMP_CROSS_COMPILE=x86_64-linux-gnu-
		    for family in 6 5 4 3; do
		        if i$family86-linux-gnu-as -version >/dev/null 2>&1;then
		            TEMP_CROSS_COMPILE=i$family86-linux-gnu-
		            break
		        fi
		    done
		;;
		X64)
		    TEMP_CROSS_COMPILE=x86_64-linux-gnu- ;;
		*)
	            echo "Unsupported target architecture '$PLATFORM_ARCH'!" >&2
		;;
	    esac
	fi
}

function get_gcc_version
{
	$1 -v >/dev/null 2>&1 || return 1
	gcc_version=$($1 -dumpversion)
	MAJVER=`echo $gcc_version | cut -d. -f1`

	case $gcc_version in
		4*)
			echo GCC$(echo ${gcc_version} | awk -F. '{print $1$2}')
			;;
		*)
			if [ "$MAJVER" -ge 5 ]; then
			    # We only have a GCC5 build profile for now, so...
			    # echo GCC$MAJVER
			    echo GCC5
			else
			    echo "Unknown toolchain version '$gcc_version'" >&2
			    echo "Attempting to build using GCC49 profile." >&2
			    echo GCC49
			fi
			;;
	esac

	return 0
}

function get_clang_version
{
	clang_version=`$1 --version | head -1 | sed 's/^.*version\s*\([0-9]*\).\([0-9]*\).*/\1\2/g'`
	case $clang_version in
		35*)
			echo "CLANG$clang_version"
			;;
		*)
			echo "Unknown toolchain version '$clang_version'" >&2
			echo "Attempting to build using CLANG35 profile." >&2
			echo CLANG35
			;;
	esac
}

function download_patch_openssl
{
    OPENSSL_VER=`ls EDKII_openssl-*.patch | sed 's/^.*-\([0-9.a-z]*\).patch/\1/'`
    OPENSSL_TAR=openssl-${OPENSSL_VER}.tar.gz
    OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR}
    OPENSSL_DIR=openssl-${OPENSSL_VER}
    OPENSSL_PATCH=EDKII_openssl-${OPENSSL_VER}.patch

    if [ -e "$WORKSPACE"/CryptoPkg/Include/openssl/opensslconf.h ]; then
        echo "OpenSSL already imported!"
        return 0
    fi

    # Use cached copy if available
    if [ -f "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR" ]; then
	tar xzf "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR"
    else
	wget -O - -q ${OPENSSL_URL} | tar xzf -
    fi

    echo "Importing OpenSSL $OPENSSL_VER"
    ( cd ${OPENSSL_DIR}; patch -p1 -i ../${OPENSSL_PATCH} )
    ./Install.sh

    if [ $? -eq 0 ]; then
	OPENSSL_CONFIGURED=TRUE
    else
	echo "OpenSSL $OPENSSL_VER import failed!" >&2
	rm -rf $OPENSSL_TAR $OPENSSL_DIR
	return 1
    fi
}

function clone_process_openssl
{
    if [ -e openssl/include/openssl/opensslconf.h ]; then
        echo "OpenSSL already imported!"
        return 0
    fi

    OPENSSL_VER=`git ls-remote --tags git://github.com/openssl/openssl.git | awk '{print $2;}' | sed 's-^refs/tags/--g' | grep -v '\^{}$' | grep '^OpenSSL' | grep -v '^OpenSSL_FIPS' | tail -1 | sed -n 's/^OpenSSL_\([0-9]*\)_\([0-9]*\)_\([0-9.a-z]*\)$/openssl-\1.\2.\3\n/p'`
    OPENSSL_TAR="$OPENSSL_VER.tar.gz"
    if [ -z "$OPENSSL_TAR" ]; then
        return 1
    fi
    OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR}
    if [ ! -f "$OPENSSL_TAR" ]; then
        wget -q ${OPENSSL_URL}
    else
        rm -rf openssl
    fi
    tar xzf "$OPENSSL_TAR"
    mv "$OPENSSL_VER" openssl
    # perl process_files.pl # not needed and not currently working
    return $?
}

function import_openssl
{
    # Don't re-import if already done
    if [ "$OPENSSL_CONFIGURED" = "TRUE" ]; then
	echo "Using existing OpenSSL $OPENSSL_VER"
	return 0
    fi

    cd CryptoPkg/Library/OpensslLib/
    if [ -f EDKII_openssl-*.patch ]; then
        download_patch_openssl
    else
        clone_process_openssl
    fi
    RET=$?
    cd - >/dev/null
    return $RET
}

function search_packages_path
{
    file="$1"

    IFS=:
    for dir in $PACKAGES_PATH; do
	if [ -e "$dir/$file" ]; then
	    echo "$dir/$file"
	    unset IFS
	    return 0
	fi
    done

    echo "$file not found in any directory on PACKAGES_PATH!" >&2
    unset IFS
    return 1
}
