raspberrypi-bootloader: allow specification of target directory

This commit is contained in:
Ben Wolsieffer 2018-09-04 16:52:29 -04:00 committed by Tuomas Tynkkynen
parent 73f796aa62
commit bcb9e17bba
3 changed files with 53 additions and 42 deletions

View File

@ -0,0 +1,10 @@
{ pkgs, version, configTxt }:
pkgs.substituteAll {
src = ./raspberrypi-builder.sh;
isExecutable = true;
inherit (pkgs) bash;
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
firmware = pkgs.raspberrypifw;
inherit version configTxt;
}

View File

@ -5,15 +5,25 @@ shopt -s nullglob
export PATH=/empty export PATH=/empty
for i in @path@; do PATH=$PATH:$i/bin; done for i in @path@; do PATH=$PATH:$i/bin; done
default=$1 usage() {
if test -z "$1"; then echo "usage: $0 -c <path-to-default-configuration> [-d <boot-dir>]" >&2
echo "Syntax: builder.sh <DEFAULT-CONFIG>"
exit 1 exit 1
fi }
default= # Default configuration
target=/boot # Target directory
while getopts "c:d:" opt; do
case "$opt" in
c) default="$OPTARG" ;;
d) target="$OPTARG" ;;
\?) usage ;;
esac
done
echo "updating the boot generations directory..." echo "updating the boot generations directory..."
mkdir -p /boot/old mkdir -p $target/old
# Convert a path to a file in the Nix store such as # Convert a path to a file in the Nix store such as
# /nix/store/<hash>-<name>/file to <hash>-<name>-<file>. # /nix/store/<hash>-<name>/file to <hash>-<name>-<file>.
@ -22,12 +32,12 @@ cleanName() {
echo "$path" | sed 's|^/nix/store/||' | sed 's|/|-|g' echo "$path" | sed 's|^/nix/store/||' | sed 's|/|-|g'
} }
# Copy a file from the Nix store to /boot/kernels. # Copy a file from the Nix store to $target/kernels.
declare -A filesCopied declare -A filesCopied
copyToKernelsDir() { copyToKernelsDir() {
local src="$1" local src="$1"
local dst="/boot/old/$(cleanName $src)" local dst="$target/old/$(cleanName $src)"
# Don't copy the file if $dst already exists. This means that we # Don't copy the file if $dst already exists. This means that we
# have to create $dst atomically to prevent partially copied # have to create $dst atomically to prevent partially copied
# kernels or initrd if this script is ever interrupted. # kernels or initrd if this script is ever interrupted.
@ -47,10 +57,10 @@ copyForced() {
mv $dst.tmp $dst mv $dst.tmp $dst
} }
outdir=/boot/old outdir=$target/old
mkdir -p $outdir || true mkdir -p $outdir || true
# Copy its kernel and initrd to /boot/kernels. # Copy its kernel and initrd to $target/old.
addEntry() { addEntry() {
local path="$1" local path="$1"
local generation="$2" local generation="$2"
@ -74,25 +84,25 @@ addEntry() {
echo $initrd > $outdir/$generation-initrd echo $initrd > $outdir/$generation-initrd
echo $kernel > $outdir/$generation-kernel echo $kernel > $outdir/$generation-kernel
if test $(readlink -f "$path") = "$default"; then if test "$generation" = "default"; then
if [ @version@ -eq 1 ]; then if [ @version@ -eq 1 ]; then
copyForced $kernel /boot/kernel.img copyForced $kernel $target/kernel.img
else else
copyForced $kernel /boot/kernel7.img copyForced $kernel $target/kernel7.img
fi fi
copyForced $initrd /boot/initrd copyForced $initrd $target/initrd
for dtb in $dtb_path/bcm*.dtb; do for dtb in $dtb_path/bcm*.dtb; do
dst="/boot/$(basename $dtb)" dst="$target/$(basename $dtb)"
copyForced $dtb "$dst" copyForced $dtb "$dst"
filesCopied[$dst]=1 filesCopied[$dst]=1
done done
cp "$(readlink -f "$path/init")" /boot/nixos-init cp "$(readlink -f "$path/init")" $target/nixos-init
echo "`cat $path/kernel-params` init=$path/init" >/boot/cmdline.txt echo "`cat $path/kernel-params` init=$path/init" >$target/cmdline.txt
echo "$2" > /boot/defaultgeneration
fi fi
} }
addEntry $default default
# Add all generations of the system profile to the menu, in reverse # Add all generations of the system profile to the menu, in reverse
# (most recent to least recent) order. # (most recent to least recent) order.
for generation in $( for generation in $(
@ -105,21 +115,21 @@ done
# Add the firmware files # Add the firmware files
fwdir=@firmware@/share/raspberrypi/boot/ fwdir=@firmware@/share/raspberrypi/boot/
copyForced $fwdir/bootcode.bin /boot/bootcode.bin copyForced $fwdir/bootcode.bin $target/bootcode.bin
copyForced $fwdir/fixup.dat /boot/fixup.dat copyForced $fwdir/fixup.dat $target/fixup.dat
copyForced $fwdir/fixup_cd.dat /boot/fixup_cd.dat copyForced $fwdir/fixup_cd.dat $target/fixup_cd.dat
copyForced $fwdir/fixup_db.dat /boot/fixup_db.dat copyForced $fwdir/fixup_db.dat $target/fixup_db.dat
copyForced $fwdir/fixup_x.dat /boot/fixup_x.dat copyForced $fwdir/fixup_x.dat $target/fixup_x.dat
copyForced $fwdir/start.elf /boot/start.elf copyForced $fwdir/start.elf $target/start.elf
copyForced $fwdir/start_cd.elf /boot/start_cd.elf copyForced $fwdir/start_cd.elf $target/start_cd.elf
copyForced $fwdir/start_db.elf /boot/start_db.elf copyForced $fwdir/start_db.elf $target/start_db.elf
copyForced $fwdir/start_x.elf /boot/start_x.elf copyForced $fwdir/start_x.elf $target/start_x.elf
# Add the config.txt # Add the config.txt
copyForced @configTxt@ /boot/config.txt copyForced @configTxt@ $target/config.txt
# Remove obsolete files from /boot and /boot/old. # Remove obsolete files from $target and $target/old.
for fn in /boot/old/*linux* /boot/old/*initrd-initrd* /boot/bcm*.dtb; do for fn in $target/old/*linux* $target/old/*initrd-initrd* $target/bcm*.dtb; do
if ! test "${filesCopied[$fn]}" = 1; then if ! test "${filesCopied[$fn]}" = 1; then
rm -vf -- "$fn" rm -vf -- "$fn"
fi fi

View File

@ -5,25 +5,16 @@ with lib;
let let
cfg = config.boot.loader.raspberryPi; cfg = config.boot.loader.raspberryPi;
builderGeneric = pkgs.substituteAll {
src = ./builder.sh;
isExecutable = true;
inherit (pkgs) bash;
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
firmware = pkgs.raspberrypifw;
version = cfg.version;
inherit configTxt;
};
inherit (pkgs.stdenv.hostPlatform) platform; inherit (pkgs.stdenv.hostPlatform) platform;
builderUboot = import ./builder_uboot.nix { inherit config; inherit pkgs; inherit configTxt; }; builderUboot = import ./builder_uboot.nix { inherit config pkgs configTxt; };
builderGeneric = import ./raspberrypi-builder.nix { inherit pkgs configTxt; inherit (cfg) version; };
builder = builder =
if cfg.uboot.enable then if cfg.uboot.enable then
"${builderUboot} -g ${toString cfg.uboot.configurationLimit} -t ${timeoutStr} -c" "${builderUboot} -g ${toString cfg.uboot.configurationLimit} -t ${timeoutStr} -c"
else else
builderGeneric; "${builderGeneric} -c";
blCfg = config.boot.loader; blCfg = config.boot.loader;
timeoutStr = if blCfg.timeout == null then "-1" else toString blCfg.timeout; timeoutStr = if blCfg.timeout == null then "-1" else toString blCfg.timeout;