#!/usr/bin/make -f

SHELL=/bin/bash

# various bits that have to be pulled in to create the full source tarball
OPENSSL_VER= 1.1.0j
OPENSSL_SRC= openssl-$(OPENSSL_VER).tar.gz
OPENSSL_URL= http://www.openssl.org/source/$(OPENSSL_SRC)

# Only used for creating our build tools.
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)

# Bumping this up to >= GCC5 will require the replacing the pre-compiled
# liblto*.a binaries that we strip from our orig.tar.xz.
EDK2_TOOLCHAIN = GCC49
export $(EDK2_TOOLCHAIN)_AARCH64_PREFIX=aarch64-linux-gnu-
export $(EDK2_TOOLCHAIN)_ARM_PREFIX=arm-linux-gnueabihf-

ifeq ($(DEB_BUILD_ARCH),amd64)
	EDK2_BUILD_ARCH=X64
endif
ifeq ($(DEB_BUILD_ARCH),i386)
	EDK2_BUILD_ARCH=IA32
endif
ifeq ($(DEB_BUILD_ARCH),arm64)
	EDK2_BUILD_ARCH=AARCH64
endif

ifeq ($(DEB_HOST_ARCH),amd64)
	EDK2_HOST_ARCH=X64
endif
ifeq ($(DEB_HOST_ARCH),i386)
	EDK2_HOST_ARCH=IA32
endif

COMMON_FLAGS = -DHTTP_BOOT_ENABLE=TRUE -DSECURE_BOOT_ENABLE=TRUE
OVMF_FLAGS   = $(COMMON_FLAGS) -DFD_SIZE_2MB -DTPM2_ENABLE=TRUE
OVMF_SB_FLAGS = $(OVMF_FLAGS) -DSMM_REQUIRE=TRUE
AAVMF_FLAGS  = $(COMMON_FLAGS)

# Clear variables used internally by the edk2 build system
undefine WORKSPACE
undefine ECP_SOURCE
undefine EDK_SOURCE
undefine EFI_SOURCE
undefine EDK_TOOLS_PATH
undefine CONF_PATH

ver := $(shell dpkg-parsechangelog | sed -n -e's/^Version: \(.*\)-[^-]\+/\1/p')

%:
	dh $@

override_dh_auto_build: build-qemu-efi-aarch64 build-qemu-efi-arm build-ovmf

setup-build:
	make -C BaseTools ARCH=$(EDK2_BUILD_ARCH)
	# We call this twice because it modifies the shell environment,
	# and it's excessively awkward to do all the subsequent work in a
	# single shell invocation
	. ./edksetup.sh

build-ovmf: EDK2_ARCH_DIR=X64
build-ovmf: EDK2_HOST_ARCH=X64
build-ovmf: setup-build
ifneq (,$(findstring ovmf, $(shell dh_listpackages)))
	cd UefiCpuPkg/ResetVector/Vtf0 && python Build.py
	mkdir ovmf/
	set -e; . ./edksetup.sh; \
		build -a $(EDK2_HOST_ARCH) \
			-t $(EDK2_TOOLCHAIN) \
			-p OvmfPkg/OvmfPkgX64.dsc \
			$(OVMF_FLAGS) -b RELEASE; \
		cp Build/Ovmf$(EDK2_HOST_ARCH)/*/FV/OVMF_*.fd ovmf/; \
		rm -rf Build/Ovmf$(EDK2_HOST_ARCH); \
		build -a $(EDK2_HOST_ARCH) \
			-t $(EDK2_TOOLCHAIN) \
			-p OvmfPkg/OvmfPkgX64.dsc \
			$(OVMF_SB_FLAGS) -b RELEASE; \
		cp Build/Ovmf$(EDK2_HOST_ARCH)/*/FV/OVMF_CODE.fd ovmf/OVMF_CODE.secboot.fd
	cp Build/Ovmf$(EDK2_HOST_ARCH)/RELEASE_*GCC*/$(EDK2_ARCH_DIR)/EnrollDefaultKeys.efi ovmf/
	cp Build/Ovmf$(EDK2_HOST_ARCH)/RELEASE_*GCC*/$(EDK2_ARCH_DIR)/Shell.efi ovmf/
	debian/build-iso.sh ovmf/
	python3 debian/ovmf-vars-generator --qemu-binary /usr/bin/qemu-system-x86_64 \
		--disable-smm \
		--skip-testing \
		--ovmf-binary ovmf/OVMF_CODE.fd \
		--ovmf-template-vars ovmf/OVMF_VARS.fd \
		--uefi-shell-iso ovmf/UefiShell.iso \
		ovmf/OVMF_VARS.ms.fd
endif

build-qemu-efi: setup-build
	set -e; . ./edksetup.sh; \
		build -a $(EDK2_HOST_ARCH) \
			-t $(EDK2_TOOLCHAIN) \
			-p ArmVirtPkg/ArmVirtQemu.dsc \
			$(AAVMF_FLAGS) -b RELEASE
	dd if=/dev/zero of=Build/ArmVirtQemu-$(EDK2_HOST_ARCH)/RELEASE_$(EDK2_TOOLCHAIN)/FV/$(FW_NAME)_CODE.fd bs=1M seek=64 count=0
	dd if=Build/ArmVirtQemu-$(EDK2_HOST_ARCH)/RELEASE_$(EDK2_TOOLCHAIN)/FV/QEMU_EFI.fd of=Build/ArmVirtQemu-$(EDK2_HOST_ARCH)/RELEASE_$(EDK2_TOOLCHAIN)/FV/$(FW_NAME)_CODE.fd conv=notrunc
	dd if=/dev/zero of=Build/ArmVirtQemu-$(EDK2_HOST_ARCH)/RELEASE_$(EDK2_TOOLCHAIN)/FV/$(FW_NAME)_VARS.fd bs=1M seek=64 count=0

build-qemu-efi-aarch64:
	$(MAKE) -f debian/rules build-qemu-efi EDK2_ARCH_DIR=AArch64 EDK2_HOST_ARCH=AARCH64 FW_NAME=AAVMF

build-qemu-efi-arm:
	$(MAKE) -f debian/rules build-qemu-efi EDK2_ARCH_DIR=Arm EDK2_HOST_ARCH=ARM FW_NAME=AAVMF32

override_dh_auto_clean:
	set -e; \
	if [ -d BaseTools/Source/C/bin ]; then \
		. ./edksetup.sh; build clean; \
		make -C BaseTools clean; \
	fi
	rm -rf Conf/.cache Build .pc-post

get-orig-source:
	# Should be executed on a checkout of the upstream master branch,
	# with the debian/ directory manually copied in.
	git clone . edk2-$(ver)
	rm -rf edk2-$(ver)/.git
	ln -s ../debian edk2-$(ver)
	# Remove known-binary files
	cd edk2-$(ver) && python3 ./debian/remove-binaries.py
	# Look for possible unknown binary files
	cd edk2-$(ver) && python3 ./debian/find-binaries.py
	rm edk2-$(ver)/debian
	# openssl
	wget $(OPENSSL_URL)
	tar zxvf $(OPENSSL_SRC) -C edk2-$(ver)/CryptoPkg/Library/OpensslLib
	rm -rf edk2-$(ver)/CryptoPkg/Library/OpensslLib/openssl && \
		ln -s openssl-$(OPENSSL_VER) \
		edk2-$(ver)/CryptoPkg/Library/OpensslLib/openssl
	tar Jcvf ../edk2_$(ver).orig.tar.xz edk2-$(ver)
	rm -rf edk2-$(ver) $(OPENSSL_SRC)

.PHONY: setup-build build-ovmf build-qemu-efi
