Missing swt-pi4?

Hi all, I’m getting a similar error to Java SWT app doesn't work. Missing library, but the methods mentioned there don’t appear to be fixing the problem.

I’m trying to package some proprietary stm32 IDE for nixos, but I’m running into this error:

!SESSION 2025-03-06 18:42:05.933 -----------------------------------------------
eclipse.buildId=Version 1.18.0
java.version=23.0.1
java.vendor=N/A
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_GB
Command-line arguments:  -os linux -ws gtk -arch x86_64

!ENTRY org.eclipse.osgi 4 0 2025-03-06 18:42:07.770
!MESSAGE Application error
!STACK 1
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
	no swt-pi4-gtk-4966r5 in java.library.path: /nix/store/rhh2jbnh6k7fq11pdsy9ymzxm5bcgaab-swt-4.33/lib
	no swt-pi4-gtk in java.library.path: /nix/store/rhh2jbnh6k7fq11pdsy9ymzxm5bcgaab-swt-4.33/lib
	no swt-pi4 in java.library.path: /nix/store/rhh2jbnh6k7fq11pdsy9ymzxm5bcgaab-swt-4.33/lib
	Can't load library: /home/user/.swt/lib/linux/x86_64/libswt-pi4-gtk-4966r5.so
	Can't load library: /home/user/.swt/lib/linux/x86_64/libswt-pi4-gtk.so
	Can't load library: /home/user/.swt/lib/linux/x86_64/libswt-pi4.so

	at org.eclipse.swt.internal.Library.loadLibrary(Library.java:345)
	at org.eclipse.swt.internal.Library.loadLibrary(Library.java:254)
	at org.eclipse.swt.internal.gtk.OS.<clinit>(OS.java:97)
	at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:209)
	at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:155)
	at org.eclipse.swt.widgets.Display.<clinit>(Display.java:170)
	at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:721)
	at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:185)
	at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay(IDEApplication.java:182)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:125)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:208)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:143)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:109)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:439)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:271)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:668)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:605)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1481)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1454)

My packaging script looks like this:

 { pkgs ? import <nixpkgs> { system = builtins.currentSystem; }
, stdenv ? pkgs.stdenv
, lib ? pkgs.lib
, fetchurl ? pkgs.fetchurl
, autoPatchelfHook ? pkgs.autoPatchelfHook
}:
stdenv.mkDerivation rec {
  pname = "stm32cubeide";
  version = "1.18.0";

  src = fetchurl {
    url = "http://localhost:4444/stm32cubeide-v${version}.tar.gz";
    hash = "sha256-8TpSFDY1sCJuaTebbW4jlIwy35KpQGRK3jqCq8uw9eQ=";
  };

  nativeBuildInputs = [
    autoPatchelfHook
  ];

  buildInputs = [
    pkgs.libusb1
    pkgs.ffmpeg
    pkgs.gtk3
    pkgs.gtk3-x11
    pkgs.ncurses5
    stdenv.cc.cc
    pkgs.glibc
    pkgs.gcc-unwrapped
    pkgs.kdePackages.qtbase
    pkgs.kdePackages.qtwayland
    pkgs.pcsclite
    pkgs.xercesc
    pkgs.krb5
    pkgs.jdk23
    pkgs.swt
  ] ++ (with pkgs.xorg; [
      libX11
      libXcursor
      libXext
      libXft
      libXi
      libXrandr
      libXrender
      libXtst
      libXxf86vm
      libSM
      xcbutilimage
      xcbutilwm
      xcbutilimage
      xcbutilrenderutil
      xcbutilkeysyms
      xcbutil
  ]);

  sourceRoot = ".";

  # I think this is correct
  dontWrapQtApps = true;

  installPhase = ''
    runHook preInstall
    install -D bin/stlink-server $out/bin/stlink-server

    mkdir -p $out/etc/st
    # remove old JRE
    rm -rf cubeide/plugins/com.st.stm32cube.ide.jre.linux64_3.4.0.202409160955/
    # overwrite JRE search path and apply some other patches to stm23cubeide.ini (aka eclipse.ini)
    sed -i 's|plugins/com.st.stm32cube.ide.jre.*|${pkgs.jdk23}/bin|g' cubeide/stm32cubeide.ini
    # add swt to java library path (see https://github.com/NixOS/nixpkgs/issues/30826#issuecomment-533226324)
    echo '-Djava.library.path=${pkgs.swt}/lib' >> cubeide/stm32cubeide.ini
    # also add swt jar to cp (class search path)
    # this completely breaks it
    #echo '-cp "$out/etc/st/stm32cubeide_1.18.0/plugins/:${pkgs.swt}/jars/swt.jar"' >>  cubeide/stm32cubeide.ini
    cp -r cubeide $out/etc/st/stm32cubeide_${version}
    ln -s $out/etc/st/stm32cubeide_${version}/stm32cubeide $out/bin/stm32cubeide

    install -D -t $out/etc/udev/rules.d/ udev/*.rules
    runHook postInstall
  '';

  # patch the plugins using patchelf (this is the most frustraiting part)
  postFixup = ''
    autoPatchelf $out/etc/st/stm32cubeide_${version}/plugins/
  '';

  meta = with lib; {
    homepage = "https://studio-link.com";
    description = "STM32 CubeIDE";
    platforms = platforms.linux;
  };
  # include using (callPackage /home/anton/uni/stm32/stm32cubeide.nix {})
}

(this is my first time packaging something for Nix, so am new to this).

I tried to apply the methods mentioned above, but when I put the -cp in the ini file, it completely fails to start (as opposed to previously generating the error message above).

I applied the full fix (including adding the -cp option), my ini looks like this:

$ cat /nix/store/x1jsyjkvvypxsmsfg8a6gkanpqraiap2-stm32cubeide-1.18.0/etc/st/stm32cubeide_1.18.0/stm32cubeide.ini
-startup
plugins/org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.2.1100.v20240722-2106
--launcher.defaultAction
openFile
-vm
/nix/store/21j17n0bvs77s4l03xnw5mx70dranl68-openjdk-23.0.1+11/bin
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Dosgi.instance.area.default=@user.home/STM32CubeIDE/workspace_1.18.0
-Declipse.buildId=Version 1.18.0
-DproductMaturityGrade=mm
-Djdk.http.auth.tunneling.disabledSchemes=
-XX:+UseG1GC
-XX:+UseStringDeduplication
-Xms256m
-Xmx1024m
-Djava.library.path=/nix/store/rhh2jbnh6k7fq11pdsy9ymzxm5bcgaab-swt-4.33/lib
-cp
"/nix/store/rhh2jbnh6k7fq11pdsy9ymzxm5bcgaab-swt-4.33/jars/swt.jar"

I am still getting the same error though :frowning:

Sidenote: I was scared to find that something had created the folder in /home/user/.swt and placed a shared object in it:

/home/user/.swt/
└── lib
    └── linux
        └── x86_64
            └── libswt-pi3-gtk-4966r5.so