#! /usr/bin/env bash

# URLs and versions
LIBRESSL_VERS='2.2.2'
LIBRESSL_URL="http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-${LIBRESSL_VERS}.tar.gz"
LIBRESSL_SHA1='3736abaab1f5c6b933a6b6d18b59e0628ca0727a'
LIBRESSL_TARBALL="src/libressl-${LIBRESSL_VERS}.tar.gz"
LIBRESSL_DIR="libressl-${LIBRESSL_VERS}"

# Main script
CCNAME="$1"
CCDIR="$2"
PREFIX="$3"
STAGE="$4"

# Clean
if [ "$1" = "distclean" ]; then
        rm -f "${LIBRESSL_TARBALL}"

        set -- clean
fi

if [ "$1" = "clean" ]; then
        rm -rf "${LIBRESSL_DIR}"
        rm -rf libressl-*-*-*

        exit 0
fi

if [ "${BUILD_CC_INSTALL_LIBRESSL}" != '1' -a "${BUILD_CC_INSTALL_OPENSSL}" != '1' ]; then
	exit 0
fi

# Only build in the final stage
if [ "${STAGE}" != "stage2" ]; then
        exit 0
fi

# Download source
. 'scripts/common'

if [ ! -d "${LIBRESSL_DIR}" ]; then
        download "${LIBRESSL_URL}" "${LIBRESSL_TARBALL}" "${LIBRESSL_SHA1}" || exit 1

        gzip -dc "${LIBRESSL_TARBALL}" | tar -xf -

	for patch in patches/libressl/*.diff; do
		echo " ** Applying patch to LibreSSL (version ${LIBRESSL_VERS})"

		cat "${patch}" | (
			cd "${LIBRESSL_DIR}" || exit 1

			patch -p1
		) || rm -rf "${LIBRESSL_DIR}"
	done
fi

CC_SAVE="${CC}"
for arch in $(multilib); do
	CC="${CC_SAVE} $(multilib --cflags "${arch}")"
	arch_host="$(multilib --host "${arch}")"
	arch_libdir="$(multilib --libdir "${arch}")"

	# Do not compile if we already have built it
	if [ -e "${arch_libdir}/libssl.a" -o -e "${arch_libdir}/libssl.so" ]; then
		continue
	fi

	# Inform the user of what we are doing
	echo " * Building LibreSSL (version ${LIBRESSL_VERS}) for ${arch_host}"

	rm -rf "libressl-${CCNAME}-${arch_host}"
	cp -rp "${LIBRESSL_DIR}" "libressl-${CCNAME}-${arch_host}"
	cd "libressl-${CCNAME}-${arch_host}" || exit 1

	./configure --host="${CCNAME}" --prefix="${PREFIX}" --libdir="${arch_libdir}"  --disable-asm --enable-libtls || exit 1

	${MAKE} ${BUILD_CC_MAKE_FLAGS} || exit 1

	${MAKE} ${BUILD_CC_MAKE_FLAGS} install || exit 1

	cd ..

	rm -rf "libressl-${CCNAME}-${arch_host}"
done

exit 0
