raspberrypi-bootloader: allow specification of target directory
This commit is contained in:
parent
73f796aa62
commit
bcb9e17bba
@ -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;
|
||||||
|
}
|
@ -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
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user