# 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

target = RELEASE
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 \
	x86_64-microvm \
	\
	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 -e edk2/.git; then \
		cd edk2 && git submodule update --init --force -- \
			ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 \
			BaseTools/Source/C/BrotliCompress/brotli \
			CryptoPkg/Library/OpensslLib/openssl \
			MdeModulePkg/Library/BrotliCustomDecompressLib/brotli \
		; \
	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/$(target)_$(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/$(target)_$(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/$(target)_$(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/$(target)_$(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/$(target)_$(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/$(target)_$(call toolchain,x86_64)/FV/OVMF_CODE.fd $@

../pc-bios/edk2-x86_64-microvm.fd: submodules
	+./edk2-build.sh \
		x86_64 \
		--arch=X64 \
		--platform=OvmfPkg/Microvm/MicrovmX64.dsc \
		-D NETWORK_IP6_ENABLE \
		-D NETWORK_HTTP_BOOT_ENABLE \
		-D NETWORK_TLS_ENABLE
	cp edk2/Build/MicrovmX64/$(target)_$(call toolchain,x86_64)/FV/MICROVM.fd $@

../pc-bios/edk2-arm-vars.fd: ../pc-bios/edk2-arm-code.fd
	cp edk2/Build/ArmVirtQemu-ARM/$(target)_$(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/$(target)_$(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
