forked from rarias/jungle
180 lines
5.0 KiB
Nix
180 lines
5.0 KiB
Nix
{ stdenvNoCC
|
|
, lib
|
|
, symlinkJoin
|
|
, autoPatchelfHook
|
|
, wrapCCWith
|
|
, overrideCC
|
|
, gcc13
|
|
, gcc13Stdenv
|
|
, hwloc
|
|
, libelf
|
|
, libffi_3_3
|
|
, libpsm2
|
|
, libuuid
|
|
, libxml2
|
|
, numactl
|
|
, ocl-icd
|
|
, openssl
|
|
, python3
|
|
, rdma-core
|
|
, ucx
|
|
, zlib
|
|
, makeOverridable
|
|
, recurseIntoAttrs
|
|
}:
|
|
|
|
makeOverridable (
|
|
{
|
|
unpatched,
|
|
components ? { },
|
|
extraPackages ? components.extraPackages or []
|
|
}:
|
|
|
|
let
|
|
inherit (builtins) attrValues filter mapAttrs removeAttrs;
|
|
|
|
gcc = gcc13;
|
|
stdenv = gcc13Stdenv;
|
|
|
|
__components = removeAttrs components ["extraPackages"];
|
|
_components = __components;
|
|
# _components = lib.traceSeqN 2 {
|
|
# inherit unpatched __components;
|
|
# deps = builtins.map (x: "${x.pname}-${x.version}") unpatched.deps;
|
|
# } __components;
|
|
|
|
wrapIntel = { cc, extraBuildCommands ? "", extraInstall ? "", ... }@args:
|
|
let
|
|
targetConfig = stdenv.targetPlatform.config;
|
|
in (wrapCCWith {
|
|
inherit cc;
|
|
extraBuildCommands = ''
|
|
echo "-L${gcc.cc}/lib/gcc/${targetConfig}/${gcc.version}" >> $out/nix-support/cc-ldflags
|
|
echo "-L${gcc.cc.lib}/lib" >> $out/nix-support/cc-ldflags
|
|
echo "-L${cc}/lib" >> $out/nix-support/cc-ldflags
|
|
|
|
# echo "--gcc-toolchain=${gcc.cc}" >> $out/nix-support/libcxx-cxxflags
|
|
echo "--gcc-toolchain=${gcc.cc}" >> $out/nix-support/cc-cflags
|
|
|
|
# For some reason, If we don't resolve the realpath things go wrong
|
|
for stddef in ${cc}/lib/clang/*/include/stddef.h ; do
|
|
dir=$(dirname $(realpath "$stddef"))
|
|
echo "-isystem $dir" >> $out/nix-support/cc-cflags
|
|
done
|
|
|
|
echo "-isystem ${cc}/include" >> $out/nix-support/cc-cflags
|
|
echo "-isystem ${cc}/include/intel64" >> $out/nix-support/cc-cflags
|
|
|
|
for dir in ${gcc.cc}/lib/gcc/${targetConfig}/*/include; do
|
|
echo "-isystem $dir" >> $out/nix-support/cc-cflags
|
|
done
|
|
|
|
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
|
|
|
|
# FIXME: We should find a better way to modify the PATH instead of using
|
|
# this ugly hack. See https://jungle.bsc.es/git/rarias/bscpkgs/issues/9
|
|
echo 'path_backup="${gcc.cc}/bin:$path_backup"' >> $out/nix-support/cc-wrapper-hook
|
|
|
|
# Disable hardening by default
|
|
echo "" > $out/nix-support/add-hardening.sh
|
|
'' + extraBuildCommands;
|
|
} // (removeAttrs args ["cc" "extraBuildCommands" "extraInstall"])
|
|
).overrideAttrs (old: {
|
|
installPhase = old.installPhase + extraInstall;
|
|
});
|
|
|
|
in
|
|
stdenvNoCC.mkDerivation (finalAttrs: {
|
|
pname = lib.removeSuffix "-extracted" unpatched.pname;
|
|
inherit (unpatched) version;
|
|
src = unpatched;
|
|
|
|
phases = [ "installPhase" "fixupPhase" ];
|
|
buildInputs = [
|
|
libffi_3_3
|
|
libelf
|
|
libxml2
|
|
hwloc
|
|
numactl
|
|
libuuid
|
|
libpsm2
|
|
zlib
|
|
ocl-icd
|
|
rdma-core
|
|
ucx
|
|
openssl
|
|
python3
|
|
stdenv.cc.cc.lib
|
|
] ++ extraPackages;
|
|
|
|
autoPatchelfIgnoreMissingDeps = [ "libhwloc.so.5" "libcuda.so.1" "libze_loader.so.1" ];
|
|
|
|
# There are broken symlinks that go outside packages, ignore them
|
|
dontCheckForBrokenSymlinks = true;
|
|
|
|
nativeBuildInputs = [ autoPatchelfHook ];
|
|
installPhase = ''
|
|
cp -r $src/opt/intel/oneapi/ $out
|
|
'';
|
|
|
|
passthru = let
|
|
pkgs = mapAttrs
|
|
(folder: version: symlinkJoin {
|
|
pname = "intel-${folder}";
|
|
inherit version;
|
|
paths = ["${finalAttrs.finalPackage}/${folder}/${version}"];
|
|
})
|
|
_components;
|
|
in pkgs // {
|
|
inherit unpatched;
|
|
pkgs = recurseIntoAttrs pkgs;
|
|
components = _components;
|
|
|
|
# This contains all packages properly symlinked into toplevel directories
|
|
# in $out.
|
|
#
|
|
# NOTE: there are clashes with packages that have symlinks outside their
|
|
# scope (libtcm and env/vars.sh)
|
|
all = symlinkJoin {
|
|
pname = finalAttrs.finalPackage + "-symlinked";
|
|
inherit (finalAttrs.finalPackage) version;
|
|
paths = filter lib.isDerivation (attrValues finalAttrs.finalPackage.pkgs);
|
|
};
|
|
|
|
stdenv = overrideCC stdenv finalAttrs.finalPackage.cc;
|
|
|
|
cc = wrapIntel {
|
|
cc = finalAttrs.finalPackage.pkgs.compiler;
|
|
extraBuildCommands = ''
|
|
wrap icx $wrapper $ccPath/icx
|
|
wrap icpx $wrapper $ccPath/icpx
|
|
wrap ifx $wrapper $ccPath/ifx
|
|
|
|
ln -s $out/bin/icpx $out/bin/c++
|
|
ln -s $out/bin/icx $out/bin/cc
|
|
|
|
# Use this to detect when a compiler subprocess is called
|
|
# from icpx (--fsycl-host-compiler)
|
|
echo 'export "NIX_CC_WRAPPER_INTEL=1"' >> $out/nix-support/cc-wrapper-hook
|
|
|
|
sed -i 's/.*isCxx=0/isCxx=1/' $out/bin/icpx
|
|
|
|
# oneMath looks for sycl libraries in bin/../lib
|
|
ln -s ${finalAttrs.finalPackage.pkgs.compiler}/lib $out/lib
|
|
ln -s ${finalAttrs.finalPackage.pkgs.compiler}/include $out/include
|
|
'';
|
|
extraInstall = ''
|
|
export named_cc="icx"
|
|
export named_cxx="icpx"
|
|
export named_fc="ifx"
|
|
'';
|
|
};
|
|
};
|
|
|
|
}))
|