July 4, 2021
Developing EDK2 code using FreeBSD
The EDK2 doesn't work out-of-the-box with FreeBSD, but needs some extra packages and setup.
Packages to install are:
- shells/bash
- devel/binutils
- lang/gcc5, or newer
- devel/nasm
- devel/acpica-tools
- devel/git
- devel/gmake
- lang/python27
- databases/py27-sqlite3
Create the following symlinks in BaseTools/Bin/FreeBSD-amd64:
python -> /usr/local/bin/python2.7 make -> /usr/local/bin/gmake ld -> /usr/local/bin/ld objcopy -> /usr/local/bin/objcopy gcc -> /usr/local/bin/gcc5 g++ -> /usr/local/bin/g++5 gcc-ar -> /usr/local/bin/gcc-ar5 gcc-nm -> /usr/local/bin/gcc-nm5 gcc-ranlib -> /usr/local/bin/gcc-ranlib5
After that, you should be able to use the EDK2 as you would on a Linux system as long as you use bash - for example:
source edksetup.sh ./OvmfPkg/build.sh -a X64 -t GCC5 -b RELEASE
If you'd like to build for platforms other than i386 or x64, the process is a bit different.
Building for MACCHIATObin
Install the following:
- devel/aarch64-binutils [Note Run make config before building to unset the STATIC option]
- devel/aarch64-gcc
export GCC5_AARCH64_PREFIX=/usr/local/bin/aarch64-unknown-freebsd13.0-
Now you can build normally using the build command etc. I've put together a script to build for the MACCHIATObin board that can be found at the bottom of this page:
#!/usr/local/bin/bash set -e if [ "$1" == "" ]; then echo "usage: $0 [DEBUG|RELEASE]" exit 1 fi ncpu=$(sysctl -n hw.ncpu) BASEDIR=$HOME/workspace TOOLBINDIR=${BASEDIR}/edk2/BaseTools/Bin/FreeBSD-amd64 LOCALBINDIR=/usr/local/bin # Set up the build system for FreeBSD amd64 rm -rf ${TOOLBINDIR} mkdir ${TOOLBINDIR} ln -sf ${LOCALBINDIR}/gmake ${TOOLBINDIR}/make ln -sf ${LOCALBINDIR}/python2.7 ${TOOLBINDIR}/python ln -sf ${LOCALBINDIR}/objcopy ${TOOLBINDIR}/objcopy ln -sf ${LOCALBINDIR}/gcc7 ${TOOLBINDIR}/gcc ln -sf ${LOCALBINDIR}/g++7 ${TOOLBINDIR}/g++ ln -sf ${LOCALBINDIR}/gcc-ar7 ${TOOLBINDIR}/gcc-ar ln -sf ${LOCALBINDIR}/ld ${TOOLBINDIR}/ld ln -sf ${LOCALBINDIR}/gcc-nm7 ${TOOLBINDIR}/gcc-nm ln -sf ${LOCALBINDIR}/gcc-ranlib7 ${TOOLBINDIR}/gcc-ranlib cd ${BASEDIR}/edk2 export GCC5_AARCH64_PREFIX=${LOCALBINDIR}/aarch64-unknown-freebsd13.0- . ./edksetup.sh --reconfig make -C BaseTools -j $ncpu build -n $ncpu --genfds-multi-thread -a AARCH64 -t GCC5 -b ${1} -D INCLUDE_TFTP_COMMAND -p OpenPlatformPkg/Platforms/Marvell/Armada/Armada80x0McBin.dsc cd ../macchiatobin/atf-marvell export ARCH=arm64 export CROSS_COMPILE=${GCC5_AARCH64_PREFIX} export SCP_BL2=${BASEDIR}/macchiatobin/binaries-marvell/mrvl_scp_bl2_mss_ap_cp1_a8040.img export BL33=${BASEDIR}/edk2/Build/Armada80x0McBin-AARCH64/${1}_GCC5/FV/ARMADA_EFI.fd export SCP_BL2=${BASEDIR}/macchiatobin/binaries-marvell/mrvl_scp_bl2_mss_ap_cp1_a8040.img make -j $ncpu USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=${BASEDIR}/macchiatobin/mv-ddr-marvell PLAT=a80x0_mcbin all fip