forked from rarias/jungle
210 lines
5.3 KiB
Nix
210 lines
5.3 KiB
Nix
{
|
|
stdenv,
|
|
stdenvNoCC,
|
|
lib,
|
|
symlinkJoin,
|
|
autoPatchelfHook,
|
|
wrapCCWith,
|
|
overrideCC,
|
|
gcc,
|
|
hwloc,
|
|
libelf,
|
|
libffi_3_3,
|
|
libpsm2,
|
|
libuuid,
|
|
libxml2,
|
|
numactl,
|
|
ocl-icd,
|
|
openssl,
|
|
python3,
|
|
rdma-core,
|
|
ucx,
|
|
zlib,
|
|
}:
|
|
|
|
lib.makeOverridable (
|
|
{
|
|
unpatched,
|
|
components ? { },
|
|
extraPackages ? components.extraPackages or [ ],
|
|
}:
|
|
|
|
let
|
|
inherit (builtins)
|
|
attrValues
|
|
filter
|
|
mapAttrs
|
|
removeAttrs
|
|
;
|
|
|
|
__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,
|
|
nixSupport ? { },
|
|
extraBuildCommands ? "",
|
|
extraInstall ? "",
|
|
...
|
|
}@args:
|
|
let
|
|
targetConfig = stdenv.targetPlatform.config;
|
|
in
|
|
(
|
|
wrapCCWith {
|
|
inherit cc;
|
|
|
|
nixSupport = lib.mergeAttrsConcatenateValues {
|
|
cc-ldflags = [
|
|
"-L${gcc.cc}/lib/gcc/${targetConfig}/${gcc.version}"
|
|
"-L${gcc.cc.lib}/lib"
|
|
"-L${cc}/lib"
|
|
];
|
|
cc-cflags = [
|
|
"--gcc-toolchain=${gcc.cc}"
|
|
"-isystem \"${cc.original}/lib/clang/*/include\""
|
|
"-isystem ${cc}/include"
|
|
"-isystem ${cc}/include/intel64"
|
|
"-isystem ${gcc.cc}/lib/gcc/${targetConfig}/${gcc.version}/include"
|
|
];
|
|
libcxx-cxxflags = [
|
|
# "--gcc-toolchain=${gcc.cc}"
|
|
"-isystem ${gcc.cc}/include/c++/${gcc.version}"
|
|
"-isystem ${gcc.cc}/include/c++/${gcc.version}/${targetConfig}"
|
|
];
|
|
} nixSupport;
|
|
|
|
extraBuildCommands = ''
|
|
# 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"
|
|
"nixSupport"
|
|
])
|
|
).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:
|
|
let
|
|
original = "${finalAttrs.finalPackage}/${folder}/${version}";
|
|
in
|
|
(symlinkJoin {
|
|
pname = "intel-${folder}";
|
|
inherit version;
|
|
paths = [ original ];
|
|
}).overrideAttrs
|
|
{ passthru = { inherit original; }; }
|
|
) _components;
|
|
in
|
|
pkgs
|
|
// {
|
|
inherit unpatched;
|
|
pkgs = lib.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
|
|
|
|
sed -i 's/.*isCxx=0/isCxx=1/' $out/bin/icpx
|
|
|
|
# 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
|
|
|
|
# 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"
|
|
'';
|
|
};
|
|
};
|
|
|
|
})
|
|
)
|