{ cmake, lib, fetchzip, intel-decimalfp, pkg-config, protobuf, python3Packages, stdenv, }: let version = "1044.01"; src-with-protobuf = stdenv.mkDerivation { pname = "ibkr-tws-api-src"; inherit version; src = fetchzip { url = "https://interactivebrokers.github.io/downloads/twsapi_macunix.${version}.zip"; hash = "sha256-9bi2Mgp3qDHz8R2lrXEOYIeBffRKOWqKxDYecybR8Eo="; stripRoot = false; }; nativeBuildInputs = [ protobuf ]; configurePhase = '' runHook preConfigure rm IBJts/source/{cppclient/client/protobufUnix/*,pythonclient/ibapi/protobuf/*} protoc \ -IIBJts/source/proto \ --cpp_out=IBJts/source/cppclient/client/protobufUnix \ --python_out=IBJts/source/pythonclient/ibapi/protobuf \ IBJts/source/proto/*.proto sed -i '/^import / { s/\(\<[A-Za-z0-9_]*[A-Za-z0-9]_pb2\)/ibapi.protobuf.\1/g }' IBJts/source/pythonclient/ibapi/protobuf/*.py touch IBJts/source/pythonclient/ibapi/protobuf/__init__.py runHook postConfigure ''; installPhase = '' runHook preInstall cp -r . $out runHook postInstall ''; }; native-lib = stdenv.mkDerivation { pname = "ibkr-tws-api-native"; inherit version; src = src-with-protobuf; sourceRoot = "ibkr-tws-api-src-${version}/IBJts/source/cppclient/client"; buildInputs = [ intel-decimalfp protobuf ]; postPatch = '' sed -i 's/-std=c++11/-std=c++17/' makefile ''; makeFlags = [ "LIB_DIR=${intel-decimalfp}/lib" "LIB_NAME=libbid.a" ]; installPhase = '' runHook preInstall mkdir -p $out/lib cp -v lib*.so $out/lib runHook postInstall ''; }; test-client = stdenv.mkDerivation { pname = "ibkr-tws-api-test-client"; inherit version; src = src-with-protobuf; sourceRoot = "ibkr-tws-api-src-${version}/IBJts/samples/Cpp/TestCppClient"; nativeBuildInputs = [ pkg-config ]; buildInputs = [ intel-decimalfp native-lib protobuf ]; postPatch = '' sed -i "s/-std=c++11/-std=c++17/; s@-lprotobuf@$(pkg-config --libs protobuf)@" makefile ''; makeFlags = [ "TestCppClientDynamic" "LIB_DIR=${intel-decimalfp}/lib" "LIB_NAME_SO=libbid.a" "SOURCE_DIR=${native-lib}/lib" ]; installPhase = '' runHook preInstall mkdir -p $out/bin install -m755 TestCppClientDynamic $out/bin/TestCppClient runHook postInstall ''; postFixup = '' patchelf --add-rpath ${native-lib}/lib $out/bin/TestCppClient ''; meta = { mainProgram = "TestCppClient"; }; }; py-client = { buildPythonPackage, protobuf, }: buildPythonPackage { pname = "ibapi-python"; inherit version; src = src-with-protobuf; sourceRoot = "ibkr-tws-api-src-${version}/IBJts/source/pythonclient"; format = "setuptools"; propagatedBuildInputs = [ protobuf ]; }; in { inherit test-client; native = native-lib; ibapi-python = python3Packages.callPackage py-client {}; }