{ lib, stdenv, writeScript, ncurses5, callPackage, buildFHSEnv, unwrapped ? callPackage ./runtime.nix {} }:

buildFHSEnv rec {
  name = "houdini-${unwrapped.version}";

  # houdini spawns hserver (and other license tools) that is supposed to live beyond the lifespan of houdini process
  dieWithParent = false;

  # houdini needs to communicate with hserver process that it seem to be checking to be present in running processes
  unsharePid = false;

  targetPkgs = pkgs: with pkgs; [
    libGLU
    libGL
    alsa-lib
    fontconfig
    zlib
    libpng
    dbus
    nss
    nspr
    expat
    pciutils
    libxkbcommon
    libudev0-shim
    tbb
    xwayland
    qt5.qtwayland
    nettools  # needed by licensing tools
    bintools  # needed for ld and other tools, so ctypes can find/load sos from python
    ocl-icd  # needed for opencl
    numactl  # needed by hfs ocl backend
    zstd  # needed from 20.0
  ] ++ (with xorg; [
    libICE
    libSM
    libXmu
    libXi
    libXt
    libXext
    libX11
    libXrender
    libXcursor
    libXfixes
    libXrender
    libXcomposite
    libXdamage
    libXtst
    libxcb
    libXScrnSaver
    libXrandr
    libxcb
    xcbutil
    xcbutilimage
    xcbutilrenderutil
    xcbutilcursor
    xcbutilkeysyms
    xcbutilwm
  ]);

  passthru = {
    inherit unwrapped;
  };

  extraInstallCommands = let
    executables = [
      "bin/houdini"  # houdini flavours
      "bin/houdinicore"
      "bin/houdinifx"
      "bin/hgpuinfo"  # houdini ocl config tool
      "bin/hotl"  # hda/otl manipulation tool
      "bin/hython"  # hython
      "bin/hkey"  # license administration
      "bin/husk"  # hydra rendereing tool
      "bin/mantra"  # mantra renderer
      "houdini/sbin/sesinetd"
    ];
  in ''
    WRAPPER=$out/bin/${name}
    EXECUTABLES="${lib.concatStringsSep " " executables}"
    for executable in $EXECUTABLES; do
      mkdir -p $out/$(dirname $executable)

      echo "#!${stdenv.shell}" >> $out/$executable
      echo "exec $WRAPPER ${unwrapped}/$executable \"\$@\"" >> $out/$executable
    done

    cd $out
    chmod +x $EXECUTABLES
  '';

  extraBwrapArgs = [
    "--ro-bind-try /run/opengl-driver/etc/OpenCL/vendors /etc/OpenCL/vendors"  # this is the case of NixOS
    "--ro-bind-try /etc/OpenCL/vendors /etc/OpenCL/vendors"  # this is the case of not NixOS
  ];

  runScript = writeScript "${name}-wrapper" ''
    # ncurses5 is needed by hfs ocl backend
    # workaround for this issue: https://github.com/NixOS/nixpkgs/issues/89769
    export LD_LIBRARY_PATH=${lib.makeLibraryPath [ncurses5]}:$LD_LIBRARY_PATH
    exec "$@"
  '';

  meta = {
    description = "3D animation application software";
    homepage = "https://www.sidefx.com";
    license = lib.licenses.unfree;
    platforms = [ "x86_64-linux" ];
    mainProgram = "houdini";
    hydraPlatforms = [ ]; # requireFile src's should be excluded
    maintainers = with lib.maintainers; [ canndrew kwohlfahrt pedohorse ];
  };
}
