Files
nixpkgs/pkgs/build-support/kernel/make-initrd.nix
Emily 38dec9fcff makeInitrd{,NG}: drop legacy U‐Boot image support
Now that ARMv5 no longer uses `uImage`, there’s no point in keeping
around support for this deprecated format that the rest of the NixOS
infrastructure doesn’t handle. Modern U‐Boot setups should not
be affected in any way by this.
2026-06-01 11:12:44 +10:00

110 lines
4.1 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Create an initramfs containing the closure of the specified
# file system objects. An initramfs is used during the initial
# stages of booting a Linux system. It is loaded by the boot loader
# along with the kernel image. It's supposed to contain everything
# (such as kernel modules) necessary to allow us to mount the root
# file system. Once the root file system is mounted, the `real' boot
# script can be called.
#
# An initramfs is a cpio archive, and may be compressed with a number
# of algorithms.
let
# Some metadata on various compression programs, relevant to naming
# the initramfs file.
compressors = import ./initrd-compressor-meta.nix;
# Get the basename of the actual compression program from the whole
# compression command, for the purpose of guessing the
# compression type and filename extension.
compressorName = fullCommand: builtins.elemAt (builtins.match "([^ ]*/)?([^ ]+).*" fullCommand) 1;
in
{
stdenvNoCC,
cpio,
lib,
pkgsBuildHost,
# Name of the derivation (not of the resulting file!)
name ? "initrd",
# Program used to compress the cpio archive; use "cat" for no compression.
# This can also be a function which takes a package set and returns the path to the compressor,
# such as `pkgs: "${pkgs.lzop}/bin/lzop"`.
compressor ? "gzip",
_compressorFunction ?
if lib.isFunction compressor then
compressor
else if !builtins.hasContext compressor && builtins.hasAttr compressor compressors then
compressors.${compressor}.executable
else
_: compressor,
_compressorExecutable ? _compressorFunction pkgsBuildHost,
_compressorName ? compressorName _compressorExecutable,
_compressorMeta ? compressors.${_compressorName} or { },
# List of arguments to pass to the compressor program, or null to use its defaults
compressorArgs ? null,
_compressorArgsReal ?
if compressorArgs == null then _compressorMeta.defaultArgs or [ ] else compressorArgs,
# Filename extension to use for the compressed initramfs. This is
# included for clarity, but $out/initrd will always be a symlink to
# the final image.
# If this isn't guessed, you may want to complete the metadata above and send a PR :)
extension ?
_compressorMeta.extension
or (throw "Unrecognised compressor ${_compressorName}, please specify filename extension"),
# List of { object = path_or_derivation; symlink = "/path"; }
# The paths are copied into the initramfs in their nix store path
# form, then linked at the root according to `symlink`.
contents,
# List of uncompressed cpio files to prepend to the initramfs. This
# can be used to add files in specified paths without them becoming
# symlinks to store paths.
prepend ? [ ],
# Deprecated; remove in 27.05.
makeUInitrd ? null,
uInitrdArch ? null,
uInitrdCompression ? null,
}:
assert lib.assertMsg (makeUInitrd == null && uInitrdArch == null && uInitrdCompression == null)
"makeInitrd: UBoot legacy image support has been removed as it is deprecated upstream and ARMv5 kernels no longer default to uImage";
stdenvNoCC.mkDerivation (finalAttrs: {
__structuredAttrs = true;
# the initrd will be self-contained so we can drop references
# to the closure that was used to build it
unsafeDiscardReferences.out = true;
inherit
name
extension
prepend
;
builder = ./make-initrd.sh;
nativeBuildInputs = [
cpio
];
compress = "${_compressorExecutable} ${lib.escapeShellArgs _compressorArgsReal}";
# !!! should use XML.
objects = map (x: x.object) contents;
symlinks = map (x: x.symlink) contents;
suffices = map (x: if x ? suffix then x.suffix else "none") contents;
closureInfo = "${pkgsBuildHost.closureInfo { rootPaths = finalAttrs.objects; }}";
# Pass the function through, for reuse in append-initrd-secrets. The
# function is used instead of the string, in order to support
# cross-compilation (append-initrd-secrets running on a different
# architecture than what the main initramfs is built on).
passthru = {
compressorExecutableFunction = _compressorFunction;
compressorArgs = _compressorArgsReal;
};
})