{
  lib,
  symlinkJoin,
  makeWrapper,
  gimpPlugins,
  gnome-themes-extra,
  plugins ? null,
}:

let
  inherit (gimpPlugins) gimp;
  allPlugins = lib.filter (pkg: lib.isDerivation pkg && !pkg.meta.broken or false) (
    lib.attrValues gimpPlugins
  );
  selectedPlugins = lib.filter (pkg: pkg != gimp) (if plugins == null then allPlugins else plugins);
  extraArgs =
    map (x: x.wrapArgs or "") selectedPlugins
    ++ lib.optionals (gimp.apiVersion == "2.0") [
      ''--prefix GTK_PATH : "${gnome-themes-extra}/lib/gtk-2.0"''
    ];
  majorVersion = lib.versions.major gimp.version;

in
symlinkJoin {
  pname = "gimp-with-plugins";
  inherit (gimp) version;

  outputs = [
    "out"
    "man"
  ];

  paths = [ gimp ] ++ selectedPlugins;

  nativeBuildInputs = [ makeWrapper ];

  postBuild = ''
    for each in gimp-${gimp.appVersion} gimp-console-${gimp.appVersion}; do
      wrapProgram $out/bin/$each \
        --set GIMP${majorVersion}_PLUGINDIR "$out/${gimp.targetLibDir}" \
        --set GIMP${majorVersion}_DATADIR "$out/${gimp.targetDataDir}" \
        ${toString extraArgs}
    done
    set +x
    for each in gimp gimp-console; do
      ln -sf "$each-${gimp.appVersion}" $out/bin/$each
    done

    ln -s ${gimp.man} $man
  '';

  meta = gimp.meta // {
    description = "${gimp.meta.description} with plugins";
    longDescription = ''
      Plugins:

      ${lib.concatMapStringsSep "\n" (p: "- ${p.pname}") selectedPlugins}
    '';
  };
}
