nixos-conf/custom/override.nix

558 lines
18 KiB
Nix

final: prev:
let
winePkg = final.wineWow64Packages.full;
sandboxSccacheDir = "/var/cache/sccache/nix-builds/packages";
sharedSccacheConfig = final.writeText "sccache.conf" ''
[cache.disk]
dir = "${sandboxSccacheDir}"
size = "100G"
'';
versionBumpAttrs =
oldVersion: version: attrs:
if final.lib.versionOlder oldVersion version then attrs else { };
modify =
target: f:
if target ? overridePythonAttrs then
target.overridePythonAttrs f
else if target ? overrideAttrs then
target.overrideAttrs f
else if target ? overrideScope then
target.overrideScope f
else
throw "modify: target does not support overridePythonAttrs, overrideAttrs, or overrideScope";
mkSccacheLauncher =
{
name,
sccacheDir ? null,
sccacheServerUds ? null,
sccacheCacheSize ? "100G",
noDaemon ? false,
passthroughWrappedCompiler ? false,
}:
let
sccacheConfig = final.writeText "${name}-config" ''
[cache.disk]
dir = "${if sccacheDir != null then sccacheDir else sandboxSccacheDir}"
size = "${sccacheCacheSize}"
'';
effectiveSccacheConfig =
if sccacheDir == null && sccacheCacheSize == "100G" then sharedSccacheConfig else sccacheConfig;
in
final.writeShellScriptBin name ''
is_cmake_derivation() {
case " ''${nativeBuildInputs:-} ''${propagatedNativeBuildInputs:-} " in
*"/cmake-"*) return 0 ;;
esac
[ -n "''${cmakeFlags:-}" ] || [ -n "''${cmakeDir:-}" ] || [ -n "''${cmakeBuildType:-}" ]
}
is_cmake_probe_invocation() {
local arg
for arg in "$@"; do
case "$arg" in
*CMakeFiles/*CompilerId*|*CMakeFiles/CMakeTmp/*|*CMakeScratch/*)
return 0
;;
esac
done
return 1
}
export SCCACHE_CONF=${final.lib.escapeShellArg effectiveSccacheConfig}
unset SCCACHE_START_SERVER
${final.lib.optionalString noDaemon ''
export SCCACHE_NO_DAEMON=1
unset SCCACHE_SERVER_UDS
''}
${final.lib.optionalString (!noDaemon && sccacheServerUds != null) ''
export SCCACHE_SERVER_UDS=${final.lib.escapeShellArg sccacheServerUds}
''}
if [ "$#" -eq 0 ] || [ "''${1#-}" != "$1" ]; then
exec ${final.sccache}/bin/sccache "$@"
fi
compiler="$1"
shift
if [ "''${SCCACHE_WRAPPED_COMPILER_PASSTHROUGH:-}" = 1 ] || {
is_cmake_derivation && is_cmake_probe_invocation "$@"
}; then
exec "$compiler" "$@"
fi
${final.lib.optionalString passthroughWrappedCompiler ''
export SCCACHE_WRAPPED_COMPILER_PASSTHROUGH=1
''}
exec ${final.sccache}/bin/sccache "$compiler" "$@"
'';
buildSccacheLauncher = mkSccacheLauncher {
name = "build-sccache";
};
mkBuildSccacheAttrs =
old:
{
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ buildSccacheLauncher ];
preConfigure = (old.preConfigure or "") + ''
mkdir -p ${final.lib.escapeShellArg sandboxSccacheDir}
chmod 0777 ${final.lib.escapeShellArg sandboxSccacheDir} || true
export SCCACHE_SERVER_UDS="$TMPDIR/sccache/server.sock"
export SCCACHE_IDLE_TIMEOUT=0
unset SCCACHE_NO_DAEMON
mkdir -p "$(dirname "$SCCACHE_SERVER_UDS")"
if ! ${buildSccacheLauncher}/bin/build-sccache --show-stats >/dev/null 2>&1; then
rm -f "$SCCACHE_SERVER_UDS"
if ! ${buildSccacheLauncher}/bin/build-sccache --start-server >/tmp/sccache-start.log 2>&1; then
if ! grep -Fq "Address already in use" /tmp/sccache-start.log; then
cat /tmp/sccache-start.log >&2
exit 1
fi
fi
fi
'';
postBuild = (old.postBuild or "") + ''
${buildSccacheLauncher}/bin/build-sccache --show-stats --stats-format text || true
${buildSccacheLauncher}/bin/build-sccache --stop-server || true
'';
};
mkCmakeSccacheAttrs =
old:
let
sccacheLauncher = mkSccacheLauncher {
name = "cmake-sccache";
passthroughWrappedCompiler = true;
};
in
{
cmakeFlags = (old.cmakeFlags or [ ]) ++ [
"-DCMAKE_C_COMPILER_LAUNCHER=${sccacheLauncher}/bin/cmake-sccache"
"-DCMAKE_CXX_COMPILER_LAUNCHER=${sccacheLauncher}/bin/cmake-sccache"
];
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ sccacheLauncher ];
preConfigure = (old.preConfigure or "") + ''
mkdir -p ${final.lib.escapeShellArg sandboxSccacheDir}
chmod 0777 ${final.lib.escapeShellArg sandboxSccacheDir} || true
export SCCACHE_SERVER_UDS="$TMPDIR/sccache/server.sock"
export SCCACHE_IDLE_TIMEOUT=0
unset SCCACHE_NO_DAEMON
mkdir -p "$(dirname "$SCCACHE_SERVER_UDS")"
if ! ${sccacheLauncher}/bin/cmake-sccache --show-stats >/dev/null 2>&1; then
rm -f "$SCCACHE_SERVER_UDS"
if ! ${sccacheLauncher}/bin/cmake-sccache --start-server >/tmp/sccache-start.log 2>&1; then
if ! grep -Fq "Address already in use" /tmp/sccache-start.log; then
cat /tmp/sccache-start.log >&2
exit 1
fi
fi
fi
'';
postBuild = (old.postBuild or "") + ''
${sccacheLauncher}/bin/cmake-sccache --show-stats --stats-format text || true
${sccacheLauncher}/bin/cmake-sccache --stop-server || true
'';
};
mkSccacheStdenv =
{
stdenv,
sccacheDir ? "/var/cache/sccache/nix-builds/packages",
sccacheServerUds ? null,
noDaemon ? true,
}:
let
cc = stdenv.cc;
ccName = "${cc.targetPrefix or ""}cc";
cxxName = "${cc.targetPrefix or ""}c++";
sccacheLauncher = mkSccacheLauncher {
name = "stdenv-sccache";
inherit sccacheDir sccacheServerUds noDaemon;
};
sccacheCc = cc.overrideAttrs (old: {
setupHooks = (old.setupHooks or [ ]) ++ [
(final.writeText "sccache-wrapped-compiler-hook.sh" ''
set_sccache_passthrough_for_cmake_configure() {
case " ''${nativeBuildInputs:-} ''${propagatedNativeBuildInputs:-} " in
*"/cmake-"*)
export SCCACHE_WRAPPED_COMPILER_PASSTHROUGH=1
;;
*)
if [ -n "''${cmakeFlags:-}" ] || [ -n "''${cmakeDir:-}" ] || [ -n "''${cmakeBuildType:-}" ]; then
export SCCACHE_WRAPPED_COMPILER_PASSTHROUGH=1
fi
;;
esac
}
clear_sccache_passthrough_after_configure() {
unset SCCACHE_WRAPPED_COMPILER_PASSTHROUGH
}
preConfigureHooks+=(set_sccache_passthrough_for_cmake_configure)
postConfigureHooks+=(clear_sccache_passthrough_after_configure)
'')
];
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [
final.makeWrapper
sccacheLauncher
];
postFixup = (old.postFixup or "") + ''
wrap_with_sccache() {
local tool_path="$1"
if [ ! -x "$tool_path" ]; then
return 0
fi
mv "$tool_path" "$tool_path.orig"
makeWrapper ${sccacheLauncher}/bin/stdenv-sccache "$tool_path" \
--add-flags "$tool_path.orig"
}
wrap_with_sccache "$out/bin/${ccName}"
wrap_with_sccache "$out/bin/${cxxName}"
wrap_with_sccache "$out/bin/gcc"
wrap_with_sccache "$out/bin/g++"
wrap_with_sccache "$out/bin/clang"
wrap_with_sccache "$out/bin/clang++"
wrap_with_sccache "$out/bin/arocc"
'';
});
in
final.overrideCC stdenv sccacheCc;
in
{
sccache-config = sharedSccacheConfig;
intel-sycl = modify prev."intel-sycl" (
syFinal: syPrev: {
llvm = modify syPrev.llvm mkCmakeSccacheAttrs;
lld = modify syPrev.lld mkCmakeSccacheAttrs;
stdenv = mkSccacheStdenv {
stdenv = syPrev.stdenv;
};
}
);
# xdg-desktop-portal-cosmic = prev.xdg-desktop-portal-cosmic.overrideAttrs (old: {
# postPatch = (old.postPatch or "") + ''
# unitDir="$out/lib/systemd/user"
# ln -sfn org.freedesktop.impl.portal.desktop.cosmic.service \
# "$unitDir/xdg-desktop-portal-cosmic.service"
# '';
# });
# );
codex = modify prev.codex (
old:
let
version = "0.114.0";
in
(versionBumpAttrs old.version version (
let
src = prev.fetchFromGitHub {
owner = "openai";
repo = "codex";
tag = "rust-v${version}";
hash = "sha256-7t+mVwP4+YrG1ciI+OLqsK7TUM9SrDbPsJNrt26iy9c=";
#hash = "";
};
in
{
inherit version src;
sourceRoot = "${src.name}/codex-rs";
cargoDeps = prev.rustPlatform.fetchCargoVendor {
inherit src;
sourceRoot = "${src.name}/codex-rs";
hash = "sha256-XThIexu3V18JG4OtyvYmybaRMctYpDuBLLH+lUvrtt8=";
#hash = prev.lib.fakeHash;
};
}
))
// {
buildInputs = (old.buildInputs or [ ]) ++ [ prev.libcap ];
preBuild = (old.preBuild or "") + ''
export CARGO_PROFILE_RELEASE_LTO=thin
export CARGO_PROFILE_RELEASE_CODEGEN_UNITS=8
'';
}
);
electron_39 =
let
angleLib = final.lib.getLib final.angle;
electronUnwrapped = modify prev.electron_39.passthru.unwrapped (
old:
let
buildSccacheAttrs = mkBuildSccacheAttrs old;
electronGnFlags =
"${old.gnFlags or ""} cc_wrapper=\"${buildSccacheLauncher}/bin/build-sccache\"";
in
buildSccacheAttrs
// {
gnFlags = electronGnFlags;
configurePhase = builtins.replaceStrings
[ old.gnFlags or "" ]
[ electronGnFlags ]
(old.configurePhase or "");
patches = builtins.filter (
patch: builtins.baseNameOf (toString patch) != "39-angle-patchdir.patch"
) (old.patches or [ ]);
postPatch = ''
substituteInPlace electron/patches/config.json \
--replace-fail '"repo": "src/third_party/angle/src"' '"repo": "src/third_party/angle"'
'' + (old.postPatch or "");
postFixup = (old.postFixup or "") + ''
for angleLibName in \
libEGL.so \
libEGL_vulkan_secondaries.so \
libGLESv1_CM.so \
libGLESv2.so \
libGLESv2_vulkan_secondaries.so \
libGLESv2_with_capture.so \
libVkICD_mock_icd.so \
libfeature_support.so
do
if [ -e "$libExecPath/$angleLibName" ] || [ -L "$libExecPath/$angleLibName" ]; then
rm -f "$libExecPath/$angleLibName"
fi
ln -s ${angleLib}/lib/"$angleLibName" "$libExecPath/$angleLibName"
done
'';
}
);
in
prev.electron_39.override {
electron-unwrapped = electronUnwrapped;
};
oneapi-ccl = modify (prev.oneapi-ccl.override {
intel-sycl = final."intel-sycl";
}) (
old:
let
version = "2021.17.2";
intelSycl = final."intel-sycl".llvm;
intelSyclDev = final.lib.getDev intelSycl;
intelSyclLib = final.lib.getLib intelSycl;
levelZero = final.lib.getDev final.level-zero;
openclHeaders = final.opencl-headers;
cmakeSccacheAttrs = mkCmakeSccacheAttrs old;
in
(versionBumpAttrs old.version version {
inherit version;
src = prev.fetchFromGitHub {
owner = "uxlfoundation";
repo = "oneCCL";
rev = version;
hash = "sha256-dV1PadrcJSdwwpNxXAK1fo/B5p26Lvd36wqC+xM5KJM=";
};
})
// cmakeSccacheAttrs
// {
setOutputFlags = false;
postPatch = (old.postPatch or "") + ''
mkdir -p deps/level_zero
rm -rf deps/level_zero/include
ln -s ${levelZero}/include/level_zero deps/level_zero/include
sed -i '/^#if defined(SYCL_LANGUAGE_VERSION) && defined (__INTEL_LLVM_COMPILER)$/,/^#endif$/c\
#cmakedefine CCL_ENABLE_SYCL\
#cmakedefine CCL_ENABLE_ZE' include/oneapi/ccl/config.h.in
sed -i 's/^#define ICPX_VERSION 0$/#define ICPX_VERSION 140000/' src/common/utils/sycl_utils.hpp
sed -i '/^inline sycl::event get_last_event(const sycl::queue &q) {$/, /^inline sycl::event submit_wait_on_events(sycl::queue q, const std::vector<sycl::event> &deps) {$/c\
inline sycl::event get_last_event(const sycl::queue &q) {\
auto last_event_opt = q.ext_oneapi_get_last_event();\
if (last_event_opt.has_value()) {\
return last_event_opt.value();\
}\
return sycl::event{};\
}\
\
inline sycl::event submit_wait_on_events(sycl::queue q, const std::vector<sycl::event> \&deps) {' src/coll/algorithms/utils/sycl_coll_base.hpp
find src -type f \( -name '*.hpp' -o -name '*.cpp' \) \
-exec sed -i 's/reqd_sub_group_size(sg_size)/reqd_sub_group_size(32)/g' {} +
awk '
pending {
if ($0 ~ /^[[:space:]]*send_buf, new_send_count,/) {
sub(/send_buf, new_send_count,/, "q, send_buf, new_send_count,")
}
pending = 0
}
/^[[:space:]]*e = allgatherv_large\($/ {
pending = 1
}
{ print }
' src/coll/algorithms/allgatherv/sycl/allgatherv_sycl.cpp \
> src/coll/algorithms/allgatherv/sycl/allgatherv_sycl.cpp.tmp
mv src/coll/algorithms/allgatherv/sycl/allgatherv_sycl.cpp.tmp \
src/coll/algorithms/allgatherv/sycl/allgatherv_sycl.cpp
'';
cmakeFlags = (cmakeSccacheAttrs.cmakeFlags or [ ]) ++ [
"-DCMAKE_INSTALL_INCLUDEDIR=include"
"-DINTEL_SYCL_INCLUDE_DIRS=${intelSyclDev}/include"
"-DINTEL_SYCL_LIBRARIES=${intelSyclLib}/lib/libsycl.so"
];
buildInputs = (old.buildInputs or [ ]) ++ [ openclHeaders ];
meta = (old.meta or { }) // {
broken = false;
};
}
);
oneapi-dpl =
let
version = "2022.11.1";
in
modify prev.oneapi-dpl (old:
(versionBumpAttrs old.version version {
inherit version;
src = prev.fetchFromGitHub {
owner = "uxlfoundation";
repo = "oneDPL";
rev = "oneDPL-${version}-release";
hash = "sha256-NfyV34mdKfCxlU+l6ETKWcC9MwvVEgwcBedtLe6WCV4=";
};
meta = (old.meta or { }) // {
changelog = "https://github.com/uxlfoundation/oneDPL/releases/tag/oneDPL-${version}-release";
};
})
// (mkCmakeSccacheAttrs old)
);
llama-cpp = modify prev.llama-cpp (
old:
let
version = "8124";
in
(versionBumpAttrs old.version version {
inherit version;
src = prev.fetchFromGitHub {
owner = "ggml-org";
repo = "llama.cpp";
tag = "b${version}";
hash = old.src.hash;
};
})
// (mkCmakeSccacheAttrs old)
);
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
(pyFinal: pyPrev: {
haystack-ai = modify pyPrev.haystack-ai (
old:
let
version = "2.24.1";
in
(versionBumpAttrs old.version version {
inherit version;
src = final.fetchFromGitHub {
owner = "deepset-ai";
repo = "haystack";
rev = "v${version}";
hash = "sha256-tlQ3Bp+HcIsmoUoOMkm2APUSgNcdsujMUnSx+un/r8c=";
};
})
// {
propagatedBuildInputs =
(old.propagatedBuildInputs or [ ])
++ (with pyPrev; [
docstring-parser
filetype
jinja2
openai
])
++ [
pyFinal."haystack-experimental"
];
meta = (old.meta or { }) // {
broken = false;
};
}
);
sseclient-py = modify pyPrev.sseclient-py (old: rec {
format = "pyproject";
nativeBuildInputs =
(old.nativeBuildInputs or [ ])
++ (with pyPrev; [
hatchling
#pypaBuildHook
#pypaInstallHook
]);
doCheck = false;
});
vllm = modify pyPrev.vllm (
old:
let
version = "0.17.1";
in
versionBumpAttrs old.version version {
inherit version;
src = final.fetchFromGitHub {
owner = "vllm-project";
repo = "vllm";
rev = "v${version}";
hash = "sha256-EZozwA+GIjN8/CBNhtdeM3HsPhVdx1/J0B9gvvn2qKU=";
};
}
);
})
];
lutris-unwrapped = modify prev.lutris-unwrapped (
old:
let
version = "0.5.22";
in
versionBumpAttrs old.version version {
inherit version;
src = prev.fetchFromGitHub {
owner = "lutris";
repo = "lutris";
tag = "v${version}";
hash = "sha256-4mNknvfJQJEPZjQoNdKLQcW4CI93D6BUDPj8LtD940A=";
};
}
);
winetricks = modify prev.winetricks (old: {
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ final.makeWrapper ];
postFixup = (old.postFixup or "") + ''
wrapProgram "$out/bin/winetricks" \
--prefix PATH : "${final.lib.makeBinPath [ winePkg ]}" \
--set-default WINE "${winePkg}/bin/wine" \
--run 'wine_dir="$(${final.coreutils}/bin/dirname "$(${final.coreutils}/bin/readlink -f "$WINE")")"' \
--run ': "''${WINE_BIN:=$wine_dir/.wine}"' \
--run 'export WINE WINESERVER WINE_BIN WINESERVER_BIN'
'';
});
# winetricks = prev.winetricks.overrideAttrs (
# old:
# let
# version = "20260125";
# in
# {
# inherit version;
# src = final.fetchurl {
# url = "https://github.com/Winetricks/winetricks/archive/refs/tags/${version}.tar.gz";
# hash = "sha256-KJC9n7ut5GOOWLSZmiNycxkt8DtYUWrnuHceCcItL1Y=";
# };
# }
# );
}