mradke
May 21, 2021, 12:35pm
1
I’m trying to wrap TablePlus - which is a commercial database management tool - as a nix package from the provided *.deb package.
The current nix expression I came up with looks like this:
let
pkgs = import <nixpkgs> {};
tableplus = pkgs.stdenv.mkDerivation {
name = "TablePlus";
src = pkgs.fetchurl {
url = "https://deb.tableplus.com/debian/pool/main/t/tableplus/tableplus_0.1.84_amd64.deb";
sha256 = "01bfrv91hrigq5rni9vignlnhfr33zwhya5nivqi545cjmqfrv2w";
};
sourceRoot = "opt/tableplus";
unpackPhase = ''
runHook preUnpack
dpkg-deb -x $src .
runHook postUnpack
'';
installPhase = ''
runHook preInstall
ls -la
mkdir -p "$out/bin"
mkdir -p "$out/resource"
cp -R "tableplus" "$out/bin/tableplus"
cp -R "resource/" "$out/resource"
chmod -R g-w "$out"
# # Desktop file
# mkdir -p "$out/share/applications"
# cp "$desktopItem}/share/applications/"* "$out/share/applications"
runHook postInstall
'';
nativeBuildInputs = with pkgs; [
autoPatchelfHook
dpkg
makeWrapper
wrapGAppsHook
];
buildInputs = with pkgs; [
stdenv.cc.cc.lib
libgee
json-glib
openldap
gtksourceview4
gnome.libsecret
gnome.gtksourceview
];
};
in with pkgs;
stdenv.mkDerivation {
name = "testproj";
buildInputs = [
tableplus
];
nativeBuildInputs = [
];
shellHook = ''
echo ${tableplus}
'';
}
Packaging and installing seems to work but when I run ${tableplus}/bin/tableplus
I’ll get ${tableplus}/bin/tableplus: /nix/store/7ndx3pmvfpc8mxw9aqm2vxpq8jylvqdc-openldap-2.4.58/lib/libldap_r-2.4.so.2: no version information available (required by ${tableplus}/bin/tableplus}
.
Any pointers on what I’m doing wrong here?
2 Likes
mradke
August 12, 2021, 6:42pm
2
Huh… strange. I tried it again and now it seems to be working
1 Like
Nover
February 18, 2022, 9:19am
3
I also tried to package it. It appears that TablePlus is asking for librairies that Nix cannot currently propose. Here is the package I made.
{ lib
, stdenv
, autoPatchelfHook
, dpkg
, libsecret
, libgee
, glib
, gtksourceview
, cairo
, gdk-pixbuf
, pango
, openldap
, cyrus_sasl
, libkrb5
}:
stdenv.mkDerivation rec {
pname = "table-plus";
version = "0.1.178";
src = builtins.fetchurl {
url = "https://deb.tableplus.com/debian/21/pool/main/t/tableplus/tableplus_${version}_amd64.deb";
# sha265 = "";
};
nativeBuildInputs = [ autoPatchelfHook dpkg ];
buildInputs = [
stdenv.cc.cc.lib
libsecret
libgee
glib
gtksourceview
cairo
gdk-pixbuf
pango
openldap
cyrus_sasl
libkrb5
];
unpackPhase = ''
mkdir pkg
dpkg-deb -x $src pkg
sourceRoot=pkg
'';
installPhase = ''
mkdir -p $out/{bin,share,lib}
mv opt/tableplus/* $out/share
ln -s $out/share/tableplus $out/bin/tableplus
# Fix libraries
ln -s ${openldap}/lib/libldap-2.4.so.2 $out/lib/libldap-2.5.so.0
ln -s ${cyrus_sasl.out}/lib/libsasl2.so.3 $out/lib/libsasl2.so.2
mkdir -p $out/share/applications
mv $out/share/tableplus.desktop $out/share/applications
substituteInPlace $out/share/applications/tableplus.desktop \
--replace "/usr/local/bin/tableplus" "tableplus" \
--replace "/opt/tableplus/resource/image/logo.png" "$out/share/resource/image/logo.png"
'';
}
See the trick for the librairies ? Well, it does not work obviously! Starting table plus with this dirty trick gives
./result/bin/tableplus: /nix/store/gvz8284pg2vnvhgirb84pf5shznh12k6-table-plus-0.1.178/lib/libldap-2.5.so.0: no version information available (required by ./result/bin/tableplus)
./result/bin/tableplus: /nix/store/gvz8284pg2vnvhgirb84pf5shznh12k6-table-plus-0.1.178/lib/libsasl2.so.2: no version information available (required by ./result/bin/tableplus)
./result/bin/tableplus: /nix/store/s9qbqh7gzacs7h68b2jfmn9l6q4jwfjz-glibc-2.33-59/lib/libc.so.6: version `GLIBC_2.34' not found (required by ./result/bin/tableplus)
Sadly, I’m not skilled enough to fix that on my own. For me
cyrus_sasl
does not provide libsasl2.so.2
openldap
does not provide libldap-2.5.so.0
(current version: 2.4)
Glibc is not recent enough to support at least the version 2.34 (current version: 2.33)
3 Likes
I found a way to make tableplus work by rebuilding libldap
and libsasl
from the debian package. Keep in mind I am new to nix, this solution may be improved on:
let
pkgs = import <nixpkgs> {};
in pkgs.stdenv.mkDerivation {
name = "TablePlus";
libldapSrc = pkgs.fetchurl {
url = "http://ftp.de.debian.org/debian/pool/main/o/openldap/libldap-2.5-0_2.5.13+dfsg-2+b1_amd64.deb";
sha256 = "ifecgulBnb0gtBXnYQEJy03k/Cy3UPEIkgnukZ9SG+g=";
};
libsaslSrc = pkgs.fetchurl {
url = "http://archive.ubuntu.com/ubuntu/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2_amd64.deb";
sha256 = "3OguEgUoKpB8lvlzUItzB7imn6Td46+Sl+YCFXM/LTA=";
};
tableplusSrc = pkgs.fetchurl {
url = "https://deb.tableplus.com/debian/21/pool/main/t/tableplus/tableplus_0.1.192_amd64.deb";
sha256 = "SOsmjW6CGx28S3P4TaJ2kFdRXX+qR+7as9wiYqorAFA=";
};
unpackPhase = ''
runHook preUnpack
dpkg-deb -x $tableplusSrc tableplus
dpkg-deb -x $libldapSrc libldap
dpkg-deb -x $libsaslSrc libsasl
runHook postUnpack
'';
installPhase = ''
runHook preInstall
mkdir -p "$out/lib"
mkdir -p "$out/bin"
mkdir -p "$out/resource"
# deps
cp -R libldap/usr/lib/x86_64-linux-gnu/* "$out/lib/"
cp -R libsasl/usr/lib/x86_64-linux-gnu/* "$out/lib/"
# tableplus
cp -R "tableplus/opt/tableplus/tableplus" "$out/bin/tableplus"
cp -R "tableplus/opt/tableplus/resource/" "$out/resource"
chmod -R g-w "$out"
# # Desktop file
# mkdir -p "$out/share/applications"
#cp "$desktopItem}/share/applications/"* "$out/share/applications"
runHook postInstall
'';
nativeBuildInputs = with pkgs; [
autoPatchelfHook
dpkg
makeWrapper
wrapGAppsHook
];
buildInputs = with pkgs; [
gtksourceview
gtksourceview4
json-glib
libgee
libkrb5
libsecret
openldap
stdenv.cc.cc.lib
];
meta = with pkgs.stdenv.lib; {
description = "Tableplus";
homepage = https://tableplus.com/;
platforms = [ "x86_64-linux" ];
};
}
1 Like