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).