1*4882a593Smuzhiyun################################################################################ 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# edk2 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun################################################################################ 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunEDK2_VERSION = edk2-stable202102 8*4882a593SmuzhiyunEDK2_SITE = https://github.com/tianocore/edk2 9*4882a593SmuzhiyunEDK2_SITE_METHOD = git 10*4882a593SmuzhiyunEDK2_LICENSE = BSD-2-Clause 11*4882a593SmuzhiyunEDK2_LICENSE_FILE = License.txt 12*4882a593SmuzhiyunEDK2_CPE_ID_VENDOR = tianocore 13*4882a593SmuzhiyunEDK2_DEPENDENCIES = edk2-platforms host-python3 host-acpica host-util-linux 14*4882a593SmuzhiyunEDK2_INSTALL_TARGET = NO 15*4882a593SmuzhiyunEDK2_INSTALL_IMAGES = YES 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunifeq ($(BR2_ENABLE_DEBUG),y) 18*4882a593SmuzhiyunEDK2_BUILD_TYPE = DEBUG 19*4882a593Smuzhiyunelse 20*4882a593SmuzhiyunEDK2_BUILD_TYPE = RELEASE 21*4882a593Smuzhiyunendif 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun# Build system notes. 24*4882a593Smuzhiyun# 25*4882a593Smuzhiyun# The EDK2 build system is rather unique, so here are a few useful notes. 26*4882a593Smuzhiyun# 27*4882a593Smuzhiyun# First, builds rely heavily on Git submodules to fetch various dependencies 28*4882a593Smuzhiyun# into specific directory structures. It might be possible to work around this 29*4882a593Smuzhiyun# and rely on Buildroot's infrastructure, but using Git submodules greatly 30*4882a593Smuzhiyun# simplifies this already complicated build system. 31*4882a593Smuzhiyun# 32*4882a593Smuzhiyun# Second, the build system is spread across various commands and stages. 33*4882a593Smuzhiyun# Therefore, all build variables needs to be exported to be available 34*4882a593Smuzhiyun# accordingly. The first stage will build $(@D)/BaseTools which contains 35*4882a593Smuzhiyun# various tools and scripts for the host. 36*4882a593Smuzhiyun# 37*4882a593Smuzhiyun# Third, where applicable, the dependency direction between EDK2 and 38*4882a593Smuzhiyun# ARM Trusted Firmware (ATF) will go in different direction for different 39*4882a593Smuzhiyun# platforms. Most commonly, ATF will depend on EDK2 via the BL33 payload. 40*4882a593Smuzhiyun# But for some platforms (e.g. QEMU SBSA or DeveloperBox) EDK2 will package 41*4882a593Smuzhiyun# the ATF images within its own build system. In such cases, intermediary 42*4882a593Smuzhiyun# "EDK2 packages" will be built in $(EDK2_BUILD_PACKAGES) in order for EDK2 43*4882a593Smuzhiyun# to be able to use them in subsequent build stages. 44*4882a593Smuzhiyun# 45*4882a593Smuzhiyun# For more information about the build setup: 46*4882a593Smuzhiyun# https://edk2-docs.gitbook.io/edk-ii-build-specification/4_edk_ii_build_process_overview 47*4882a593Smuzhiyun 48*4882a593SmuzhiyunEDK2_GIT_SUBMODULES = YES 49*4882a593SmuzhiyunEDK2_BUILD_PACKAGES = $(@D)/Build/Buildroot 50*4882a593SmuzhiyunEDK2_PACKAGES_PATH = $(@D):$(EDK2_BUILD_PACKAGES):$(STAGING_DIR)/usr/share/edk2-platforms 51*4882a593Smuzhiyun 52*4882a593Smuzhiyunifeq ($(BR2_TARGET_EDK2_PLATFORM_OVMF_I386),y) 53*4882a593SmuzhiyunEDK2_ARCH = IA32 54*4882a593SmuzhiyunEDK2_DEPENDENCIES += host-nasm 55*4882a593SmuzhiyunEDK2_PACKAGE_NAME = OvmfPkg 56*4882a593SmuzhiyunEDK2_PLATFORM_NAME = OvmfPkgIa32 57*4882a593SmuzhiyunEDK2_BUILD_DIR = OvmfIa32 58*4882a593Smuzhiyun 59*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_OVMF_X64),y) 60*4882a593SmuzhiyunEDK2_ARCH = X64 61*4882a593SmuzhiyunEDK2_DEPENDENCIES += host-nasm 62*4882a593SmuzhiyunEDK2_PACKAGE_NAME = OvmfPkg 63*4882a593SmuzhiyunEDK2_PLATFORM_NAME = OvmfPkgX64 64*4882a593SmuzhiyunEDK2_BUILD_DIR = OvmfX64 65*4882a593Smuzhiyun 66*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_ARM_VIRT_QEMU),y) 67*4882a593SmuzhiyunEDK2_ARCH = AARCH64 68*4882a593SmuzhiyunEDK2_PACKAGE_NAME = ArmVirtPkg 69*4882a593SmuzhiyunEDK2_PLATFORM_NAME = ArmVirtQemu 70*4882a593SmuzhiyunEDK2_BUILD_DIR = $(EDK2_PLATFORM_NAME)-$(EDK2_ARCH) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_ARM_VIRT_QEMU_KERNEL),y) 73*4882a593SmuzhiyunEDK2_ARCH = AARCH64 74*4882a593SmuzhiyunEDK2_PACKAGE_NAME = ArmVirtPkg 75*4882a593SmuzhiyunEDK2_PLATFORM_NAME = ArmVirtQemuKernel 76*4882a593SmuzhiyunEDK2_BUILD_DIR = $(EDK2_PLATFORM_NAME)-$(EDK2_ARCH) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_ARM_VEXPRESS_FVP_AARCH64),y) 79*4882a593SmuzhiyunEDK2_ARCH = AARCH64 80*4882a593SmuzhiyunEDK2_PACKAGE_NAME = Platform/ARM/VExpressPkg 81*4882a593SmuzhiyunEDK2_PLATFORM_NAME = ArmVExpress-FVP-AArch64 82*4882a593SmuzhiyunEDK2_BUILD_DIR = $(EDK2_PLATFORM_NAME) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_SOCIONEXT_DEVELOPERBOX),y) 85*4882a593SmuzhiyunEDK2_ARCH = AARCH64 86*4882a593SmuzhiyunEDK2_DEPENDENCIES += host-dtc arm-trusted-firmware 87*4882a593SmuzhiyunEDK2_PACKAGE_NAME = Platform/Socionext/DeveloperBox 88*4882a593SmuzhiyunEDK2_PLATFORM_NAME = DeveloperBox 89*4882a593SmuzhiyunEDK2_BUILD_DIR = $(EDK2_PLATFORM_NAME) 90*4882a593SmuzhiyunEDK2_BUILD_ENV += DTC_PREFIX=$(HOST_DIR)/bin/ 91*4882a593SmuzhiyunEDK2_BUILD_OPTS += -D DO_X86EMU=TRUE 92*4882a593SmuzhiyunEDK2_PRE_BUILD_HOOKS += EDK2_PRE_BUILD_SOCIONEXT_DEVELOPERBOX 93*4882a593Smuzhiyun 94*4882a593Smuzhiyundefine EDK2_PRE_BUILD_SOCIONEXT_DEVELOPERBOX 95*4882a593Smuzhiyun mkdir -p $(EDK2_BUILD_PACKAGES)/Platform/Socionext/DeveloperBox 96*4882a593Smuzhiyun $(ARM_TRUSTED_FIRMWARE_DIR)/tools/fiptool/fiptool create \ 97*4882a593Smuzhiyun --tb-fw $(BINARIES_DIR)/bl31.bin \ 98*4882a593Smuzhiyun --soc-fw $(BINARIES_DIR)/bl31.bin \ 99*4882a593Smuzhiyun --scp-fw $(BINARIES_DIR)/bl31.bin \ 100*4882a593Smuzhiyun $(EDK2_BUILD_PACKAGES)/Platform/Socionext/DeveloperBox/fip_all_arm_tf.bin 101*4882a593Smuzhiyunendef 102*4882a593Smuzhiyun 103*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_SOLIDRUN_ARMADA80X0MCBIN),y) 104*4882a593SmuzhiyunEDK2_ARCH = AARCH64 105*4882a593SmuzhiyunEDK2_DEPENDENCIES += host-dtc arm-trusted-firmware 106*4882a593SmuzhiyunEDK2_PACKAGE_NAME = Platform/SolidRun/Armada80x0McBin 107*4882a593SmuzhiyunEDK2_PLATFORM_NAME = Armada80x0McBin 108*4882a593SmuzhiyunEDK2_BUILD_DIR = $(EDK2_PLATFORM_NAME)-$(EDK2_ARCH) 109*4882a593SmuzhiyunEDK2_BUILD_ENV += DTC_PREFIX=$(HOST_DIR)/bin/ 110*4882a593SmuzhiyunEDK2_BUILD_OPTS += -D INCLUDE_TFTP_COMMAND 111*4882a593Smuzhiyun 112*4882a593Smuzhiyunelse ifeq ($(BR2_TARGET_EDK2_PLATFORM_QEMU_SBSA),y) 113*4882a593SmuzhiyunEDK2_ARCH = AARCH64 114*4882a593SmuzhiyunEDK2_DEPENDENCIES += arm-trusted-firmware 115*4882a593SmuzhiyunEDK2_PACKAGE_NAME = Platform/Qemu/SbsaQemu 116*4882a593SmuzhiyunEDK2_PLATFORM_NAME = SbsaQemu 117*4882a593SmuzhiyunEDK2_BUILD_DIR = $(EDK2_PLATFORM_NAME) 118*4882a593SmuzhiyunEDK2_PRE_BUILD_HOOKS += EDK2_PRE_BUILD_QEMU_SBSA 119*4882a593Smuzhiyun 120*4882a593Smuzhiyundefine EDK2_PRE_BUILD_QEMU_SBSA 121*4882a593Smuzhiyun mkdir -p $(EDK2_BUILD_PACKAGES)/Platform/Qemu/Sbsa 122*4882a593Smuzhiyun ln -srf $(BINARIES_DIR)/{bl1.bin,fip.bin} $(EDK2_BUILD_PACKAGES)/Platform/Qemu/Sbsa/ 123*4882a593Smuzhiyunendef 124*4882a593Smuzhiyun 125*4882a593Smuzhiyunendif 126*4882a593Smuzhiyun 127*4882a593SmuzhiyunEDK2_BASETOOLS_OPTS = \ 128*4882a593Smuzhiyun EXTRA_LDFLAGS="$(HOST_LDFLAGS)" \ 129*4882a593Smuzhiyun EXTRA_OPTFLAGS="$(HOST_CPPFLAGS)" 130*4882a593Smuzhiyun 131*4882a593SmuzhiyunEDK2_BUILD_ENV += \ 132*4882a593Smuzhiyun WORKSPACE=$(@D) \ 133*4882a593Smuzhiyun PACKAGES_PATH=$(EDK2_PACKAGES_PATH) \ 134*4882a593Smuzhiyun PYTHON_COMMAND=$(HOST_DIR)/bin/python3 \ 135*4882a593Smuzhiyun IASL_PREFIX=$(HOST_DIR)/bin/ \ 136*4882a593Smuzhiyun NASM_PREFIX=$(HOST_DIR)/bin/ \ 137*4882a593Smuzhiyun GCC5_$(EDK2_ARCH)_PREFIX=$(TARGET_CROSS) 138*4882a593Smuzhiyun 139*4882a593SmuzhiyunEDK2_BUILD_OPTS += \ 140*4882a593Smuzhiyun -t GCC5 \ 141*4882a593Smuzhiyun -n $(BR2_JLEVEL) \ 142*4882a593Smuzhiyun -a $(EDK2_ARCH) \ 143*4882a593Smuzhiyun -b $(EDK2_BUILD_TYPE) \ 144*4882a593Smuzhiyun -p $(EDK2_PACKAGE_NAME)/$(EDK2_PLATFORM_NAME).dsc 145*4882a593Smuzhiyun 146*4882a593Smuzhiyundefine EDK2_BUILD_CMDS 147*4882a593Smuzhiyun mkdir -p $(EDK2_BUILD_PACKAGES) 148*4882a593Smuzhiyun export $(EDK2_BUILD_ENV) && \ 149*4882a593Smuzhiyun unset ARCH && \ 150*4882a593Smuzhiyun source $(@D)/edksetup.sh && \ 151*4882a593Smuzhiyun $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/BaseTools $(EDK2_BASETOOLS_OPTS) && \ 152*4882a593Smuzhiyun build $(EDK2_BUILD_OPTS) all 153*4882a593Smuzhiyunendef 154*4882a593Smuzhiyun 155*4882a593Smuzhiyundefine EDK2_INSTALL_IMAGES_CMDS 156*4882a593Smuzhiyun cp -f $(@D)/Build/$(EDK2_BUILD_DIR)/$(EDK2_BUILD_TYPE)_GCC5/FV/*.fd $(BINARIES_DIR) 157*4882a593Smuzhiyunendef 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun$(eval $(generic-package)) 160