{ stdenv, lib, MODEL ? "5", RELEASE_TYPE ? "RELEASE", EDK2_FLAGS ? "", nasm, perl, python3, python3Packages, openssl, git, libuuid, acpica-tools, pkgs, namespace, }: let inherit (lib.trivial) importJSON; inherit (lib.${namespace}) selectVariant mkAllSources; pname = "edk2"; version = "stable202511"; versionSpec = importJSON ./version.json; selected = selectVariant versionSpec (if MODEL == "5" then "mjallen" else null) null; sources = mkAllSources pkgs selected; edk2Src = sources.edk2; edk2NonOsiSrc = sources."edk2-non-osi"; edk2PlatformsSrc = sources."edk2-platforms"; baseTools = pkgs.${namespace}.edk2-basetools.override { version = "stable202511"; srcOverride = edk2Src; }; armTrustedFirmware = pkgs.${namespace}.arm-trusted-firmware.override { inherit MODEL; }; pythonEnv = python3.withPackages ( _ps: with python3Packages; [ libfdt ] ); in stdenv.mkDerivation rec { inherit pname version; # Add required host tools if needed: nativeBuildInputs = [ openssl nasm perl pythonEnv git libuuid baseTools acpica-tools ]; env = { NIX_CFLAGS_COMPILE = "-Wno-return-type -Wno-error" + lib.optionalString stdenv.cc.isGNU " -Wno-error=stringop-truncation" + lib.optionalString stdenv.hostPlatform.isDarwin " -Wno-error=macro-redefined"; PYTHON_COMMAND = lib.getExe pythonEnv; # trick taken from https://src.fedoraproject.org/rpms/edk2/blob/08f2354cd280b4ce5a7888aa85cf520e042955c3/f/edk2.spec#_319 ${"GCC5_AARCH64_PREFIX"} = stdenv.cc.targetPrefix; }; # Don’t force a single root; we keep both dirs side by side sourceRoot = "."; unpackPhase = '' runHook preUnpack cp -r ${edk2Src} ./edk2 cp -r ${edk2NonOsiSrc} ./edk2-non-osi cp -r ${edk2PlatformsSrc} ./edk2-platforms chmod -R u+w . patchShebangs ./edk2 runHook postUnpack ''; prePatch = '' rm -rf ./edk2/BaseTools ln -sv ${baseTools}/BaseTools ./edk2/BaseTools ''; configurePhase = '' runHook preConfigure export WORKSPACE=$PWD export PACKAGES_PATH=$WORKSPACE/edk2:$WORKSPACE/edk2-non-osi:$WORKSPACE/edk2-platforms export EDK_TOOLS_PATH=${baseTools}/BaseTools export ATF_BUILD_DIR="${armTrustedFirmware}/rpi${MODEL}/${lib.toLower RELEASE_TYPE}" . ${baseTools}/edksetup.sh BaseTools runHook postConfigure ''; buildPhase = '' build \ -a AARCH64 \ -t GCC \ -b ${RELEASE_TYPE} \ -p edk2-platforms/Platform/RaspberryPi/RPi${MODEL}/RPi${MODEL}.dsc \ -D TFA_BUILD_ARTIFACTS=$ATF_BUILD_DIR \ --pcd gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString=L${version} \ ${EDK2_FLAGS} ''; installPhase = '' mkdir -p $out cp -r /build/Build/RPi${MODEL}/${RELEASE_TYPE}_GCC/FV/RPI_EFI.fd $out/RPI_EFI.fd ''; meta = with lib; { description = "ARM Trusted Firmware-A for Raspberry Pi"; license = licenses.bsd3; platforms = [ "aarch64-linux" ]; maintainers = with maintainers; [ kazenyuk ]; }; }