forked from rarias/bscpkgs
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { stdenv
 | |
| , 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.8.254";
 | |
|   dir_nr = "16814";
 | |
|   internal-ver = "2020.2.254";
 | |
| 
 | |
|   src = builtins.fetchTarball {
 | |
|     url = "http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/${dir_nr}/l_mpi_${version}.tgz";
 | |
|     sha256 = "1za4zyvxm5bfkrca843na6sxq2gq7qb87s0zysa7dnyqjwa11n45";
 | |
|   };
 | |
| 
 | |
|   buildInputs = [
 | |
|     rpmextract
 | |
|     autoPatchelfHook
 | |
|     gcc.cc.lib
 | |
|     zlib
 | |
|     ucx
 | |
|     numactl
 | |
|     rdma-core
 | |
|     libpsm2
 | |
|     patchelf
 | |
|   ];
 | |
| 
 | |
|   postUnpack = ''
 | |
|     pushd $sourceRoot
 | |
|       rpmextract rpm/intel-mpi-*.rpm
 | |
|     popd
 | |
|   '';
 | |
| 
 | |
|   patches = [
 | |
|     ./mpicc.patch
 | |
|     ./mpicxx.patch
 | |
|   ];
 | |
| 
 | |
|   postPatch = ''
 | |
|     pushd opt/intel/compilers_and_libraries_${internal-ver}/linux/mpi/intel64/bin
 | |
|       for i in mpi* ; do
 | |
|         echo "Fixing paths in $i"
 | |
|         sed -i "s:I_MPI_SUBSTITUTE_INSTALLDIR:$out:g" "$i"
 | |
|       done     
 | |
|     popd
 | |
|   '';
 | |
| 
 | |
|   dontBuild = true;
 | |
| 
 | |
|   installPhase = ''
 | |
|     cd opt/intel/compilers_and_libraries_${internal-ver}/linux/mpi/intel64
 | |
|     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)"
 | |
|   '';
 | |
| }
 |