{
  lib,
  pkgs,
  ...
}: let
  name = "mcuxpressoide";
  version = "24.9.25";
  description = "MCUXpresso IDE";
  filename = "${name}-${version}.x86_64.deb";
  mcuxpressoideSrc = pkgs.stdenv.mkDerivation {
    inherit version description;
    name = "${name}-src";
    src = pkgs.requireFile {
      url = "https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE";
      name = "${filename}.bin";
      hash = "sha256-e3g7rzZQ1WFLcUakkjaufpHMtw3qkw5lwxJuCKs6L+k=";
    };
    nativeBuildInputs = [pkgs.makeWrapper];

    buildCommand = ''
      # Unpack tarball.
      mkdir -p deb
      sh $src --target deb || true
      ar -xv deb/${filename}
      tar xfvz data.tar.gz -C .

      # Unpack LinkServer.
      mkdir -p linkserver
      sh deb/LinkServer_24.9.75.x86_64.deb.bin --target deb/linkserver || true
      ar -xv deb/linkserver/LPCScrypt.deb
      tar xfvz data.tar.gz -C linkserver
      ar -xv deb/linkserver/MCU-Link.deb
      tar xfvz data.tar.gz -C linkserver
      ar -xv deb/linkserver/LinkServer_24.9.75.x86_64.deb
      tar xfvz data.tar.gz -C linkserver

      mkdir -p ./final/eclipse
      mv ./usr/local/${name}-${version}/ide/* ./usr/local/${name}-${version}/ide/.* final/eclipse
      mv final/eclipse/mcuxpressoide final/eclipse/eclipse
      mv final/eclipse/mcuxpressoide.ini final/eclipse/eclipse.ini

      # Create custom .eclipseproduct file
      rm final/eclipse/.eclipseproduct
      echo "name=${name}
      id=com.nxp.${name}
      version=${version}
      " > final/eclipse/.eclipseproduct
      # Install udev rules
      mkdir -p final/lib/udev/rules.d
      mv ./lib/udev/rules.d/56-pemicro.rules ./lib/udev/rules.d/85-mcuxpresso.rules final/lib/udev/rules.d/

      # Additional files
      mv ./usr/local/${name}-${version}/mcu_data final/mcu_data

      # Place LinkServer, lpcscrypt, and MCU-LINK_installer in /usr/local
      mkdir -p ./final/usr/local
      mv ./linkserver/usr/local/LinkServer_24.9.75 ./final/usr/local
      mv ./linkserver/usr/local/lpcscrypt-2.1.3_83 ./final/usr/local
      mv ./linkserver/usr/local/MCU-LINK_installer_3.148 ./final/usr/local

      # Install LinkServer udev rules
      mv ./linkserver/lib/udev/rules.d/{85-linkserver_24.9.75.rules,85-mcu-link_3.148.rules,99-lpcscrypt.rules} final/lib/udev/rules.d

      cd ./final

      tar -czf $out ./
    '';
  };
  mcuxpressoide = pkgs.eclipses.buildEclipse {
    name = "mcuxpresso-eclipse";
    inherit description;
    src = mcuxpressoideSrc;
  };

  # needed because of the integrated toolchain
  mcuxpressoFhsEnv = pkgs.buildFHSEnv {
    name = "mcuxpresso-env";
    targetPkgs = pkgs: [
      pkgs.dfu-util
      pkgs.stdenv.cc.cc.lib
      pkgs.gcc
      pkgs.libgcc
      pkgs.xorg.libXext
      pkgs.xorg.libX11
      pkgs.xorg.libXrender
      pkgs.xorg.libXtst
      pkgs.xorg.libXi
      pkgs.freetype
      pkgs.alsa-lib
      pkgs.ncurses
      pkgs.ncurses5
      pkgs.libusb1
      pkgs.readline
      pkgs.libffi
      pkgs.zlib
      pkgs.tcl
      pkgs.libxcrypt
      pkgs.libxcrypt-legacy
      pkgs.libusb-compat-0_1
      pkgs.xorg.libxcb
      pkgs.python3
      pkgs.usbutils
      pkgs.libuuid
      pkgs.libudev-zero
    ];
    profile = ''
      export LD_LIBRARY_PATH=${lib.makeLibraryPath [pkgs.ncurses5 pkgs.ncurses]}:$LD_LIBRARY_PATH
    '';

    extraBuildCommands = ''
      # Ensure necessary directories exist
      mkdir -p $out/usr/local/LinkServer_24.9.75/lpcscrypt $out/usr/local/LinkServer_24.9.75/MCU-LINK_installer

      cp -r ${mcuxpressoide}/usr/local/LinkServer_24.9.75/* $out/usr/local/LinkServer_24.9.75
      cp -r ${mcuxpressoide}/usr/local/lpcscrypt-2.1.3_83/* $out/usr/local/LinkServer_24.9.75/lpcscrypt
      cp -r ${mcuxpressoide}/usr/local/MCU-LINK_installer_3.148/* $out/usr/local/LinkServer_24.9.75/MCU-LINK_installer
    '';
    runScript = "${mcuxpressoide}/bin/eclipse";
  };
in
  pkgs.stdenv.mkDerivation {
    inherit name version description;
    dontUnpack = true;
    dontConfigure = true;
    dontBuild = true;
    nativeBuildInputs = [pkgs.copyDesktopItems];
    desktopItems = [
      (pkgs.makeDesktopItem {
        inherit name;
        type = "Application";
        desktopName = "MCUXpresso IDE";
        exec = "mcuxpresso";
      })
    ];

    installPhase = ''
       runHook preInstall

       # Create necessary directories
       mkdir -p $out/lib/udev/rules.d
       mkdir -p $out/bin $out/eclipse $out/mcu_data

       # Copy udev rules
       cp ${mcuxpressoide}/lib/udev/rules.d/85-mcuxpresso.rules ${mcuxpressoide}/lib/udev/rules.d/56-pemicro.rules $out/lib/udev/rules.d/

       # Copy full installation
       cp -r ${mcuxpressoide}/eclipse $out/eclipse
       cp -r ${mcuxpressoide}/mcu_data $out/mcu_data

       # Create symlink for the environment
       ln -s ${mcuxpressoFhsEnv}/bin/mcuxpresso-env $out/bin/mcuxpresso

      runHook postInstall
    '';
  }