{
  runCommand,
  gdk-pixbuf,
  lib,
  stdenv,
  buildPackages,
}:

{
  extraLoaders,
}:

let
  # Get packages to generate the cache for. We always include gdk-pixbuf.
  loaderPackages = [
    gdk-pixbuf
  ]
  ++ extraLoaders;
in

# Generate the cache file by running gdk-pixbuf-query-loaders for each
# package and concatenating the results.
runCommand "gdk-pixbuf-loaders.cache"
  {
    preferLocalBuild = true;
  }
  ''
    (
      for package in ${lib.escapeShellArgs loaderPackages}; do
        module_dir="$package/${gdk-pixbuf.moduleDir}"
        if [[ ! -d "$module_dir" ]]; then
          echo "Error: gdkPixbufCacheBuilder: Passed package “''${package}” does not contain GdkPixbuf loaders in “${gdk-pixbuf.moduleDir}”." 1>&2
          exit 1
        fi
        GDK_PIXBUF_MODULEDIR="$module_dir" \
          ${stdenv.hostPlatform.emulator buildPackages} ${gdk-pixbuf.dev}/bin/gdk-pixbuf-query-loaders
      done
    ) > "$out"
  ''
