diff --git a/custom/modules/default.nix b/custom/modules/default.nix index 38ab417..ff5c2ac 100644 --- a/custom/modules/default.nix +++ b/custom/modules/default.nix @@ -6,7 +6,14 @@ }: { 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 = [ { name = "gpu"; diff --git a/custom/modules/kernel.nix b/custom/modules/kernel.nix index d1170cc..c98c319 100644 --- a/custom/modules/kernel.nix +++ b/custom/modules/kernel.nix @@ -2,12 +2,16 @@ pkgs, lib, kernel-src, + buildLinux, structuredExtraConfig ? { }, kernelPatches ? [ ], extraConfig ? "", sccacheDir ? "/var/cache/sccache/nix-builds/kernel", sccacheServerUds ? null, enforceSccache ? true, + features ? { }, + randstructSeed ? null, + ... }: let @@ -30,156 +34,160 @@ let kver = "${V}.${P}.${S}${E}"; in -pkgs.callPackage ( - { buildLinux, ... }@args: - let - llvm = pkgs.llvmPackages_latest; - rust = pkgs.rustc-unwrapped; +let + args = { + inherit + buildLinux + features + randstructSeed + ; + }; + llvm = pkgs.llvmPackages_latest; + rust = pkgs.rustc-unwrapped; - buildPkgs = args.buildPackages or pkgs.buildPackages; - buildLlvm = buildPkgs.llvmPackages_latest; - llvmBuildPackages = buildPkgs // { - stdenv = buildLlvm.stdenv; - }; + buildPkgs = args.buildPackages or pkgs.buildPackages; + buildLlvm = buildPkgs.llvmPackages_latest; + llvmBuildPackages = buildPkgs // { + stdenv = buildLlvm.stdenv; + }; - realClang = lib.getExe llvm.clang-unwrapped; - realLd = lib.getExe' llvm.lld "ld.lld"; - realAr = lib.getExe' llvm.llvm "llvm-ar"; - realNm = lib.getExe' llvm.llvm "llvm-nm"; - realStrip = lib.getExe' llvm.llvm "llvm-strip"; - realObjcopy = lib.getExe' llvm.llvm "llvm-objcopy"; - realObjdump = lib.getExe' llvm.llvm "llvm-objdump"; - realReadelf = lib.getExe' llvm.llvm "llvm-readelf"; + realClang = lib.getExe llvm.clang-unwrapped; + realLd = lib.getExe' llvm.lld "ld.lld"; + realAr = lib.getExe' llvm.llvm "llvm-ar"; + realNm = lib.getExe' llvm.llvm "llvm-nm"; + realStrip = lib.getExe' llvm.llvm "llvm-strip"; + realObjcopy = lib.getExe' llvm.llvm "llvm-objcopy"; + realObjdump = lib.getExe' llvm.llvm "llvm-objdump"; + realReadelf = lib.getExe' llvm.llvm "llvm-readelf"; - realHostCC = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}cc"; - realHostCXX = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}c++"; - realHostAr = lib.getExe' buildLlvm.llvm "llvm-ar"; - realHostLd = lib.getExe' buildLlvm.lld "ld.lld"; - realRustc = lib.getExe' rust "rustc"; - realHostRustc = realRustc; - sccacheConfig = pkgs.writeText "kernel-sccache.conf" '' - [cache.disk] - dir = "${sccacheDir}" - size = "100G" + realHostCC = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}cc"; + realHostCXX = lib.getExe' buildLlvm.stdenv.cc "${buildLlvm.stdenv.cc.targetPrefix}c++"; + realHostAr = lib.getExe' buildLlvm.llvm "llvm-ar"; + realHostLd = lib.getExe' buildLlvm.lld "ld.lld"; + realRustc = lib.getExe' rust "rustc"; + realHostRustc = realRustc; + sccacheConfig = pkgs.writeText "kernel-sccache.conf" '' + [cache.disk] + dir = "${sccacheDir}" + 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 = - name: compiler: - pkgs.writeShellScriptBin name '' - set -euo pipefail + clangSccache = mkSccacheWrapper "clang" realClang; + hostccSccache = mkSccacheWrapper "cc" realHostCC; + hostcxxSccache = mkSccacheWrapper "c++" realHostCXX; + 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} ${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; - hostccSccache = mkSccacheWrapper "cc" realHostCC; - hostcxxSccache = mkSccacheWrapper "c++" realHostCXX; - 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 '' + buildPhase = + 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 + ''); - buildPhase = - 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 ""; - postBuild = args.postBuild or ""; + structuredExtraConfig = structuredExtraConfig'; - structuredExtraConfig = structuredExtraConfig'; + ignoreConfigErrors = true; - ignoreConfigErrors = true; - - extraMeta.branch = "${V}.${P}"; - } - ) -) { } + extraMeta.branch = "${V}.${P}"; + } +)