# 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
	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
	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 TPM2_ENABLE \
		-D TPM2_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 TPM2_ENABLE \
		-D TPM2_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 TPM2_ENABLE \
		-D TPM2_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 TPM2_ENABLE \
		-D TPM2_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
