Files
nix-config/packages/uboot/default.nix
mjallen18 b216fe5215 bruh
2025-12-30 14:28:48 -06:00

275 lines
6.7 KiB
Nix

{
stdenv,
lib,
bc,
bison,
dtc,
fetchFromGitHub,
fetchpatch,
fetchurl,
flex,
gnutls,
installShellFiles,
libuuid,
meson-tools,
ncurses,
openssl,
rkbin,
swig,
which,
python3,
perl,
armTrustedFirmwareAllwinner,
armTrustedFirmwareAllwinnerH6,
armTrustedFirmwareAllwinnerH616,
armTrustedFirmwareRK3328,
armTrustedFirmwareRK3399,
armTrustedFirmwareRK3568,
armTrustedFirmwareRK3588,
armTrustedFirmwareS905,
opensbi,
buildPackages,
callPackages,
darwin,
}@pkgs:
let
defaultVersion = "2025.07";
defaultSrc = fetchurl {
url = "https://ftp.denx.de/pub/u-boot/u-boot-${defaultVersion}.tar.bz2";
hash = "sha256-D5M/bFpCaJW/MG6T5qxTxghw5LVM2lbZUhG+yZ5jvsc=";
};
# Dependencies for the tools need to be included as either native or cross,
# depending on which we're building
toolsDeps = [
ncurses # tools/kwboot
libuuid # tools/mkeficapsule
gnutls # tools/mkeficapsule
openssl # tools/mkimage and tools/env/fw_printenv
];
buildUBoot = lib.makeOverridable (
{
version ? null,
src ? null,
filesToInstall,
pythonScriptsToInstall ? { },
installDir ? "$out",
defconfig,
extraConfig ? "",
extraPatches ? [ ],
extraMakeFlags ? [ ],
extraMeta ? { },
crossTools ? false,
stdenv ? pkgs.stdenv,
...
}@args:
stdenv.mkDerivation (
{
pname = "uboot-${defconfig}";
version = if src == null then defaultVersion else version;
src = if src == null then defaultSrc else src;
patches = extraPatches;
postPatch = ''
${lib.concatMapStrings (script: ''
substituteInPlace ${script} \
--replace "#!/usr/bin/env python3" "#!${pythonScriptsToInstall.${script}}/bin/python3"
'') (builtins.attrNames pythonScriptsToInstall)}
patchShebangs tools
patchShebangs scripts
'';
nativeBuildInputs = [
ncurses # tools/kwboot
bc
bison
flex
installShellFiles
(buildPackages.python3.withPackages (p: [
p.libfdt
p.setuptools # for pkg_resources
p.pyelftools
]))
swig
which # for scripts/dtc-version.sh
perl # for oid build (secureboot)
]
++ lib.optionals (!crossTools) toolsDeps
++ lib.optionals stdenv.buildPlatform.isDarwin [ darwin.DarwinTools ]; # sw_vers command is needed on darwin
depsBuildBuild = [ buildPackages.gccStdenv.cc ]; # gccStdenv is needed for Darwin buildPlatform
buildInputs = lib.optionals crossTools toolsDeps;
hardeningDisable = [ "all" ];
enableParallelBuilding = true;
makeFlags = [
"DTC=${lib.getExe buildPackages.dtc}"
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
"HOSTCFLAGS=-fcommon"
]
++ extraMakeFlags;
passAsFile = [ "extraConfig" ];
configurePhase = ''
runHook preConfigure
make -j$NIX_BUILD_CORES ${defconfig}
cat $extraConfigPath >> .config
runHook postConfigure
'';
installPhase = ''
runHook preInstall
mkdir -p ${installDir}
cp ${
lib.concatStringsSep " " (filesToInstall ++ builtins.attrNames pythonScriptsToInstall)
} ${installDir}
mkdir -p "$out/nix-support"
${lib.concatMapStrings (file: ''
echo "file binary-dist ${installDir}/${baseNameOf file}" >> "$out/nix-support/hydra-build-products"
'') (filesToInstall ++ builtins.attrNames pythonScriptsToInstall)}
runHook postInstall
'';
dontStrip = true;
meta =
with lib;
{
homepage = "https://www.denx.de/wiki/U-Boot/";
description = "Boot loader for embedded systems";
license = licenses.gpl2Plus;
maintainers = with maintainers; [
dezgeg
lopsided98
];
}
// extraMeta;
}
// removeAttrs args [
"extraMeta"
"pythonScriptsToInstall"
]
)
);
in
{
inherit buildUBoot;
ubootTools = buildUBoot {
defconfig = "tools-only_defconfig";
installDir = "$out/bin";
hardeningDisable = [ ];
dontStrip = false;
extraMeta.platforms = lib.platforms.linux;
crossTools = true;
extraMakeFlags = [
"HOST_TOOLS_ALL=y"
"NO_SDL=1"
"cross_tools"
"envtools"
];
outputs = [
"out"
"man"
];
postInstall = ''
installManPage doc/*.1
# from u-boot's tools/env/README:
# "You should then create a symlink from fw_setenv to fw_printenv. They
# use the same program and its function depends on its basename."
ln -s $out/bin/fw_printenv $out/bin/fw_setenv
'';
filesToInstall = [
"tools/dumpimage"
"tools/fdt_add_pubkey"
"tools/fdtgrep"
"tools/kwboot"
"tools/mkeficapsule"
"tools/mkenvimage"
"tools/mkimage"
"tools/env/fw_printenv"
"tools/mkeficapsule"
];
pythonScriptsToInstall = {
"tools/efivar.py" = (python3.withPackages (ps: [ ps.pyopenssl ]));
};
};
ubootPythonTools = lib.recurseIntoAttrs (callPackages ./python.nix { });
ubootQemuAarch64 = buildUBoot {
defconfig = "qemu_arm64_defconfig";
extraMeta.platforms = [ "aarch64-linux" ];
filesToInstall = [ "u-boot.bin" ];
};
ubootQemuArm = buildUBoot {
defconfig = "qemu_arm_defconfig";
extraMeta.platforms = [ "armv7l-linux" ];
filesToInstall = [ "u-boot.bin" ];
};
ubootQemuRiscv64Smode = buildUBoot {
defconfig = "qemu-riscv64_smode_defconfig";
extraMeta.platforms = [ "riscv64-linux" ];
filesToInstall = [ "u-boot.bin" ];
};
ubootQemuX86 = buildUBoot {
defconfig = "qemu-x86_defconfig";
extraConfig = ''
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_GENERIC=y
CONFIG_USB_XHCI_HCD=y
'';
extraMeta.platforms = [
"i686-linux"
"x86_64-linux"
];
filesToInstall = [ "u-boot.rom" ];
};
ubootQemuX86_64 = buildUBoot {
defconfig = "qemu-x86_64_defconfig";
extraConfig = ''
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_GENERIC=y
CONFIG_USB_XHCI_HCD=y
'';
extraMeta.platforms = [ "x86_64-linux" ];
filesToInstall = [ "u-boot.rom" ];
};
ubootRaspberryPi4 = buildUBoot {
defconfig = "rpi_4_defconfig";
extraMeta.platforms = [ "aarch64-linux" ];
filesToInstall = [ "u-boot.bin" ];
};
ubootRaspberryPi5 = buildUBoot {
defconfig = "rpi_arm64_defconfig";
extraMeta.platforms = [ "aarch64-linux" ];
filesToInstall = [ "u-boot.bin" ];
};
}