1SUMMARY = "UEFI EDK2 Firmware"
2DESCRIPTION = "UEFI EDK2 Firmware for Arm reference platforms"
3HOMEPAGE = "https://github.com/tianocore/edk2"
4LICENSE = "BSD-2-Clause-Patent"
5
6PROVIDES = "virtual/bootloader"
7
8# EDK2
9LIC_FILES_CHKSUM = "file://License.txt;md5=2b415520383f7964e96700ae12b4570a"
10# EDK2 Platforms
11LIC_FILES_CHKSUM += "file://edk2-platforms/License.txt;md5=2b415520383f7964e96700ae12b4570a"
12
13# These can be overridden as needed
14SRC_URI_EDK2 ?= "gitsm://github.com/tianocore/edk2.git;protocol=https"
15SRC_URI_EDK2_PLATFORMS ?= "git://github.com/tianocore/edk2-platforms.git;protocol=https"
16SRCBRANCH_edk2 = "master"
17SRCBRANCH_edk2_platforms = "master"
18SRC_URI = "\
19    ${SRC_URI_EDK2};branch=${SRCBRANCH_edk2_platforms};name=edk2;destsuffix=edk2 \
20    ${SRC_URI_EDK2_PLATFORMS};branch=${SRCBRANCH_edk2};name=edk2-platforms;destsuffix=edk2/edk2-platforms \
21"
22
23SRCREV_FORMAT         = "edk2_edk2-platforms"
24UPSTREAM_CHECK_GITTAGREGEX = "^edk2-stable(?P<pver>\d+)$"
25
26COMPATIBLE_MACHINE ?= "invalid"
27PACKAGE_ARCH = "${MACHINE_ARCH}"
28
29EDK2_BUILD_RELEASE = "1"
30
31EDK2_PLATFORM      = "unset"
32# build --platform
33EDK2_PLATFORM_DSC  = "unset"
34EDK2_BIN_NAME      = ""
35# build --arch
36EDK2_ARCH         ?= "unset"
37EDK2_ARCH:arm      = "ARM"
38EDK2_ARCH:aarch64  = "AARCH64"
39EDK2_ARCH:x86      = "IA32"
40EDK2_ARCH:x86-64   = "X64"
41EDK2_ARCH:riscv64  = "RISCV64"
42
43# Extra arguments passed to build
44EDK2_EXTRA_BUILD   = ""
45
46# build --buildtarget
47EDK2_BUILD_MODE ?= "${@bb.utils.contains('EDK2_BUILD_RELEASE', '1', 'RELEASE', 'DEBUG', d)}"
48
49# Baremetal, no need for a C library
50DEPENDS:remove = "virtual/${TARGET_PREFIX}compilerlibs virtual/libc"
51DEPENDS += "util-linux-native iasl-native"
52
53inherit deploy
54
55S = "${WORKDIR}/edk2"
56B = "${WORKDIR}/build"
57
58LDFLAGS[unexport] = "1"
59
60do_configure[cleandirs] += "${B}"
61
62# Set variables as per envsetup
63export PACKAGES_PATH       = "${S}:${S}/edk2-platforms"
64export WORKSPACE           = "${B}"
65export EDK_TOOLS_PATH      = "${S}/BaseTools"
66export PYTHON_COMMAND      = "python3"
67export CONF_PATH           = "${S}/Conf"
68
69export BTOOLS_PATH = "${EDK_TOOLS_PATH}/BinWrappers/PosixLike"
70
71EDK_COMPILER ?= "GCC5"
72export GCC5_AARCH64_PREFIX = "${TARGET_PREFIX}"
73export GCC5_ARM_PREFIX = "${TARGET_PREFIX}"
74
75EDK_COMPILER:toolchain-clang = "CLANG38"
76export CLANG38_AARCH64_PREFIX = "${TARGET_PREFIX}"
77export CLANG38_ARM_PREFIX = "${TARGET_PREFIX}"
78
79# These variables were changed in edk2 commit
80# 206168e83f0901cbc1815ef5df4ac6598ad9721b, which was part of edk2-202305
81export CC = "${BUILD_CC}"
82export CXX = "${BUILD_CXX}"
83export AS = "${BUILD_AS}"
84export AR = "${BUILD_AR}"
85export LD = "${BUILD_LD}"
86export CFLAGS = "${BUILD_CFLAGS}"
87export CPPFLAGS = "${BUILD_CPPFLAGS}"
88export LDFLAGS = "${BUILD_LFLAGS}"
89
90#FIXME - arm32 doesn't work with clang due to a linker issue
91TOOLCHAIN:arm = "gcc"
92
93do_configure:prepend() {
94    sed -i -e "s#-target ${HOST_ARCH}-linux-gnu.*#-target ${HOST_SYS}#" ${S}/BaseTools/Conf/tools_def.template
95}
96
97do_compile() {
98    sed -i -e 's:-I \.\.:-I \.\. ${BUILD_CFLAGS} :' ${EDK_TOOLS_PATH}/Source/C/Makefiles/header.makefile
99    sed -i -e 's: -luuid: -luuid ${BUILD_LDFLAGS}:g' ${EDK_TOOLS_PATH}/Source/C/*/GNUmakefile
100
101    # Copy the templates as we don't run envsetup
102    cp ${EDK_TOOLS_PATH}/Conf/build_rule.template ${S}/Conf/build_rule.txt
103    cp ${EDK_TOOLS_PATH}/Conf/tools_def.template ${S}/Conf/tools_def.txt
104    cp ${EDK_TOOLS_PATH}/Conf/target.template ${S}/Conf/target.txt
105
106    # Build basetools
107    oe_runmake -C ${S}/BaseTools
108
109    PATH="${WORKSPACE}:${BTOOLS_PATH}:$PATH" \
110    build \
111       --arch "${EDK2_ARCH}" \
112       --buildtarget ${EDK2_BUILD_MODE} \
113       --tagname ${EDK_COMPILER} \
114       --platform ${EDK2_PLATFORM_DSC} \
115       ${@oe.utils.parallel_make_argument(d, "-n %d")} \
116       ${EDK2_EXTRA_BUILD}
117}
118
119do_install() {
120    install -d ${D}/firmware
121    install ${B}/Build/${EDK2_PLATFORM}/${EDK2_BUILD_MODE}_${EDK_COMPILER}/FV/${EDK2_BIN_NAME} ${D}/firmware/uefi.bin
122}
123
124FILES:${PN} = "/firmware"
125SYSROOT_DIRS += "/firmware"
126# Skip QA check for relocations in .text of elf binaries
127INSANE_SKIP:${PN} += "textrel"
128# Build paths are currently embedded
129INSANE_SKIP:${PN} += "buildpaths"
130
131do_deploy() {
132    # Copy the images to deploy directory
133    cp -rf ${D}/firmware/* ${DEPLOYDIR}/
134}
135addtask deploy after do_install
136