nixos-conf/custom/override.nix

736 lines
23 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";
mkRealCompilerBasePath =
{
name,
toolchain,
}:
final.runCommand name { } ''
resolve_orig_cc_root() {
local current_root="$1"
local next_root
while [ -r "$current_root/nix-support/orig-cc" ]; do
next_root="$(tr -d '\n' < "$current_root/nix-support/orig-cc")"
if [ -z "$next_root" ] || [ "$next_root" = "$current_root" ]; then
break
fi
current_root="$next_root"
done
printf '%s\n' "$current_root"
}
wrapped_clang="$(readlink -f ${toolchain}/bin/clang)"
wrapped_root="$(dirname "$(dirname "$wrapped_clang")")"
orig_cc_root="$(resolve_orig_cc_root "$wrapped_root")"
if [ -z "$orig_cc_root" ] || [ ! -d "$orig_cc_root/bin" ]; then
echo "mkRealCompilerBasePath: invalid orig-cc root: $orig_cc_root" >&2
exit 1
fi
if [ ! -x "$orig_cc_root/bin/clang" ] || [ ! -x "$orig_cc_root/bin/clang++" ]; then
echo "mkRealCompilerBasePath: clang or clang++ missing in $orig_cc_root/bin" >&2
exit 1
fi
mkdir -p "$out/bin"
for executable in ${toolchain}/bin/*; do
executable_name="$(basename "$executable")"
case "$executable_name" in
clang|clang++|cc|c++)
continue
;;
esac
ln -s "$executable" "$out/bin/$executable_name"
done
ln -s "$orig_cc_root/bin/clang" "$out/bin/clang"
ln -s "$orig_cc_root/bin/clang++" "$out/bin/clang++"
ln -s clang "$out/bin/cc"
ln -s clang++ "$out/bin/c++"
for path in ${toolchain}/*; do
path_name="$(basename "$path")"
if [ "$path_name" != bin ]; then
ln -s "$path" "$out/$path_name"
fi
done
'';
mkSccacheLauncher =
{
name,
sccacheDir ? null,
sccacheServerUds ? null,
sccacheCacheSize ? "100G",
noDaemon ? false,
passthroughWrappedCompiler ? false,
extraSetup ? "",
}:
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 response_file
for arg in "$@"; do
case "$arg" in
*CMakeFiles/*CompilerId*|*CMakeFiles/CMakeTmp/*|*CMakeScratch/*)
return 0
;;
@*)
response_file="''${arg#@}"
if [ -f "$response_file" ] && grep -Eq 'CMakeFiles/.+CompilerId|CMakeFiles/CMakeTmp|CMakeScratch' "$response_file"; then
return 0
fi
;;
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}
''}
${extraSetup}
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}
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}
export SCCACHE_WRAPPED_COMPILER_PASSTHROUGH=1
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
'';
postConfigure = (old.postConfigure or "") + ''
unset SCCACHE_WRAPPED_COMPILER_PASSTHROUGH
'';
postBuild = (old.postBuild or "") + ''
${sccacheLauncher}/bin/cmake-sccache --show-stats --stats-format text || true
${sccacheLauncher}/bin/cmake-sccache --stop-server || true
'';
};
mkSccacheExtraConfig =
{
sccacheDir ? sandboxSccacheDir,
extraConfig ? "",
}:
''
mkdir -p ${final.lib.escapeShellArg sccacheDir}
export SCCACHE_CONF=${final.lib.escapeShellArg (
final.writeText "sccache-stdenv.conf" ''
[cache.disk]
dir = "${sccacheDir}"
size = "100G"
''
)}
export SCCACHE_NO_DAEMON=1
unset SCCACHE_SERVER_UDS
${extraConfig}
'';
mkWrappedCcForSccache =
{
cc,
extraConfig ? "",
}:
let
wrappedCompiler = final.sccache.links {
inherit extraConfig;
unwrappedCC = cc.cc;
};
overrideArgs = cc.override.__functionArgs or { };
in
if overrideArgs ? cc then
cc.override { cc = wrappedCompiler; }
else if overrideArgs ? llvm then
cc.override { llvm = wrappedCompiler; }
else
throw "mkWrappedCcForSccache: unsupported compiler wrapper override interface";
mkSccacheStdenv =
{
stdenv,
sccacheDir ? "/var/cache/sccache/nix-builds/packages",
extraConfig ? "",
}:
final.overrideCC stdenv (
mkWrappedCcForSccache {
inherit (stdenv) cc;
extraConfig = mkSccacheExtraConfig {
inherit extraConfig sccacheDir;
};
}
);
in
{
sccache = modify prev.sccache (old: {
postPatch = (old.postPatch or "") + ''
substituteInPlace src/compiler/gcc.rs \
--replace-fail \
' take_arg!("-isystem", PathBuf, CanBeSeparated, PreprocessorArgumentPath),' \
' take_arg!("-isystem", PathBuf, CanBeSeparated, PreprocessorArgumentPath),
take_arg!("-cxx-isystem", PathBuf, CanBeSeparated, PreprocessorArgumentPath),'
'';
passthru = (old.passthru or { }) // {
links =
{ unwrappedCC, extraConfig ? "" }:
let
sccacheLauncher = mkSccacheLauncher {
name = "wrapped-sccache";
noDaemon = true;
extraSetup = extraConfig;
};
in
final.stdenv.mkDerivation {
pname = "sccache-links";
inherit (old) version;
passthru = {
isClang = unwrappedCC.isClang or false;
isGNU = unwrappedCC.isGNU or false;
isSccache = true;
dev = unwrappedCC.dev or null;
lib = unwrappedCC.lib or (final.lib.getLib unwrappedCC);
} // final.lib.optionalAttrs (unwrappedCC ? rsrc) {
inherit (unwrappedCC) rsrc;
};
dev = unwrappedCC.dev or null;
lib = unwrappedCC.lib or (final.lib.getLib unwrappedCC);
rsrc = unwrappedCC.rsrc or null;
nativeBuildInputs = [ final.makeWrapper ];
buildCommand =
let
targetPrefix =
if unwrappedCC.isClang or false then
""
else
(final.lib.optionalString (
unwrappedCC ? targetConfig && unwrappedCC.targetConfig != null && unwrappedCC.targetConfig != ""
) "${unwrappedCC.targetConfig}-");
in
''
mkdir -p $out/bin
mkdir -p $out/nix-support
wrap() {
local cname="${targetPrefix}$1"
if [ -x "${unwrappedCC}/bin/$cname" ]; then
makeWrapper ${sccacheLauncher}/bin/wrapped-sccache $out/bin/$cname \
--add-flags ${unwrappedCC}/bin/$cname
fi
}
wrap cc
wrap c++
wrap gcc
wrap g++
wrap clang
wrap clang++
for executable in $(ls ${unwrappedCC}/bin); do
if [ ! -x "$out/bin/$executable" ]; then
ln -s ${unwrappedCC}/bin/$executable $out/bin/$executable
fi
done
for file in $(ls ${unwrappedCC} | grep -vw bin); do
ln -s ${unwrappedCC}/$file $out/$file
done
printf '%s\n' "${unwrappedCC}" > $out/nix-support/orig-cc
'';
meta = final.lib.optionalAttrs (unwrappedCC.meta ? mainProgram) {
inherit (unwrappedCC.meta) mainProgram;
};
};
};
});
sccacheWrapper =
final.lib.makeOverridable (
{
extraConfig ? "",
cc,
}:
mkWrappedCcForSccache {
inherit cc extraConfig;
}
) {
extraConfig = "";
inherit (final.stdenv) cc;
};
sccacheStdenv = final.lib.lowPrio (
final.lib.makeOverridable (
{
stdenv,
...
}@extraArgs:
final.overrideCC stdenv (
final.buildPackages.sccacheWrapper.override (
{ inherit (stdenv) cc; }
// final.lib.optionalAttrs (builtins.hasAttr "extraConfig" extraArgs) {
extraConfig = extraArgs.extraConfig;
}
)
)
) {
inherit (final) stdenv;
}
);
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;
realElectronClangBasePath = mkRealCompilerBasePath {
name = "electron-real-clang-base";
toolchain = prev.electron_39.passthru.unwrapped.llvmCcAndBintools;
};
electronUnwrapped = modify prev.electron_39.passthru.unwrapped (
old:
let
buildSccacheAttrs = mkBuildSccacheAttrs old;
oldClangBasePath = "clang_base_path=\"${old.llvmCcAndBintools}\"";
newClangBasePath = "clang_base_path=\"${realElectronClangBasePath}\"";
baseGnFlags = builtins.replaceStrings
[ oldClangBasePath ]
[ newClangBasePath ]
(old.gnFlags or "");
electronGnFlags =
"${baseGnFlags} 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-math-sycl-blas = modify prev.oneapi-math-sycl-blas (
old: mkCmakeSccacheAttrs old
);
oneapi-math = modify prev.oneapi-math (
old: mkCmakeSccacheAttrs old
);
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=";
# };
# }
# );
}