nixos-conf/custom/modules/llvm-ccache-stdenv.nix
2026-03-05 19:27:26 +02:00

102 lines
No EOL
3.4 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ config, lib, ... }:
let
cfg = config.programs.ccache;
in
if false then {
config = lib.mkIf cfg.enable {
nix.settings.extra-sandbox-paths = [ cfg.cacheDir ];
nixpkgs.overlays = [
(final: prev:
let
llvm = prev.llvmPackages_latest;
realClang = llvm.clang-unwrapped;
realClangLib = prev.lib.getLib realClang;
# "unwrapped clang", но с ccache + per-package CCACHE_DIR
clangUnwrappedCcache =
prev.stdenvNoCC.mkDerivation {
pname = "clang-unwrapped-ccache";
version = realClang.version;
outputs = [ "out" "lib" ];
dontUnpack = true;
installPhase = ''
mkdir -p "$out/bin" "$lib/lib"
mkwrap() {
local name="$1"
local real="$2"
cat > "$out/bin/$name" <<'EOF'
#!${prev.bash}/bin/bash
set -euo pipefail
# Kernel probes compiler via: $CC -E -P -x c -
# Bypass ccache + filesystem touching for preprocess-only probes.
for arg in "$@"; do
if [ "$arg" = "-E" ]; then
exec __REAL__ "$@"
fi
done
# base cache dir from NixOS module
base='${cfg.cacheDir}'
# prefer pname (no version), fallback to name, and strip "-<digit>..." if present
pkg="''${pname-}"
if [ -z "$pkg" ]; then pkg="''${name-unknown}"; fi
pkg="''${pkg%%-[0-9]*}"
# If cache dir isn't writable/mounted in sandbox yet, don't break compiler detection.
if ! mkdir -p "$base/$pkg" 2>/dev/null; then
exec __REAL__ "$@"
fi
export CCACHE_DIR="$base/$pkg"
export CCACHE_UMASK=007
# improves hit rate for repeated local rebuilds
export CCACHE_BASEDIR="''${NIX_BUILD_TOP:-/build}"
export CCACHE_COMPRESS=1
export CCACHE_SLOPPINESS=random_seed,time_macros
exec ${prev.ccache}/bin/ccache __REAL__ "$@"
EOF
substituteInPlace "$out/bin/$name" --replace "__REAL__" "$real"
chmod +x "$out/bin/$name"
}
mkwrap clang ${realClang}/bin/clang
mkwrap clang++ ${realClang}/bin/clang++
ln -s "$out/bin/clang" "$out/bin/cc"
ln -s "$out/bin/clang++" "$out/bin/c++"
# make lib.getLib(stdenv.cc.cc) point to real clang builtin headers
ln -s ${realClangLib}/lib/clang "$lib/lib/clang"
'';
meta = (realClang.meta or { }) // {
mainProgram = "clang";
};
};
# Wrapped clang package that points its "unwrapped" to our ccache one
clangWrappedCcache = llvm.clang.override { cc = clangUnwrappedCcache; };
# New stdenv: same llvm stdenv, but compiler wrapper uses our ccache-unwrapped clang
llvmCcacheStdenv = prev.overrideCC llvm.stdenv clangWrappedCcache;
in
{
llvmPackages_latest = llvm // {
stdenv = llvmCcacheStdenv;
clang = clangWrappedCcache;
clang-unwrapped = clangUnwrappedCcache;
};
})
];
};
} else {}