# To build, use:
# nix-build nixos -I nixos-config=nixos/modules/installer/sd-card/sd-image-powerpc64le.nix -A config.system.build.sdImage
{ config, lib, pkgs, ... }:

{
  imports = [
    ../../profiles/base.nix
    ../../profiles/installation-device.nix
    ./sd-image.nix
  ];

  boot.loader = {
    # powerpc64le-linux typically uses petitboot
    grub.enable = false;
    generic-extlinux-compatible = {
      # petitboot is not does not support all of the extlinux extensions to
      # syslinux, but its parser is very forgiving; it essentially ignores
      # whatever it doesn't understand.  See below for a filename adjustment.
      enable = true;
    };
  };

  boot.consoleLogLevel = lib.mkDefault 7;
  boot.kernelParams = [ "console=hvc0" ];

  sdImage = {
    populateFirmwareCommands = "";
    populateRootCommands = ''
      mkdir -p ./files/boot
      ${config.boot.loader.generic-extlinux-compatible.populateCmd} \
        -c ${config.system.build.toplevel} \
        -d ./files/boot
    ''
    # https://github.com/open-power/petitboot/blob/master/discover/syslinux-parser.c
    # petitboot will look in these paths (plus all-caps versions of them):
    #  /boot/syslinux/syslinux.cfg
    #  /syslinux/syslinux.cfg
    #  /syslinux.cfg
    + ''
      mv ./files/boot/extlinux ./files/boot/syslinux
      mv ./files/boot/syslinux/extlinux.conf ./files/boot/syslinux/syslinux.cfg
    ''
    # petitboot does not support relative paths for LINUX or INITRD; it prepends
    # a `/` when parsing these fields
    + ''
      sed -i 's_^\(\W\W*\(INITRD\|initrd\|LINUX\|linux\)\W\)\.\./_\1/boot/_' ./files/boot/syslinux/syslinux.cfg
    '';
  };
}
