From a0d464cbf74a60e5e53edbc19333aebd6fcbba1b Mon Sep 17 00:00:00 2001 From: kilyanni Date: Tue, 21 Apr 2026 03:43:48 +0200 Subject: [PATCH] intel-oneapi.base: add stdenv --- .../libraries/intel-oneapi/base.nix | 3 + .../libraries/intel-oneapi/stdenv.nix | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 pkgs/development/libraries/intel-oneapi/stdenv.nix diff --git a/pkgs/development/libraries/intel-oneapi/base.nix b/pkgs/development/libraries/intel-oneapi/base.nix index 5d4c6fc28e67..90bc8e0a2617 100644 --- a/pkgs/development/libraries/intel-oneapi/base.nix +++ b/pkgs/development/libraries/intel-oneapi/base.nix @@ -1,5 +1,6 @@ { lib, + callPackage, fetchurl, zlib, rdma-core, @@ -189,6 +190,8 @@ intel-oneapi.mkIntelOneApi (finalAttrs: { downloadPage = "https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html?packages=oneapi-toolkit&oneapi-toolkit-os=linux&oneapi-lin=offline"; }; + passthru.stdenv = callPackage ./stdenv.nix { kit = intel-oneapi.base; }; + passthru.tests = { mkl-libs = stdenv.mkDerivation { name = "intel-oneapi-test-mkl-libs"; diff --git a/pkgs/development/libraries/intel-oneapi/stdenv.nix b/pkgs/development/libraries/intel-oneapi/stdenv.nix new file mode 100644 index 000000000000..f813889df3e8 --- /dev/null +++ b/pkgs/development/libraries/intel-oneapi/stdenv.nix @@ -0,0 +1,58 @@ +{ + kit, + stdenvNoCC, + stdenv, + overrideCC, + wrapCCWith, +}: +let + unwrappedCC = stdenvNoCC.mkDerivation { + name = "intel-oneapi-cc-unwrapped"; + dontUnpack = true; + + # Note: use a wrapper script, not symlinks. The compiler inspects argv[0] + # to decide how to behave, so it must see itself invoked as + # icx/icpx. Through a symlink it would see clang/clang++ and + # select the wrong behavior. + installPhase = '' + mkdir -p $out/bin + + cat > $out/bin/clang++ << 'EOF' + #!/bin/sh + exec ${kit}/compiler/latest/bin/icpx "$@" + EOF + chmod +x $out/bin/clang++ + + cat > $out/bin/clang << 'EOF' + #!/bin/sh + exec ${kit}/compiler/latest/bin/icx "$@" + EOF + chmod +x $out/bin/clang + ''; + + passthru.isClang = true; + + # icpx rejects these flags for the SPIR-V device target (spir64-unknown-unknown). + hardeningUnsupportedFlags = [ + "zerocallusedregs" + "pacret" + "shadowstack" + ]; + }; + + wrappedCC = wrapCCWith { + cc = unwrappedCC; + extraPackages = [ kit ]; + extraBuildCommands = '' + # Consumers expect the icpx/icx names and might reject clang++/clang. + ln -s $out/bin/clang++ $out/bin/icpx + ln -s $out/bin/clang $out/bin/icx + + echo "export CXX=\"$out/bin/icpx\"" >> $out/nix-support/setup-hook + echo "export CC=\"$out/bin/icx\"" >> $out/nix-support/setup-hook + + echo "export ONEAPI_ROOT=\"${kit}\"" >> $out/nix-support/setup-hook + ''; + }; +in +overrideCC stdenv wrappedCC