# Maintainer : Mark Weiman <mark dot weiman at markzz dot com>
# Contributor: David Hummel <dhummel at eml dot cc>
# Contributor: Keshav Amburay <(the ddoott ridikulus ddoott rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)>
# Contributor: Andre Osku Schmidt (oskude) <(andre.osku.schmidt) (aatt) (gemmaeiil) (ddoott) (ccoomm)>

################
_TIANOCORE_GIT_URL="https://github.com/tianocore/edk2"
_TIANO_DIR_="edk2"
################

################
_UDK_OVMF_X64_PKG="OvmfX64"
_UDK_OVMF_X64_DSC="OvmfPkg/OvmfPkgX64.dsc"


_UDK_TARGET="RELEASE"
_COMPILER="GCC49"
################

################
_OPENSSL_VERSION="1.1.0e"
################

_pkgname="ovmf"
pkgname="${_pkgname}-git"

pkgver=21726.vUDK2017
pkgrel=1
pkgdesc="UEFI Firmware (OVMF) with Secure Boot Support - for Virtual Machines (QEMU) - from Tianocore EDK2 - GIT Version"
url="https://tianocore.github.io/ovmf/"
arch=('x86_64' 'i686')
license=('BSD')

makedepends=('git' 'python2' 'iasl' 'nasm')

options=('!strip' 'docs' '!makeflags')

conflicts=('ovmf' 'ovmf-bin' 'ovmf-svn')
provides=('ovmf' 'ovmf-bin' 'ovmf-svn')

install="${_pkgname}.install"

source=("${_TIANO_DIR_}::git+https://github.com/tianocore/edk2.git#tag=vUDK2017"
        "https://www.openssl.org/source/openssl-${_OPENSSL_VERSION}.tar.gz"
)

sha1sums=('SKIP'
          '8bbbaf36feffadd3cb9110912a8192e665ebca4b')

noextract=("openssl-${_OPENSSL_VERSION}.tar.gz")

pkgver() {
	
	cd "${srcdir}/${_TIANO_DIR_}/"
	echo "$(git rev-list --count HEAD).$(git describe --always)" | sed -e 's|-|\.|g'
	
}

_bail_out() {
	
	if [[ "${CARCH}" != "x86_64" ]]; then
		echo "${pkgname} package can be built only in a x86_64 system. Exiting."
		exit 1
	fi
	
}

_setup_env_vars() {
	
	msg "Setup UDK PATH ENV variables"
	export _UDK_DIR="${srcdir}/${_TIANO_DIR_}"
	export EDK_TOOLS_PATH="${_UDK_DIR}/BaseTools"
	
}

