{
  lib,
  stdenv,
  symlinkJoin,
  prismlauncher-unwrapped,
  wrapQtAppsHook,
  addOpenGLRunpath,
  qtbase, # needed for wrapQtAppsHook
  qtsvg,
  qtwayland,
  xorg,
  libpulseaudio,
  libGL,
  glfw,
  openal,
  jdk8,
  jdk17,
  gamemode,
  flite,
  mesa-demos,
  udev,
  libusb1,
  msaClientID ? null,
  gamemodeSupport ? stdenv.isLinux,
  textToSpeechSupport ? stdenv.isLinux,
  controllerSupport ? stdenv.isLinux,
  jdks ? [jdk17 jdk8],
  additionalLibs ? [],
  additionalPrograms ? [],
}: let
  prismlauncherFinal = prismlauncher-unwrapped.override {
    inherit msaClientID gamemodeSupport;
  };
in
  symlinkJoin {
    name = "prismlauncher-${prismlauncherFinal.version}";

    paths = [prismlauncherFinal];

    nativeBuildInputs = [
      wrapQtAppsHook
    ];

    buildInputs =
      [
        qtbase
        qtsvg
      ]
      ++ lib.optional (lib.versionAtLeast qtbase.version "6" && stdenv.isLinux) qtwayland;

    postBuild = ''
      wrapQtAppsHook
    '';

    qtWrapperArgs = let
      runtimeLibs =
        (with xorg; [
          libX11
          libXext
          libXcursor
          libXrandr
          libXxf86vm
        ])
        ++ [
          # lwjgl
          libpulseaudio
          libGL
          glfw
          openal
          stdenv.cc.cc.lib

          # oshi
          udev
        ]
        ++ lib.optional gamemodeSupport gamemode.lib
        ++ lib.optional textToSpeechSupport flite
        ++ lib.optional controllerSupport libusb1
        ++ additionalLibs;

      runtimePrograms =
        [
          xorg.xrandr
          mesa-demos # need glxinfo
        ]
        ++ additionalPrograms;
    in
      ["--prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks}"]
      ++ lib.optionals stdenv.isLinux [
        "--set LD_LIBRARY_PATH ${addOpenGLRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}"
        # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128
        "--prefix PATH : ${lib.makeBinPath runtimePrograms}"
      ];

    inherit (prismlauncherFinal) meta;
  }
