#!/usr/bin/make -f

SHELL=/bin/bash

# various bits that have to be pulled in to create the full source tarball
OPENSSL_SRC= openssl-1.0.2g.tar.gz
OPENSSL_URL= http://www.openssl.org/source/$(OPENSSL_SRC)
SHELL_SRC  = https://efi-shell.svn.sourceforge.net/svnroot/efi-shell/trunk/Shell
SHELL_REV  = 64


# 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)

EDK2_TOOLCHAIN = GCC49

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

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

%:
	dh $@

override_dh_auto_build: setup-build build-qemu-efi 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
	QUILT_PC=.pc-post QUILT_PATCHES=debian/post-patches quilt push -a || [ $$? = 2 ]
	cd CryptoPkg/Library/OpensslLib/ && ./Install.sh

build-ovmf: EDK2_ARCH_DIR=X64
build-ovmf:
ifneq (,$(findstring ovmf, $(shell dh_listpackages)))
	cd UefiCpuPkg/ResetVector/Vtf0 && python Build.py
	mkdir -p EdkShellBinPkg/FullShell/$(EDK2_ARCH_DIR) \
	         FatBinPkg/EnhancedFatDxe/$(EDK2_ARCH_DIR)
	set -e; . ./edksetup.sh; build -p EdkShellPkg/EdkShellPkg.dsc \
			-m Shell/ShellFull.inf -b RELEASE; \
		cp -a Build/EdkShellPkg/RELEASE_$(EDK2_TOOLCHAIN)/$(EDK2_ARCH_DIR)/ShellFull.efi \
			EdkShellBinPkg/FullShell/$(EDK2_ARCH_DIR)/Shell_Full.efi; \
		build -p FatPkg/FatPkg.dsc -m FatPkg/EnhancedFatDxe/Fat.inf \
			-b RELEASE; \
		cp -a Build/Fat/RELEASE_$(EDK2_TOOLCHAIN)/$(EDK2_ARCH_DIR)/Fat.efi \
			FatBinPkg/EnhancedFatDxe/$(EDK2_ARCH_DIR)/Fat.efi; \
		build -DSECURE_BOOT_ENABLE=TRUE -DFD_SIZE_2MB -b RELEASE
endif

build-qemu-efi: EDK2_ARCH_DIR=AArch64
build-qemu-efi: EDK2_HOST_ARCH=AARCH64
build-qemu-efi: GCC49_AARCH64_PREFIX=aarch64-linux-gnu-
build-qemu-efi:
	mkdir -p ShellBinPkg/UefiShell/$(EDK2_ARCH_DIR) FatBinPkg/EnhancedFatDxe/$(EDK2_ARCH_DIR)
	set -e; . ./edksetup.sh; \
		GCC49_AARCH64_PREFIX=$(GCC49_AARCH64_PREFIX) build -a $(EDK2_HOST_ARCH) \
			-p ShellPkg/ShellPkg.dsc -b RELEASE -t $(EDK2_TOOLCHAIN); \
		cp -a Build/Shell/RELEASE_$(EDK2_TOOLCHAIN)/AARCH64/Shell.efi \
			ShellBinPkg/UefiShell/$(EDK2_ARCH_DIR)/Shell.efi; \
		GCC49_AARCH64_PREFIX=$(GCC49_AARCH64_PREFIX) build -a $(EDK2_HOST_ARCH) \
			-p FatPkg/FatPkg.dsc -m FatPkg/EnhancedFatDxe/Fat.inf \
			-t $(EDK2_TOOLCHAIN) -b RELEASE; \
		cp -a Build/Fat/RELEASE_$(EDK2_TOOLCHAIN)/$(EDK2_HOST_ARCH)/Fat.efi \
			FatBinPkg/EnhancedFatDxe/$(EDK2_ARCH_DIR)/Fat.efi; \
		GCC49_AARCH64_PREFIX=$(GCC49_AARCH64_PREFIX) build -a $(EDK2_HOST_ARCH) \
			-t $(EDK2_TOOLCHAIN) \
			-p ArmVirtPkg/ArmVirtQemu.dsc \
			-DSECURE_BOOT_ENABLE=TRUE \
			-DINTEL_BDS \
			-b RELEASE; \
		dd if=/dev/zero of=Build/ArmVirtQemu-AARCH64/RELEASE_$(EDK2_TOOLCHAIN)/FV/AAVMF_CODE.fd bs=1M seek=64 count=0; \
		dd if=Build/ArmVirtQemu-AARCH64/RELEASE_$(EDK2_TOOLCHAIN)/FV/QEMU_EFI.fd of=Build/ArmVirtQemu-AARCH64/RELEASE_$(EDK2_TOOLCHAIN)/FV/AAVMF_CODE.fd conv=notrunc; \
		dd if=/dev/zero of=Build/ArmVirtQemu-AARCH64/RELEASE_$(EDK2_TOOLCHAIN)/FV/AAVMF_VARS.fd bs=1M seek=64 count=0

override_dh_auto_clean:
	set -e; \
	if [ -d BaseTools/Source/C/bin ]; then \
		. ./edksetup.sh; build clean; \
		make -C BaseTools clean; \
	fi
	QUILT_PC=.pc-post QUILT_PATCHES=debian/post-patches quilt pop -a || [ $$? = 2 ]
	rm -rf Conf/.cache Build .pc-post

get-orig-source:
	mkdir -p edk2-$(ver)
	cp -a * edk2-$(ver) || true
	rm -rf edk2-$(ver)/edk2-$(ver)
	find edk2-$(ver) -name '*.efi' -print0 | xargs -0 rm -f
	# Drop the non-free license text covering the removed Fat.efi binaries
	rm -f edk2-$(ver)/FatBinPkg/License.txt
	rm -rf edk2-$(ver)/BaseTools/Bin \
		edk2-$(ver)/UefiCpuPkg/ResetVector/Vtf0/Bin/*.raw \
		edk2-$(ver)/EdkCompatibilityPkg/Other \
		edk2-$(ver)/AppPkg \
		edk2-$(ver)/DuetPkg/BootSector/bin \
		edk2-$(ver)/StdLib/LibC/Main/Ia32/ftol2.obj \
		edk2-$(ver)/BeagleBoardPkg/Debugger_scripts/rvi_dummy.axf \
		edk2-$(ver)/BaseTools/Source/Python/*/*.pyd \
		edk2-$(ver)/BaseTools/Source/Python/UPT/Dll/sqlite3.dll \
		edk2-$(ver)/debian
	# openssl
	wget $(OPENSSL_URL)
	tar zxvf $(OPENSSL_SRC) -C edk2-$(ver)/CryptoPkg/Library/OpensslLib
	cd edk2-$(ver)/CryptoPkg/Library/OpensslLib/$$(basename $(OPENSSL_SRC) .tar.gz) && \
		patch -p1 < ../EDKII_openssl-1.0.2g.patch
	# efi shell
	svn export -r$(SHELL_REV) $(SHELL_SRC) edk2-$(ver)/Shell
	cd edk2-$(ver)/Shell && patch -p1 < ../EdkShellPkg/ShellR$(SHELL_REV).patch 
	tar Jcvf ../edk2_$(ver).orig.tar.xz edk2-$(ver)
	rm -rf edk2-$(ver) $(OPENSSL_SRC)

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