114 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ stdenv
 | 
						|
, lib
 | 
						|
, rpmextract
 | 
						|
, gcc
 | 
						|
, zlib
 | 
						|
, ucx
 | 
						|
, numactl
 | 
						|
, rdma-core
 | 
						|
, libpsm2
 | 
						|
, patchelf
 | 
						|
, autoPatchelfHook
 | 
						|
, enableDebug ? false
 | 
						|
# The _mt version seems to cause seg-faults and deadlocks with the libpsm2
 | 
						|
# provider library with programs that call the MPI library without any locking
 | 
						|
# mechanism. See https://pm.bsc.es/gitlab/rarias/bscpkgs/-/issues/28. By
 | 
						|
# default, we use the non-mt variant, which provides a big lock. If you want to
 | 
						|
# use it, take a look at the I_MPI_THREAD_SPLIT env-var as well.
 | 
						|
, enableMt ? false
 | 
						|
}:
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  lib_variant = (if enableDebug then "debug" else "release");
 | 
						|
 | 
						|
  # See https://software.intel.com/content/www/us/en/develop/documentation/mpi-developer-reference-linux/top/environment-variable-reference/other-environment-variables.html
 | 
						|
  lib_mt = (if enableMt then "_mt" else "");
 | 
						|
  lib_name = "${lib_variant}${lib_mt}";
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
stdenv.mkDerivation rec {
 | 
						|
  name = "intel-mpi-${version}";
 | 
						|
  version = "2019.10.317";
 | 
						|
  dir_nr = "17534";
 | 
						|
 | 
						|
  src = builtins.fetchTarball {
 | 
						|
    url = "http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/${dir_nr}/l_mpi_${version}.tgz";
 | 
						|
    sha256 = "00nimgqywr20dv1ns5kg4r8539gvharn0xfj48i7mhbg8kwf8s08";
 | 
						|
  };
 | 
						|
 | 
						|
  buildInputs = [
 | 
						|
    rpmextract
 | 
						|
    autoPatchelfHook
 | 
						|
    gcc.cc.lib
 | 
						|
    zlib
 | 
						|
    ucx
 | 
						|
    numactl
 | 
						|
    rdma-core
 | 
						|
    libpsm2
 | 
						|
    patchelf
 | 
						|
  ];
 | 
						|
 | 
						|
  postUnpack = ''
 | 
						|
    pushd $sourceRoot
 | 
						|
      rpmextract rpm/intel-mpi-*.rpm
 | 
						|
      # Predictable name
 | 
						|
      mv opt/intel/compilers_and_libraries_* opt/intel/compilers_and_libraries
 | 
						|
    popd
 | 
						|
    sourceRoot="$sourceRoot/opt/intel/compilers_and_libraries/linux/mpi/intel64"
 | 
						|
  '';
 | 
						|
 | 
						|
  patches = [
 | 
						|
    ./mpicc.patch
 | 
						|
    ./mpicxx.patch
 | 
						|
  ];
 | 
						|
 | 
						|
  postPatch = ''
 | 
						|
    for i in bin/mpi* ; do
 | 
						|
      echo "Fixing paths in $i"
 | 
						|
      sed -i "s:I_MPI_SUBSTITUTE_INSTALLDIR:$out:g" "$i"
 | 
						|
    done     
 | 
						|
  '';
 | 
						|
 | 
						|
  dontBuild = true;
 | 
						|
 | 
						|
  installPhase = ''
 | 
						|
    mkdir -p $out
 | 
						|
    mv etc $out
 | 
						|
    mv bin $out 
 | 
						|
    mv include $out 
 | 
						|
    mkdir $out/lib
 | 
						|
    cp -a lib/lib* $out/lib
 | 
						|
    cp -a lib/${lib_name}/lib* $out/lib
 | 
						|
    cp -a libfabric/lib/* $out/lib
 | 
						|
    cp -a libfabric/lib/prov/* $out/lib
 | 
						|
    cp -a libfabric/bin/* $out/bin
 | 
						|
    ln -s . $out/intel64
 | 
						|
    rm $out/lib/libmpi.dbg
 | 
						|
 | 
						|
    # Fixup Intel PSM2 library missing (now located at PSMX2)
 | 
						|
    ln -s $out/lib/libpsmx2-fi.so $out/lib/libpsm2-fi.so
 | 
						|
  '';
 | 
						|
 | 
						|
  dontAutoPatchelf = true;
 | 
						|
 | 
						|
  # The rpath of libfabric.so bundled with Intel MPI is patched to include the
 | 
						|
  # rdma-core lib path, as is required for dlopen to find the rdma components.
 | 
						|
  # TODO: Try the upstream libfabric library with rdma support, so we can avoid
 | 
						|
  # this hack.
 | 
						|
  postFixup = ''
 | 
						|
    autoPatchelf -- $out
 | 
						|
    patchelf --set-rpath "$out/lib:${rdma-core}/lib:${libpsm2}/lib" $out/lib/libfabric.so
 | 
						|
    echo "Patched RPATH in libfabric.so to: $(patchelf --print-rpath $out/lib/libfabric.so)"
 | 
						|
  '';
 | 
						|
 | 
						|
  meta = {
 | 
						|
    homepage = "https://www.intel.com/content/www/us/en/developer/tools/overview.html";
 | 
						|
    description = "Intel MPI";
 | 
						|
    maintainers = with lib.maintainers.bsc; [ rarias ];
 | 
						|
    platforms = lib.platforms.linux;
 | 
						|
    license = lib.licenses.unfree;
 | 
						|
  };
 | 
						|
}
 |