Fixed kernel compile sccache caching
a little bit of chatgpt5.4 slop has fixed the kernel caching with sccache. Good stuff.
This commit is contained in:
parent
dd1c091312
commit
bbc6f283ed
2 changed files with 57 additions and 21 deletions
|
|
@ -33,6 +33,7 @@ pkgs.callPackage (
|
||||||
{ buildLinux, ... }@args:
|
{ buildLinux, ... }@args:
|
||||||
let
|
let
|
||||||
llvm = pkgs.llvmPackages_latest;
|
llvm = pkgs.llvmPackages_latest;
|
||||||
|
rust = pkgs.rustc-unwrapped;
|
||||||
|
|
||||||
# buildLinux uses common-flags.nix which sets CC to the *unwrapped* compiler:
|
# buildLinux uses common-flags.nix which sets CC to the *unwrapped* compiler:
|
||||||
# CC=${lib.getExe stdenv.cc.cc}
|
# CC=${lib.getExe stdenv.cc.cc}
|
||||||
|
|
@ -43,31 +44,54 @@ pkgs.callPackage (
|
||||||
buildPkgs = args.buildPackages or pkgs.buildPackages;
|
buildPkgs = args.buildPackages or pkgs.buildPackages;
|
||||||
realHostCC = lib.getExe' buildPkgs.stdenv.cc "${buildPkgs.stdenv.cc.targetPrefix}cc";
|
realHostCC = lib.getExe' buildPkgs.stdenv.cc "${buildPkgs.stdenv.cc.targetPrefix}cc";
|
||||||
realHostCXX = lib.getExe' buildPkgs.stdenv.cc "${buildPkgs.stdenv.cc.targetPrefix}c++";
|
realHostCXX = lib.getExe' buildPkgs.stdenv.cc "${buildPkgs.stdenv.cc.targetPrefix}c++";
|
||||||
|
realRustc = lib.getExe rust;
|
||||||
|
realHostRustc = realRustc;
|
||||||
|
|
||||||
clangSccache = pkgs.writeShellScriptBin "clang" ''
|
clangSccache = pkgs.writeShellScriptBin "clang" ''
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
: "''${SCCACHE_ENFORCE_MARKER:?SCCACHE_ENFORCE_MARKER is not set}"
|
|
||||||
: > "''${SCCACHE_ENFORCE_MARKER}"
|
|
||||||
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
||||||
|
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
|
||||||
|
: > "''${SCCACHE_ENFORCE_MARKER}"
|
||||||
|
fi
|
||||||
exec ${pkgs.sccache}/bin/sccache ${realClang} "$@"
|
exec ${pkgs.sccache}/bin/sccache ${realClang} "$@"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
hostccSccache = pkgs.writeShellScriptBin "cc" ''
|
hostccSccache = pkgs.writeShellScriptBin "cc" ''
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
: "''${SCCACHE_ENFORCE_MARKER:?SCCACHE_ENFORCE_MARKER is not set}"
|
|
||||||
: > "''${SCCACHE_ENFORCE_MARKER}"
|
|
||||||
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
||||||
|
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
|
||||||
|
: > "''${SCCACHE_ENFORCE_MARKER}"
|
||||||
|
fi
|
||||||
exec ${pkgs.sccache}/bin/sccache ${realHostCC} "$@"
|
exec ${pkgs.sccache}/bin/sccache ${realHostCC} "$@"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
hostcxxSccache = pkgs.writeShellScriptBin "c++" ''
|
hostcxxSccache = pkgs.writeShellScriptBin "c++" ''
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
: "''${SCCACHE_ENFORCE_MARKER:?SCCACHE_ENFORCE_MARKER is not set}"
|
|
||||||
: > "''${SCCACHE_ENFORCE_MARKER}"
|
|
||||||
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
||||||
|
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
|
||||||
|
: > "''${SCCACHE_ENFORCE_MARKER}"
|
||||||
|
fi
|
||||||
exec ${pkgs.sccache}/bin/sccache ${realHostCXX} "$@"
|
exec ${pkgs.sccache}/bin/sccache ${realHostCXX} "$@"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
rustcSccache = pkgs.writeShellScriptBin "rustc" ''
|
||||||
|
set -euo pipefail
|
||||||
|
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
||||||
|
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
|
||||||
|
: > "''${SCCACHE_ENFORCE_MARKER}"
|
||||||
|
fi
|
||||||
|
exec ${pkgs.sccache}/bin/sccache ${realRustc} "$@"
|
||||||
|
'';
|
||||||
|
|
||||||
|
hostrustcSccache = pkgs.writeShellScriptBin "rustc" ''
|
||||||
|
set -euo pipefail
|
||||||
|
export SCCACHE_DIR=${lib.escapeShellArg sccacheDir}
|
||||||
|
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
|
||||||
|
: > "''${SCCACHE_ENFORCE_MARKER}"
|
||||||
|
fi
|
||||||
|
exec ${pkgs.sccache}/bin/sccache ${realHostRustc} "$@"
|
||||||
|
'';
|
||||||
|
|
||||||
structuredExtraConfig' =
|
structuredExtraConfig' =
|
||||||
(with lib.kernel; {
|
(with lib.kernel; {
|
||||||
LTO_CLANG_THIN = yes;
|
LTO_CLANG_THIN = yes;
|
||||||
|
|
@ -97,29 +121,41 @@ pkgs.callPackage (
|
||||||
"CC=${lib.getExe clangSccache}"
|
"CC=${lib.getExe clangSccache}"
|
||||||
"HOSTCC=${lib.getExe hostccSccache}"
|
"HOSTCC=${lib.getExe hostccSccache}"
|
||||||
"HOSTCXX=${lib.getExe hostcxxSccache}"
|
"HOSTCXX=${lib.getExe hostcxxSccache}"
|
||||||
|
"RUSTC=${lib.getExe rustcSccache}"
|
||||||
|
"HOSTRUSTC=${lib.getExe hostrustcSccache}"
|
||||||
];
|
];
|
||||||
|
|
||||||
# Enforce that the wrappers were actually invoked at least once.
|
# Start with clean stats so the build-phase check reports only this build.
|
||||||
# sccache is a compiler wrapper; this is the contract we’re enforcing. :contentReference[oaicite:4]{index=4}
|
|
||||||
preBuild =
|
preBuild =
|
||||||
(args.preBuild or "")
|
(args.preBuild or "")
|
||||||
+ lib.optionalString enforceSccache ''
|
+ lib.optionalString enforceSccache ''
|
||||||
export SCCACHE_ENFORCE_MARKER="$NIX_BUILD_TOP/.sccache-used"
|
|
||||||
rm -f "$SCCACHE_ENFORCE_MARKER"
|
|
||||||
${pkgs.sccache}/bin/sccache --start-server || true
|
${pkgs.sccache}/bin/sccache --start-server || true
|
||||||
${pkgs.sccache}/bin/sccache --zero-stats || true
|
${pkgs.sccache}/bin/sccache --zero-stats || true
|
||||||
'';
|
'';
|
||||||
|
|
||||||
postBuild =
|
buildPhase =
|
||||||
(args.postBuild or "")
|
if enforceSccache then
|
||||||
+ lib.optionalString enforceSccache ''
|
''
|
||||||
if [ ! -e "$SCCACHE_ENFORCE_MARKER" ]; then
|
runHook preBuild
|
||||||
echo "FATAL: sccache enforcement failed: compiler wrappers were not invoked."
|
export SCCACHE_ENFORCE_MARKER="$NIX_BUILD_TOP/.sccache-used"
|
||||||
echo "This means buildLinux did not use your CC/HOSTCC overrides."
|
rm -f "$SCCACHE_ENFORCE_MARKER"
|
||||||
exit 1
|
make "''${makeFlags[@]}" "''${buildFlags[@]}"
|
||||||
fi
|
if [ ! -e "$SCCACHE_ENFORCE_MARKER" ]; then
|
||||||
${pkgs.sccache}/bin/sccache --show-stats --stats-format text || true
|
echo "FATAL: sccache enforcement failed during buildPhase: compiler wrappers were not invoked."
|
||||||
'';
|
echo "This means the build stage did not use your CC/HOSTCC/HOSTCXX/RUSTC/HOSTRUSTC overrides."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
${pkgs.sccache}/bin/sccache --show-stats --stats-format text || true
|
||||||
|
runHook postBuild
|
||||||
|
''
|
||||||
|
else
|
||||||
|
(args.buildPhase or ''
|
||||||
|
runHook preBuild
|
||||||
|
make "''${makeFlags[@]}" "''${buildFlags[@]}"
|
||||||
|
runHook postBuild
|
||||||
|
'');
|
||||||
|
|
||||||
|
postBuild = args.postBuild or "";
|
||||||
|
|
||||||
structuredExtraConfig = structuredExtraConfig';
|
structuredExtraConfig = structuredExtraConfig';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@
|
||||||
kernel-src = inputs.kernel-src;
|
kernel-src = inputs.kernel-src;
|
||||||
};
|
};
|
||||||
modules = [
|
modules = [
|
||||||
# ./custom/modules
|
./custom/modules
|
||||||
ragenix.nixosModules.default
|
ragenix.nixosModules.default
|
||||||
niri-flake.nixosModules.niri
|
niri-flake.nixosModules.niri
|
||||||
nix-index-database.nixosModules.default
|
nix-index-database.nixosModules.default
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue