# Makefile for building firmware binaries and variable store templates for a
# number of virtual platforms in edk2.
#
# Copyright (C) 2019 Red Hat, Inc.
#
# This program and the accompanying materials are licensed and made available
# under the terms and conditions of the BSD License that accompanies this
# distribution. The full text of the license may be found at
# <http://opensource.org/licenses/bsd-license.php>.
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
# WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

SHELL = /bin/bash

toolchain = $(shell source ./edk2-funcs.sh && qemu_edk2_get_toolchain $(1))

licenses := \
	edk2/License.txt \
	edk2/License-History.txt \
	edk2/OvmfPkg/License.txt \
	edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3/COPYING.txt \
	edk2/CryptoPkg/Library/OpensslLib/openssl/LICENSE

# The "edk2-arm-vars.fd" varstore template is suitable for aarch64 as well.
# Similarly, the "edk2-i386-vars.fd" varstore template is suitable for x86_64
# as well, independently of "secure" too.
flashdevs := \
	aarch64-code \
	arm-code \
	i386-code \
	i386-secure-code \
	x86_64-code \
	x86_64-secure-code \
	\
	arm-vars \
	i386-vars

all: $(foreach flashdev,$(flashdevs),../pc-bios/edk2-$(flashdev).fd.bz2) \
	../pc-bios/edk2-licenses.txt

../pc-bios/edk2-%.fd.bz2: ../pc-bios/edk2-%.fd
	bzip2 -9 -c $< > $@

# When the build completes, we need not keep the uncompressed flash device
# files.
.INTERMEDIATE: $(foreach flashdev,$(flashdevs),../pc-bios/edk2-$(flashdev).fd)

# Fetch edk2 submodule's submodules. If it is not in a git tree, assume
# we're building from a tarball and that they've already been fetched by
# make-release/tarball scripts.
submodules:
	if test -d edk2/.git; then \
		cd edk2 && git submodule update --init --force; \
	fi

# See notes on the ".NOTPARALLEL" target and the "+" indicator in
# "tests/uefi-test-tools/Makefile".
.NOTPARALLEL:

../pc-bios/edk2-aarch64-code.fd: submodules
	+./edk2-build.sh \
		aarch64 \
		--arch=AARCH64 \
		--platform=ArmVirtPkg/ArmVirtQemu.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE \
		-D TPM2_ENABLE \
		-D TPM2_CONFIG_ENABLE
	cp edk2/Build/ArmVirtQemu-AARCH64/DEBUG_$(call toolchain,aarch64)/FV/QEMU_EFI.fd \
		$@
	truncate --size=64M $@

../pc-bios/edk2-arm-code.fd: submodules
	+./edk2-build.sh \
		arm \
		--arch=ARM \
		--platform=ArmVirtPkg/ArmVirtQemu.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE \
		-D TPM2_ENABLE \
		-D TPM2_CONFIG_ENABLE
	cp edk2/Build/ArmVirtQemu-ARM/DEBUG_$(call toolchain,arm)/FV/QEMU_EFI.fd \
		$@
	truncate --size=64M $@

../pc-bios/edk2-i386-code.fd: submodules
	+./edk2-build.sh \
		i386 \
		--arch=IA32 \
		--platform=OvmfPkg/OvmfPkgIa32.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE \
		-D TPM_ENABLE \
		-D TPM_CONFIG_ENABLE
	cp edk2/Build/OvmfIa32/DEBUG_$(call toolchain,i386)/FV/OVMF_CODE.fd $@

../pc-bios/edk2-i386-secure-code.fd: submodules
	+./edk2-build.sh \
		i386 \
		--arch=IA32 \
		--platform=OvmfPkg/OvmfPkgIa32.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE \
		-D TPM_ENABLE \
		-D TPM_CONFIG_ENABLE \
		-D SECURE_BOOT_ENABLE \
		-D SMM_REQUIRE
	cp edk2/Build/OvmfIa32/DEBUG_$(call toolchain,i386)/FV/OVMF_CODE.fd $@

../pc-bios/edk2-x86_64-code.fd: submodules
	+./edk2-build.sh \
		x86_64 \
		--arch=X64 \
		--platform=OvmfPkg/OvmfPkgX64.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE \
		-D TPM_ENABLE \
		-D TPM_CONFIG_ENABLE
	cp edk2/Build/OvmfX64/DEBUG_$(call toolchain,x86_64)/FV/OVMF_CODE.fd $@

../pc-bios/edk2-x86_64-secure-code.fd: submodules
	+./edk2-build.sh \
		x86_64 \
		--arch=IA32 \
		--arch=X64 \
		--platform=OvmfPkg/OvmfPkgIa32X64.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE \
		-D TPM_ENABLE \
		-D TPM_CONFIG_ENABLE \
		-D SECURE_BOOT_ENABLE \
		-D SMM_REQUIRE
	cp edk2/Build/Ovmf3264/DEBUG_$(call toolchain,x86_64)/FV/OVMF_CODE.fd $@

../pc-bios/edk2-arm-vars.fd: ../pc-bios/edk2-arm-code.fd
	cp edk2/Build/ArmVirtQemu-ARM/DEBUG_$(call toolchain,arm)/FV/QEMU_VARS.fd \
		$@
	truncate --size=64M $@

../pc-bios/edk2-i386-vars.fd: ../pc-bios/edk2-i386-code.fd
	cp edk2/Build/OvmfIa32/DEBUG_$(call toolchain,i386)/FV/OVMF_VARS.fd $@

# The license file accumulates several individual licenses from under edk2,
# prefixing each individual license with a header (generated by "tail") that
# states its pathname.
../pc-bios/edk2-licenses.txt: submodules
	tail -n $(shell cat $(licenses) | wc -l) $(licenses) > $@
	dos2unix $@

clean:
	rm -rf edk2/Build
	cd edk2/Conf && \
		rm -rf .cache BuildEnv.sh build_rule.txt target.txt \
			tools_def.txt
