nix-cachyos-kernel/kernel-cachyos/mkCachyKernel.nix

130 lines
3.5 KiB
Nix

{
inputs,
lib,
callPackage,
buildLinux,
stdenv,
kernelPatches,
...
}:
lib.makeOverridable (
{
pname,
version,
src,
# Kernel config variant to be used as defconfig, e.g. "linux-cachyos-lts".
# See https://github.com/CachyOS/linux-cachyos for available values.
configVariant,
# Set to true to enable Clang+ThinLTO.
lto,
# Patches to be applied in patchedSrc phase. This is different from buildLinux's kernelPatches.
prePatch ? "",
patches ? [ ],
postPatch ? "",
# See nixpkgs/pkgs/os-specific/linux/kernel/generic.nix for additional options.
# Additional args are passed to buildLinux.
...
}@args:
let
helpers = callPackage ../helpers.nix { };
inherit (helpers) stdenvLLVM ltoMakeflags;
splitted = lib.splitString "-" version;
ver0 = builtins.elemAt splitted 0;
major = lib.versions.pad 2 ver0;
fullVersion = lib.versions.pad 3 ver0;
cachyosConfigFile = "${inputs.cachyos-kernel.outPath}/${configVariant}/config";
cachyosPatch = "${inputs.cachyos-kernel-patches.outPath}/${major}/all/0001-cachyos-base-all.patch";
# buildLinux doesn't accept postPatch, so adding config file early here
patchedSrc = stdenv.mkDerivation {
pname = "${pname}-src";
inherit version src prePatch;
patches = [
kernelPatches.bridge_stp_helper.patch
kernelPatches.request_key_helper.patch
cachyosPatch
]
++ patches;
postPatch = ''
install -Dm644 ${cachyosConfigFile} arch/x86/configs/cachyos_defconfig
''
+ postPatch;
dontConfigure = true;
dontBuild = true;
dontFixup = true;
installPhase = ''
mkdir -p $out
cp -r * $out/
'';
};
defaultLocalVersion = if lto then "-cachyos-lto" else "-cachyos";
in
buildLinux (
(lib.removeAttrs args [
"pname"
"version"
"src"
"configVariant"
"lto"
"prePatch"
"patches"
"postPatch"
])
// {
inherit pname version;
src = patchedSrc;
stdenv = args.stdenv or (if lto then stdenvLLVM else stdenv);
extraMakeFlags = (lib.optionals lto ltoMakeflags) ++ (args.extraMakeFlags or [ ]);
defconfig = args.defconfig or "cachyos_defconfig";
modDirVersion = args.modDirVersion or "${fullVersion}${defaultLocalVersion}";
# Clang has some incompatibilities with NixOS's default kernel config
ignoreConfigErrors = args.ignoreConfigErrors or lto;
structuredExtraConfig =
with lib.kernel;
(
{
NR_CPUS = lib.mkForce (option (freeform "8192"));
LOCALVERSION = freeform defaultLocalVersion;
# Follow NixOS default config to not break etc overlay
OVERLAY_FS = module;
OVERLAY_FS_REDIRECT_DIR = no;
OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW = yes;
OVERLAY_FS_INDEX = no;
OVERLAY_FS_XINO_AUTO = no;
OVERLAY_FS_METACOPY = no;
OVERLAY_FS_DEBUG = no;
}
// (lib.optionalAttrs lto {
LTO_NONE = no;
LTO_CLANG_THIN = yes;
})
// (args.structuredExtraConfig or { })
);
extraMeta = {
description = "Linux CachyOS Kernel" + lib.optionalString lto " with Clang+ThinLTO";
broken = !stdenv.isx86_64;
}
// (args.extraMeta or { });
extraPassthru = {
inherit cachyosConfigFile cachyosPatch;
}
// (args.extraPassthru or { });
}
)
)