{ version
, srcName
, sha256
}:

{ stdenv
, lib
, requireFile
, cudatoolkit
}:

stdenv.mkDerivation rec {
  name = "cudatoolkit-${cudatoolkit.majorVersion}-nccl-${version}";

  inherit version;

  src = requireFile rec {
    name = srcName;
    inherit sha256;
    message = ''
      This nix expression requires that ${name} is already part of the store.
      Register yourself to NVIDIA Accelerated Computing Developer Program, retrieve the NCCL library
      at https://developer.nvidia.com/nccl, and run the following command in the download directory:
      nix-prefetch-url file://\$PWD/${name}
    '';
  };

  unpackCmd = "tar xJf $src";

  installPhase = ''
    function fixRunPath {
      p=$(patchelf --print-rpath $1)
      patchelf --set-rpath "$p:${lib.makeLibraryPath [ stdenv.cc.cc ]}" $1
    }
    fixRunPath lib/libnccl.so

    mkdir -p $out
    cp -a include $out/include
    cp -a lib $out/lib
  '';

  propagatedBuildInputs = [
    cudatoolkit
  ];

  passthru = {
    inherit cudatoolkit;
  };

  meta = with stdenv.lib; {
    description = "Multi-GPU and multi-node collective communication primitives that are performance optimized for NVIDIA GPUs";
    homepage = https://developer.nvidia.com/nccl;
    license = licenses.unfree;
    platforms = [ "x86_64-linux" ];
    maintainers = with maintainers; [ mdaiter ];
  };
}
