105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   stdenv
 | |
| , lib
 | |
| , gcc
 | |
| , clangOmpss2Unwrapped
 | |
| , writeShellScript
 | |
| , openmp ? null
 | |
| , wrapCCWith
 | |
| , llvmPackages_latest
 | |
| , ompss2rt ? null
 | |
| }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   usingNodesAndOmpv = (openmp.pname == "openmp-v" && ompss2rt.pname == "nodes");
 | |
|   sameNosv = openmp.nosv == ompss2rt.nosv;
 | |
| in
 | |
| 
 | |
| assert assertMsg (usingNodesAndOmpv -> sameNosv) "OpenMP-V and NODES must share the same nOS-V";
 | |
| 
 | |
| let
 | |
|   homevar = if ompss2rt.pname == "nanos6" then "NANOS6_HOME" else "NODES_HOME";
 | |
|   rtname  = if ompss2rt.pname == "nanos6" then "libnanos6" else "libnodes";
 | |
|   ompname = if openmp.pname == "openmp-v" then  "libompv" else "libomp";
 | |
| 
 | |
| 
 | |
|   # We need to replace the lld linker from bintools with our linker just built,
 | |
|   # otherwise we run into incompatibility issues when mixing compiler and linker
 | |
|   # versions.
 | |
|   bintools-unwrapped = llvmPackages_latest.tools.bintools-unwrapped.override {
 | |
|     lld = clangOmpss2Unwrapped;
 | |
|   };
 | |
|   bintools = llvmPackages_latest.tools.bintools.override {
 | |
|     bintools = bintools-unwrapped;
 | |
|   };
 | |
|   targetConfig = stdenv.targetPlatform.config;
 | |
|   inherit gcc;
 | |
|   cc = clangOmpss2Unwrapped;
 | |
|   gccVersion = with versions; let v = gcc.version; in concatStringsSep "." [(major v) (minor v) (patch v)];
 | |
| 
 | |
|   extraBuildCommands = ''
 | |
|     echo "-target ${targetConfig}" >> $out/nix-support/cc-cflags
 | |
|     echo "-B${gcc.cc}/lib/gcc/${targetConfig}/${gccVersion}" >> $out/nix-support/cc-cflags
 | |
|     echo "-L${gcc.cc}/lib/gcc/${targetConfig}/${gccVersion}" >> $out/nix-support/cc-ldflags
 | |
|     echo "-L${gcc.cc.lib}/lib" >> $out/nix-support/cc-ldflags
 | |
| 
 | |
|     for dir in ${gcc.cc}/include/c++/*; do
 | |
|       echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags
 | |
|     done
 | |
|     for dir in ${gcc.cc}/include/c++/*/${targetConfig}; do
 | |
|       echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags
 | |
|     done
 | |
| 
 | |
|     echo "--gcc-toolchain=${gcc}" >> $out/nix-support/cc-cflags
 | |
| 
 | |
|     wrap clang++  $wrapper $ccPath/clang++
 | |
|   '';
 | |
| 
 | |
|   envExports = lib.optionalString (openmp != null) ''
 | |
|       echo "export OPENMP_RUNTIME=${ompname}" >> $out/nix-support/cc-wrapper-hook
 | |
|     '' + optionalString (ompss2rt != null) ''
 | |
|       echo "export OMPSS2_RUNTIME=${rtname}" >> $out/nix-support/cc-wrapper-hook
 | |
|       echo "export ${homevar}=${ompss2rt}"   >> $out/nix-support/cc-wrapper-hook
 | |
|     '' + optionalString (ompss2rt != null && ompss2rt.pname == "nodes") ''
 | |
|       echo "export NOSV_HOME=${ompss2rt.nosv}" >> $out/nix-support/cc-wrapper-hook
 | |
|     '';
 | |
| 
 | |
|   extraPackages = optional (openmp != null) openmp;
 | |
| 
 | |
|   wrappedCC = wrapCCWith {
 | |
|     # extraPackages adds packages to depsTargetTargetPropagated
 | |
|     inherit cc bintools extraPackages;
 | |
|     extraBuildCommands = extraBuildCommands + envExports;
 | |
|   };
 | |
| 
 | |
|   resetIntelCCFlags = let tconf = builtins.replaceStrings ["-"] ["_"] targetConfig;
 | |
|   in writeShellScript "remove-intel.sh" ''
 | |
|     if [ "''${NIX_CC_WRAPPER_INTEL:-0}" = 1 ]; then
 | |
|       unset NIX_CFLAGS_COMPILE_${tconf}
 | |
|       unset NIX_CC_WRAPPER_FLAGS_SET_${tconf}
 | |
| 
 | |
|       if (( "''${NIX_DEBUG:-0}" >= 1 )); then
 | |
|         echo "ompss2: cleaned NIX_CFLAGS_COMPILE_${tconf} (invokation from intel compiler detected)"
 | |
|       fi
 | |
|     fi
 | |
|   '';
 | |
| 
 | |
|   intelExtraBuildCommands = ''
 | |
|     sed -i 's|# Flirting.*|source ${resetIntelCCFlags}\n\n&|' $out/bin/clang
 | |
|     sed -i 's|# Flirting.*|source ${resetIntelCCFlags}\n\n&|' $out/bin/clang++
 | |
|   '';
 | |
| 
 | |
|   wrappedCCIntel = wrapCCWith {
 | |
|     inherit cc bintools extraPackages;
 | |
|     # extraPackages adds packages to depsTargetTargetPropagated
 | |
|     extraBuildCommands = intelExtraBuildCommands + envExports;
 | |
|   };
 | |
| 
 | |
| in wrappedCC.overrideAttrs (oldAttrs: {
 | |
|     passthru = oldAttrs.passthru // {
 | |
|       forIcpx = wrappedCCIntel;
 | |
|     };
 | |
|   })
 |