{ lib
, stdenv
, cmake
, libtorch-bin
, linkFarm
, symlinkJoin

, cudaSupport
, cudaPackages ? {}
}:
let
  inherit (cudaPackages) cudatoolkit cudnn;

  cudatoolkit_joined = symlinkJoin {
    name = "${cudatoolkit.name}-unsplit";
    paths = [ cudatoolkit.out cudatoolkit.lib ];
  };

  # We do not have access to /run/opengl-driver/lib in the sandbox,
  # so use a stub instead.
  cudaStub = linkFarm "cuda-stub" [{
    name = "libcuda.so.1";
    path = "${cudatoolkit}/lib/stubs/libcuda.so";
  }];

in stdenv.mkDerivation {
  pname = "libtorch-test";
  version = libtorch-bin.version;

  src = lib.fileset.toSource {
    root = ./.;
    fileset = lib.fileset.unions [
      ./CMakeLists.txt
      ./test.cpp
    ];
  };

  nativeBuildInputs = [ cmake ];

  buildInputs = [ libtorch-bin ] ++
    lib.optionals cudaSupport [ cudnn ];

  cmakeFlags = lib.optionals cudaSupport
    [ "-DCUDA_TOOLKIT_ROOT_DIR=${cudatoolkit_joined}" ];

  doCheck = true;

  installPhase = ''
    touch $out
  '';

  checkPhase = lib.optionalString cudaSupport ''
    LD_LIBRARY_PATH=${cudaStub}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH \
  '' + ''
    ./test
  '';
}
