summaryrefslogtreecommitdiff
path: root/trivionomicon/pkgs/ibkr-tws/default.nix
blob: ea3e94ba927dc4e8c449db85b63ecbae0134ab9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
{
  lib,
  makeWrapper,
  openjdk,
  requireFile,
  stdenv,
}: let
  version = "10.44.1g";

  jdk = openjdk.override {
    enableJavaFX = true;
  };

  removeJavaVersionCheck = file: ''
    # Lie about the openjdk version to skip the version check
    sed -i 's/\(read_db_entry || create_db_entry \$2\)/\1; ver_major=17; ver_minor=0; ver_micro=16/' ${file}
  '';
in
  stdenv.mkDerivation {
    pname = "ibkr-tws";
    inherit version;

    src = requireFile {
      name = "tws-${version}-standalone-linux-x64.sh";
      url = "https://www.interactivebrokers.com/en/trading/download-tws.php?p=offline-latest";

      # 1. Rename 'tws-latest-standalone-linux-x64.sh' to 'tws-${version}-standalone-linux-x64.sh'
      # 2. nix hash convert --hash-algo sha256 --from base16 --to sri $(sha256sum tws-${version}-standalone-linux-x64.sh | cut -d' ' -f1)
      hash = "sha256-UfyfTHOcPiwTof0ZMhV1haX7gyb08v7U2A12VjAny7c=";
    };

    nativeBuildInputs = [
      makeWrapper
    ];

    unpackPhase = ''
      runHook preUnpack

      cp $src bundle.sh
      chmod +x bundle.sh

      runHook postUnpack
    '';

    patchPhase = ''
      runHook prePatch

      ${removeJavaVersionCheck "bundle.sh"}

      runHook postPatch
    '';

    preBuild = ''
      export INSTALL4J_NO_DB=true
      export INSTALL4J_JAVA_HOME=${jdk}
      export INSTALL4J_DISABLE_BUNDLED_JRE=true
    '';

    buildPhase = ''
      runHook preBuild

      # Where should Trader Workstation 10.44 be installed?: $out
      # Run Trader Workstation 10.44? Yes [y], No [n, Enter]: n
      echo -e "$out/lib/tws\nn" | ./bundle.sh

      runHook postBuild
    '';

    installPhase = ''
      runHook preInstall

      mkdir -p "$out/bin" "$out/share/applications"

      ${removeJavaVersionCheck "$out/lib/tws/tws"}
      makeWrapper \
          "$out/lib/tws/tws" "$out/bin/tws" \
          --set INSTALL4J_NO_DB true \
          --set INSTALL4J_JAVA_HOME ${jdk}

      mv "$out/lib/tws/.install4j/tws.png" "$out/lib/tws"

      for path in $out/lib/tws/*.desktop; do
          target="$(readlink -f "$path")"
          mv "$target" "$out/share/applications/$(basename "$path")"
          rm -f "$path"
      done

      sed -i \
         's@$out/lib/tws/tws\>@$out/bin/tws@; s@$out/lib/tws/.install4j/tws.png@$out/lib/tws/tws.png@' \
         $out/share/applications/*.desktop

      #TODO
      sed -i \
         's@/build/Jts@/tmp/Jts@g' \
         $out/lib/tws/.install4j/{i4jparams.conf,response.varfile}

      rm -f "$out/lib/tws/uninstall" $out/lib/tws/.install4j/*.log

      runHook postInstall
    '';

    meta = {
      license = lib.licenses.unfree;
      mainProgram = "tws";
    };
  }