Make custom kernel accept boot.kernelPatches

This commit is contained in:
TheK0tYaRa 2026-03-17 23:47:55 +02:00
parent 91fb4b5fbe
commit 40bcae409d
2 changed files with 153 additions and 138 deletions

View file

@ -6,7 +6,14 @@
}: }:
{ {
boot = { boot = {
kernelPackages = pkgs.linuxPackagesFor (import ./kernel.nix { inherit pkgs lib kernel-src; }); kernelPackages = pkgs.linuxPackagesFor (pkgs.callPackage ./kernel.nix {
inherit lib kernel-src;
structuredExtraConfig = { };
kernelPatches = [ ];
extraConfig = "";
features = { };
randstructSeed = null;
});
kernelPatches = [ kernelPatches = [
{ {
name = "gpu"; name = "gpu";

View file

@ -2,12 +2,16 @@
pkgs, pkgs,
lib, lib,
kernel-src, kernel-src,
buildLinux,
structuredExtraConfig ? { }, structuredExtraConfig ? { },
kernelPatches ? [ ], kernelPatches ? [ ],
extraConfig ? "", extraConfig ? "",
sccacheDir ? "/var/cache/sccache/nix-builds/kernel", sccacheDir ? "/var/cache/sccache/nix-builds/kernel",
sccacheServerUds ? null, sccacheServerUds ? null,
enforceSccache ? true, enforceSccache ? true,
features ? { },
randstructSeed ? null,
...
}: }:
let let
@ -30,156 +34,160 @@ let
kver = "${V}.${P}.${S}${E}"; kver = "${V}.${P}.${S}${E}";
in in
pkgs.callPackage ( let
{ buildLinux, ... }@args: args = {
let inherit
llvm = pkgs.llvmPackages_latest; buildLinux
rust = pkgs.rustc-unwrapped; features
randstructSeed
;
};
llvm = pkgs.llvmPackages_latest;
rust = pkgs.rustc-unwrapped;
buildPkgs = args.buildPackages or pkgs.buildPackages; buildPkgs = args.buildPackages or pkgs.buildPackages;
buildLlvm = buildPkgs.llvmPackages_latest; buildLlvm = buildPkgs.llvmPackages_latest;
llvmBuildPackages = buildPkgs // { llvmBuildPackages = buildPkgs // {
stdenv = buildLlvm.stdenv; stdenv = buildLlvm.stdenv;
}; };
realClang = lib.getExe llvm.clang-unwrapped; realClang = lib.getExe llvm.clang-unwrapped;
realLd = lib.getExe' llvm.lld "ld.lld"; realLd = lib.getExe' llvm.lld "ld.lld";
realAr = lib.getExe' llvm.llvm "llvm-ar"; realAr = lib.getExe' llvm.llvm "llvm-ar";
realNm = lib.getExe' llvm.llvm "llvm-nm"; realNm = lib.getExe' llvm.llvm "llvm-nm";
realStrip = lib.getExe' llvm.llvm "llvm-strip"; realStrip = lib.getExe' llvm.llvm "llvm-strip";
realObjcopy = lib.getExe' llvm.llvm "llvm-objcopy"; realObjcopy = lib.getExe' llvm.llvm "llvm-objcopy";
realObjdump = lib.getExe' llvm.llvm "llvm-objdump"; realObjdump = lib.getExe' llvm.llvm "llvm-objdump";
realReadelf = lib.getExe' llvm.llvm "llvm-readelf"; realReadelf = lib.getExe' llvm.llvm "llvm-readelf";
realHostCC = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}cc"; realHostCC = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}cc";
realHostCXX = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}c++"; realHostCXX = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}c++";
realHostAr = lib.getExe' buildLlvm.llvm "llvm-ar"; realHostAr = lib.getExe' buildLlvm.llvm "llvm-ar";
realHostLd = lib.getExe' buildLlvm.lld "ld.lld"; realHostLd = lib.getExe' buildLlvm.lld "ld.lld";
realRustc = lib.getExe' rust "rustc"; realRustc = lib.getExe' rust "rustc";
realHostRustc = realRustc; realHostRustc = realRustc;
sccacheConfig = pkgs.writeText "kernel-sccache.conf" '' sccacheConfig = pkgs.writeText "kernel-sccache.conf" ''
[cache.disk] [cache.disk]
dir = "${sccacheDir}" dir = "${sccacheDir}"
size = "100G" size = "100G"
'';
mkSccacheWrapper =
name: compiler:
pkgs.writeShellScriptBin name ''
set -euo pipefail
export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
: > "''${SCCACHE_ENFORCE_MARKER}"
fi
exec ${pkgs.sccache}/bin/sccache ${compiler} "$@"
''; '';
mkSccacheWrapper = clangSccache = mkSccacheWrapper "clang" realClang;
name: compiler: hostccSccache = mkSccacheWrapper "cc" realHostCC;
pkgs.writeShellScriptBin name '' hostcxxSccache = mkSccacheWrapper "c++" realHostCXX;
set -euo pipefail rustcSccache = pkgs.writeShellScriptBin "rustc" ''
set -euo pipefail
export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
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_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
: > "''${SCCACHE_ENFORCE_MARKER}"
fi
exec ${pkgs.sccache}/bin/sccache ${realHostRustc} "$@"
'';
structuredExtraConfig' =
(with lib.kernel; {
LTO_CLANG_THIN = yes;
# LTO_CLANG_FULL = no;
# LTO_NONE = no;
})
// structuredExtraConfig;
in
buildLinux (
args
// {
inherit kernelPatches extraConfig;
version = kver;
modDirVersion = kver;
src = kernel-src;
stdenv = llvm.stdenv;
buildPackages = llvmBuildPackages;
extraMakeFlags =
(args.extraMakeFlags or [ ])
++ [
"LLVM=1"
"LLVM_IAS=1"
"CC=${if enforceSccache then lib.getExe clangSccache else realClang}"
"LD=${realLd}"
"AR=${realAr}"
"NM=${realNm}"
"STRIP=${realStrip}"
"OBJCOPY=${realObjcopy}"
"OBJDUMP=${realObjdump}"
"READELF=${realReadelf}"
"HOSTCC=${if enforceSccache then lib.getExe hostccSccache else realHostCC}"
"HOSTCXX=${if enforceSccache then lib.getExe hostcxxSccache else realHostCXX}"
"HOSTAR=${realHostAr}"
"HOSTLD=${realHostLd}"
"RUSTC=${if enforceSccache then lib.getExe rustcSccache else realRustc}"
"HOSTRUSTC=${if enforceSccache then lib.getExe hostrustcSccache else realHostRustc}"
]
;
preBuild =
(args.preBuild or "")
+ lib.optionalString enforceSccache ''
mkdir -p ${lib.escapeShellArg sccacheDir}
export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig} export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"} ${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
: > "''${SCCACHE_ENFORCE_MARKER}"
fi
exec ${pkgs.sccache}/bin/sccache ${compiler} "$@"
''; '';
clangSccache = mkSccacheWrapper "clang" realClang; buildPhase =
hostccSccache = mkSccacheWrapper "cc" realHostCC; if enforceSccache then
hostcxxSccache = mkSccacheWrapper "c++" realHostCXX; ''
rustcSccache = pkgs.writeShellScriptBin "rustc" '' runHook preBuild
set -euo pipefail
export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
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_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
if [ -n "''${SCCACHE_ENFORCE_MARKER-}" ]; then
: > "''${SCCACHE_ENFORCE_MARKER}"
fi
exec ${pkgs.sccache}/bin/sccache ${realHostRustc} "$@"
'';
structuredExtraConfig' =
(with lib.kernel; {
LTO_CLANG_THIN = yes;
# LTO_CLANG_FULL = no;
# LTO_NONE = no;
})
// structuredExtraConfig;
in
buildLinux (
args
// {
inherit kernelPatches extraConfig;
version = kver;
modDirVersion = kver;
src = kernel-src;
stdenv = llvm.stdenv;
buildPackages = llvmBuildPackages;
extraMakeFlags =
(args.extraMakeFlags or [ ])
++ [
"LLVM=1"
"LLVM_IAS=1"
"CC=${if enforceSccache then lib.getExe clangSccache else realClang}"
"LD=${realLd}"
"AR=${realAr}"
"NM=${realNm}"
"STRIP=${realStrip}"
"OBJCOPY=${realObjcopy}"
"OBJDUMP=${realObjdump}"
"READELF=${realReadelf}"
"HOSTCC=${if enforceSccache then lib.getExe hostccSccache else realHostCC}"
"HOSTCXX=${if enforceSccache then lib.getExe hostcxxSccache else realHostCXX}"
"HOSTAR=${realHostAr}"
"HOSTLD=${realHostLd}"
"RUSTC=${if enforceSccache then lib.getExe rustcSccache else realRustc}"
"HOSTRUSTC=${if enforceSccache then lib.getExe hostrustcSccache else realHostRustc}"
]
;
preBuild =
(args.preBuild or "")
+ lib.optionalString enforceSccache ''
mkdir -p ${lib.escapeShellArg sccacheDir} mkdir -p ${lib.escapeShellArg sccacheDir}
export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig} export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"} ${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
''; export SCCACHE_ENFORCE_MARKER="$NIX_BUILD_TOP/.sccache-used"
rm -f "$SCCACHE_ENFORCE_MARKER"
make "''${makeFlags[@]}" "''${buildFlags[@]}"
if [ ! -e "$SCCACHE_ENFORCE_MARKER" ]; then
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
'');
buildPhase = postBuild = args.postBuild or "";
if enforceSccache then
''
runHook preBuild
mkdir -p ${lib.escapeShellArg sccacheDir}
export SCCACHE_CONF=${lib.escapeShellArg sccacheConfig}
${lib.optionalString (sccacheServerUds != null) "export SCCACHE_SERVER_UDS=${lib.escapeShellArg sccacheServerUds}"}
export SCCACHE_ENFORCE_MARKER="$NIX_BUILD_TOP/.sccache-used"
rm -f "$SCCACHE_ENFORCE_MARKER"
make "''${makeFlags[@]}" "''${buildFlags[@]}"
if [ ! -e "$SCCACHE_ENFORCE_MARKER" ]; then
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'; ignoreConfigErrors = true;
ignoreConfigErrors = true; extraMeta.branch = "${V}.${P}";
}
extraMeta.branch = "${V}.${P}"; )
}
)
) { }