mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-06-05 21:03:40 +00:00
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.
110 lines
4.1 KiB
Nix
110 lines
4.1 KiB
Nix
# 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: U‐Boot 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;
|
||
};
|
||
})
|