Add ib-tws on picard

This commit is contained in:
Andrea Ciceri 2025-01-31 14:39:32 +01:00
parent 6128c1a1e3
commit e92a899c87
Signed by: aciceri
SSH key fingerprint: SHA256:/AagBweyV4Hlfg9u092n8hbHwD5fcB6A3qhDiDA65Rg
3 changed files with 199 additions and 0 deletions

View file

@ -0,0 +1,4 @@
{ fleetFlake, pkgs, ... }:
{
home.packages = [ fleetFlake.packages.${pkgs.system}.ib-tws ];
}

View file

@ -93,6 +93,7 @@
"chirp"
"sdrangel"
"discord"
"ib-tws"
];
extraGroups = [ "plugdev" ];
backupPaths = [ ];

194
packages/ib-tws/default.nix Normal file
View file

@ -0,0 +1,194 @@
{
stdenv,
lib,
fetchurl,
makeDesktopItem,
copyDesktopItems,
libXxf86vm,
libX11,
libXext,
libXtst,
libXi,
libXrender,
glib,
libxml2,
ffmpeg,
libGL,
freetype,
fontconfig,
gtk3,
pango,
cairo,
alsa-lib,
atk,
gdk-pixbuf,
gtk2,
...
}:
let
rSubPaths = [
"lib/amd64/jli"
"lib/amd64/server"
"lib/amd64"
];
in
stdenv.mkDerivation rec {
pname = "ib-tws";
version = "10.33.1f";
etagHash = "f3ac044774c83917855f484a968c6ad2";
src = fetchurl {
url = "https://download2.interactivebrokers.com/installers/tws/latest-standalone/tws-latest-standalone-linux-x64.sh";
hash = "sha256-Iq4Bd5LTOajfK3IaomeAZL182lEXkCn7JjEO6UWgdFE=";
};
phases = [
"unpackPhase"
"installPhase"
"fixupPhase"
];
nativeBuildInputs = [ copyDesktopItems ];
desktopItems = [
(makeDesktopItem {
name = pname;
desktopName = "IB Trader Workstation";
exec = pname;
icon = pname;
categories = [
"Office"
"Finance"
];
startupWMClass = "jclient-LoginFrame";
})
(makeDesktopItem {
name = "ib-gw";
desktopName = "IB Gateway";
exec = "ib-gw";
icon = pname;
categories = [
"Office"
"Finance"
];
startupWMClass = "ibgateway-GWClient";
})
];
unpackPhase = ''
echo "Unpacking I4J sfx sh to $PWD..."
INSTALL4J_TEMP="$PWD" sh "$src" __i4j_extract_and_exit
# JRE
jrePath="$out/share/${pname}/jre"
echo "Unpacking JRE to $jrePath..."
mkdir -p "$jrePath"
tar -xf "$PWD/"*.dir/jre.tar.gz -C "$jrePath/"
echo "Patching JRE executables..."
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
"$jrePath/bin/java" "$jrePath/bin/unpack200"
echo "Unpacking JRE pack files..."
for f in "$jrePath/lib/"*.jar.pack "$jrePath/lib/ext/"*.jar.pack; do
jar_file=`echo "$f" | awk '{ print substr($0,1,length($0)-5) }'`
"$jrePath/bin/unpack200" -r "$f" "$jar_file"
[ $? -ne 0 ] && echo "Error unpacking $f" && exit 1
done
echo "Unpacking TWS payload..."
INSTALL4J_JAVA_HOME_OVERRIDE="$jrePath" sh "$src" -q -dir "$PWD/"
'';
installPhase = ''
runHook preInstall
# create main startup script
mkdir -p "$out/bin"
cat<<EOF > "$out/bin/${pname}"
#!$SHELL
# get script name
PROG=\$(basename "\$0")
# Load system-wide settings and per-user overrides
IB_CONFIG_DIR="\$HOME/.\$PROG"
JAVA_GC="-Xmx4G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70"
JAVA_UI_FLAGS="-Dswing.aatext=TRUE -Dawt.useSystemAAFontSettings=on -Dsun.awt.nopixfmt=true -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true"
JAVA_LOCALE_FLAGS="-Dsun.locale.formatasdefault=true"
JAVA_FLAGS="\$JAVA_GC \$JAVA_UI_FLAGS \$JAVA_LOCALE_FLAGS \$JAVA_EXTRA_FLAGS"
[ -f "\$HOME/.config/\$PROG.conf" ] && . "\$HOME/.config/\$PROG.conf"
CLASS="jclient.LoginFrame"
[ "\$PROG" = "ib-gw" ] && CLASS="ibgateway.GWClient"
cd "$out/share/${pname}/jars"
"$out/share/${pname}/jre/bin/java" -cp \* \$JAVA_FLAGS \$CLASS \$IB_CONFIG_DIR
EOF
chmod u+x $out/bin/${pname}
# create symlink for the gateway
ln -s "${pname}" "$out/bin/ib-gw"
# copy files
mkdir -p $out/share/${pname}
cp -R jars $out/share/${pname}
install -Dm644 .install4j/tws.png $out/share/pixmaps/${pname}.png
runHook postInstall
'';
dontPatchELF = true;
dontStrip = true;
postFixup = ''
rpath+="''${rpath:+:}${lib.concatStringsSep ":" (map (a: "$jrePath/${a}") rSubPaths)}"
# set all the dynamic linkers
find $out -type f -perm -0100 \
-exec patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
--set-rpath "$rpath" {} \;
find $out -name "*.so" -exec patchelf --set-rpath "$rpath" {} \;
'';
rpath = lib.strings.makeLibraryPath libraries;
libraries = [
stdenv.cc
stdenv.cc.libc
glib
libxml2
ffmpeg
libGL
libXxf86vm
alsa-lib
fontconfig
freetype
pango
gtk3
cairo
gdk-pixbuf
atk
libX11
libXext
libXtst
libXi
libXrender
gtk2
];
# possibly missing libgdk-x11-2.0.so.0, from gtk2? never caused any trouble though
passthru.updateScript = ./update.sh;
meta = with lib; {
description = "Trader Work Station of Interactive Brokers";
homepage = "https://www.interactivebrokers.com";
# license = licenses.unfree;
maintainers = lib.optionals (maintainers ? k3a) [ maintainers.k3a ];
platforms = [ "x86_64-linux" ];
};
}