linux: ability to merge structured configs
This should make the composability of kernel configurations more straigthforward. - now distinguish freeform options from tristate ones - will look for a structured config in kernelPatches too one can now access the structuredConfig from a kernel via linux_test.configfile.structuredConfig in order to reinject it into another kernel, no need to rewrite the config from scratch The following merge strategies are used in case of conflict: -- freeform items must be equal or they conflict (mergeEqualOption) -- for tristate (y/m/n) entries, I use the mergeAnswer strategy which takes the best available value, "best" being defined by the user (by default "y" > "m" > "n", e.g. if one entry is both marked "y" and "n", "y" wins) -- if one item is both marked optional/mandatory, mandatory wins (mergeFalseByDefault)
This commit is contained in:
@@ -47,7 +47,6 @@
|
||||
, preferBuiltin ? stdenv.hostPlatform.platform.kernelPreferBuiltin or false
|
||||
, kernelArch ? stdenv.hostPlatform.platform.kernelArch
|
||||
|
||||
, mkValueOverride ? null
|
||||
, ...
|
||||
}:
|
||||
|
||||
@@ -68,20 +67,26 @@ let
|
||||
ia32Emulation = true;
|
||||
} // features) kernelPatches;
|
||||
|
||||
intermediateNixConfig = import ./common-config.nix {
|
||||
inherit stdenv version structuredExtraConfig mkValueOverride;
|
||||
|
||||
# append extraConfig for backwards compatibility but also means the user can't override the kernelExtraConfig part
|
||||
extraConfig = extraConfig + lib.optionalString (stdenv.hostPlatform.platform ? kernelExtraConfig) stdenv.hostPlatform.platform.kernelExtraConfig;
|
||||
commonStructuredConfig = import ./common-config.nix {
|
||||
inherit stdenv version ;
|
||||
|
||||
features = kernelFeatures; # Ensure we know of all extra patches, etc.
|
||||
};
|
||||
|
||||
kernelConfigFun = baseConfig:
|
||||
# extra config in legacy string format
|
||||
extraConfig = extraConfig + lib.optionalString (stdenv.hostPlatform.platform ? kernelExtraConfig) stdenv.hostPlatform.platform.kernelExtraConfig;
|
||||
|
||||
intermediateNixConfig = configfile.moduleStructuredConfig.intermediateNixConfig;
|
||||
|
||||
structuredConfigFromPatches =
|
||||
map ({extraStructuredConfig ? {}, ...}: {settings=extraStructuredConfig;}) kernelPatches;
|
||||
|
||||
# appends kernel patches extraConfig
|
||||
kernelConfigFun = baseConfigStr:
|
||||
let
|
||||
configFromPatches =
|
||||
map ({extraConfig ? "", ...}: extraConfig) kernelPatches;
|
||||
in lib.concatStringsSep "\n" ([baseConfig] ++ configFromPatches);
|
||||
in lib.concatStringsSep "\n" ([baseConfigStr] ++ configFromPatches);
|
||||
|
||||
configfile = stdenv.mkDerivation {
|
||||
inherit ignoreConfigErrors autoModules preferBuiltin kernelArch;
|
||||
@@ -131,7 +136,30 @@ let
|
||||
installPhase = "mv $buildRoot/.config $out";
|
||||
|
||||
enableParallelBuilding = true;
|
||||
};
|
||||
|
||||
passthru = rec {
|
||||
|
||||
module = import ../../../../nixos/modules/system/boot/kernel_config.nix;
|
||||
# used also in apache
|
||||
# { modules = [ { options = res.options; config = svc.config or svc; } ];
|
||||
# check = false;
|
||||
# The result is a set of two attributes
|
||||
moduleStructuredConfig = (lib.evalModules {
|
||||
modules = [
|
||||
module
|
||||
{ settings = commonStructuredConfig; }
|
||||
{ settings = structuredExtraConfig; }
|
||||
]
|
||||
++ structuredConfigFromPatches
|
||||
;
|
||||
}).config;
|
||||
|
||||
#
|
||||
structuredConfig = moduleStructuredConfig.settings;
|
||||
};
|
||||
|
||||
|
||||
}; # end of configfile derivation
|
||||
|
||||
kernel = (callPackage ./manual-config.nix {}) {
|
||||
inherit version modDirVersion src kernelPatches stdenv extraMeta configfile;
|
||||
@@ -141,6 +169,7 @@ let
|
||||
|
||||
passthru = {
|
||||
features = kernelFeatures;
|
||||
inherit commonStructuredConfig;
|
||||
passthru = kernel.passthru // (removeAttrs passthru [ "passthru" ]);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user