102 lines
No EOL
3.4 KiB
Nix
102 lines
No EOL
3.4 KiB
Nix
{ 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 {} |