_prepare_tianocore_sources() {
	
	cd "${_UDK_DIR}/"
	
	msg "Cleanup UDK config files"
	rm -rf "${_UDK_DIR}/Build/" || true
	rm -rf "${_UDK_DIR}/Conf/" || true
	mkdir -p "${_UDK_DIR}/Conf/"
	mkdir -p "${_UDK_DIR}/Build/"
	
	msg "Use python2 for UDK BaseTools"
	sed 's|python |python2 |g' -i "${EDK_TOOLS_PATH}/BinWrappers/PosixLike"/* || true
	sed 's|python |python2 |g' -i "${EDK_TOOLS_PATH}/Tests/GNUmakefile"
	
	msg "Fix GCC Warning as error"
	sed 's|-Werror |-Wno-error -Wno-unused-but-set-variable |g' -i "${EDK_TOOLS_PATH}/Source/C/Makefiles/header.makefile" || true
	sed 's|-Werror |-Wno-error -Wno-unused-but-set-variable |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true
	
	msg "Remove GCC -g debug option and add -O0 -mabi=ms -maccumulate-outgoing-args"
	sed 's|DEFINE GCC_ALL_CC_FLAGS            = -g |DEFINE GCC_ALL_CC_FLAGS            = -O0 -mabi=ms -maccumulate-outgoing-args |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true
	sed 's|DEFINE GCC44_ALL_CC_FLAGS            = -g |DEFINE GCC44_ALL_CC_FLAGS            = -O0 -mabi=ms -maccumulate-outgoing-args |g' -i "${EDK_TOOLS_PATH}/Conf/tools_def.template" || true
	
	msg "Fix UDK Target Platform"
	sed "s|ACTIVE_PLATFORM       = Nt32Pkg/Nt32Pkg.dsc|ACTIVE_PLATFORM       = ${_UDK_OVMF_X64_DSC}|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true
	sed "s|TARGET                = DEBUG|TARGET                = ${_UDK_TARGET}|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true
	sed "s|TOOL_CHAIN_TAG        = MYTOOLS|TOOL_CHAIN_TAG        = ${_COMPILER}|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true
	sed "s|IA32|X64|g" -i "${EDK_TOOLS_PATH}/Conf/target.template" || true
	
	chmod 0755 "${_UDK_DIR}/BaseTools/BuildEnv"
	
}

_prepare_openssl_udk_dir() {
	
	cd "${_UDK_DIR}/"
	
	msg "Download OpenSSL ${_OPENSSL_VERSION} Sources"
	bsdtar -C "${_UDK_DIR}/CryptoPkg/Library/OpensslLib/" -xf "${srcdir}/openssl-${_OPENSSL_VERSION}.tar.gz"
	mv "${_UDK_DIR}/CryptoPkg/Library/OpensslLib/openssl-${_OPENSSL_VERSION}" "${_UDK_DIR}/CryptoPkg/Library/OpensslLib/openssl"
	echo
}

prepare() {
	_bail_out
	
	_setup_env_vars
	
	msg "Prepare Tianocore Sources"
	_prepare_tianocore_sources
	echo
	
	msg "Prepare OpenSSL ${_OPENSSL_VERSION} Sources"
	_prepare_openssl_udk_dir
	echo
	
}

build() {
	
	_bail_out
	
	_setup_env_vars
	
	cd "${_UDK_DIR}/"
	
	msg "Unset all compiler FLAGS"
	unset CFLAGS
	unset CPPFLAGS
	unset CXXFLAGS
	unset LDFLAGS
	unset MAKEFLAGS
	
	msg "Setup UDK Environment"
	source "${_UDK_DIR}/BaseTools/BuildEnv" BaseTools
	echo
	
	msg "Compile UDK BaseTools"
	make -C "${EDK_TOOLS_PATH}"
	echo
	
	if [[ "${CARCH}" == "x86_64" ]]; then
		msg "Unset all compiler FLAGS"
		unset CFLAGS
		unset CPPFLAGS
		unset CXXFLAGS
		unset LDFLAGS
		unset MAKEFLAGS
		
		msg "Compile OVMF X64 binary"
		"${_UDK_DIR}/OvmfPkg/build.sh" -a "X64" -b "${_UDK_TARGET}" -t "${_COMPILER}" -D "SECURE_BOOT_ENABLE=TRUE" -D "FD_SIZE_2MB" --enable-flash
		echo
	fi
	
	msg "Unset all compiler FLAGS"
	unset CFLAGS
	unset CPPFLAGS
	unset CXXFLAGS
	unset LDFLAGS
	unset MAKEFLAGS
	
	
}

package() {
	
	_setup_env_vars
	
	if [[ "${CARCH}" == "x86_64" ]]; then
		msg "Install the OVMF X64 image"
		install -d "${pkgdir}/usr/share/ovmf/x64/"
		install -D -m0644 "${_UDK_DIR}/Build/${_UDK_OVMF_X64_PKG}/${_UDK_TARGET}_${_COMPILER}/FV/OVMF.fd" "${pkgdir}/usr/share/ovmf/x64/ovmf_x64.bin"
		install -D -m0644 "${_UDK_DIR}/Build/${_UDK_OVMF_X64_PKG}/${_UDK_TARGET}_${_COMPILER}/FV/OVMF_CODE.fd" "${pkgdir}/usr/share/ovmf/x64/ovmf_code_x64.bin"
		install -D -m0644 "${_UDK_DIR}/Build/${_UDK_OVMF_X64_PKG}/${_UDK_TARGET}_${_COMPILER}/FV/OVMF_VARS.fd" "${pkgdir}/usr/share/ovmf/x64/ovmf_vars_x64.bin"
	fi
	
	
}