kernel: fix config generation
Addresses https://github.com/NixOS/nixpkgs/issues/71803: Kernel options are not merged as described, especially the "optional" aspects. The error silences legitimate warnings.
This commit is contained in:
parent
ae6bdcc535
commit
b9a4e6953d
|
@ -8,10 +8,10 @@ with lib;
|
||||||
option = x:
|
option = x:
|
||||||
x // { optional = true; };
|
x // { optional = true; };
|
||||||
|
|
||||||
yes = { tristate = "y"; };
|
yes = { tristate = "y"; optional = false; };
|
||||||
no = { tristate = "n"; };
|
no = { tristate = "n"; optional = false; };
|
||||||
module = { tristate = "m"; };
|
module = { tristate = "m"; optional = false; };
|
||||||
freeform = x: { freeform = x; };
|
freeform = x: { freeform = x; optional = false; };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Common patterns/legacy used in common-config/hardened-config.nix
|
Common patterns/legacy used in common-config/hardened-config.nix
|
||||||
|
|
|
@ -22,7 +22,7 @@ let
|
||||||
|
|
||||||
mergeFalseByDefault = locs: defs:
|
mergeFalseByDefault = locs: defs:
|
||||||
if defs == [] then abort "This case should never happen."
|
if defs == [] then abort "This case should never happen."
|
||||||
else if any (x: x == false) defs then false
|
else if any (x: x == false) (getValues defs) then false
|
||||||
else true;
|
else true;
|
||||||
|
|
||||||
kernelItem = types.submodule {
|
kernelItem = types.submodule {
|
||||||
|
@ -55,6 +55,7 @@ let
|
||||||
default = false;
|
default = false;
|
||||||
description = ''
|
description = ''
|
||||||
Wether option should generate a failure when unused.
|
Wether option should generate a failure when unused.
|
||||||
|
Upon merging values, mandatory wins over optional.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -121,7 +122,7 @@ in
|
||||||
type = types.attrsOf kernelItem;
|
type = types.attrsOf kernelItem;
|
||||||
example = literalExample '' with lib.kernel; {
|
example = literalExample '' with lib.kernel; {
|
||||||
"9P_NET" = yes;
|
"9P_NET" = yes;
|
||||||
USB = optional yes;
|
USB = option yes;
|
||||||
MMC_BLOCK_MINORS = freeform "32";
|
MMC_BLOCK_MINORS = freeform "32";
|
||||||
}'';
|
}'';
|
||||||
description = ''
|
description = ''
|
||||||
|
|
|
@ -158,11 +158,8 @@ let
|
||||||
;
|
;
|
||||||
}).config;
|
}).config;
|
||||||
|
|
||||||
#
|
|
||||||
structuredConfig = moduleStructuredConfig.settings;
|
structuredConfig = moduleStructuredConfig.settings;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
}; # end of configfile derivation
|
}; # end of configfile derivation
|
||||||
|
|
||||||
kernel = (callPackage ./manual-config.nix {}) {
|
kernel = (callPackage ./manual-config.nix {}) {
|
||||||
|
|
|
@ -1,53 +1,79 @@
|
||||||
|
# to run these tests:
|
||||||
|
# nix-instantiate --eval --strict . -A tests.kernel-config
|
||||||
|
#
|
||||||
|
# make sure to use NON EXISTING kernel settings else they may conflict with
|
||||||
|
# common-config.nix
|
||||||
{ lib, pkgs }:
|
{ lib, pkgs }:
|
||||||
|
|
||||||
with lib.kernel;
|
with lib;
|
||||||
with lib.asserts;
|
with kernel;
|
||||||
with lib.modules;
|
|
||||||
|
|
||||||
# To test nixos/modules/system/boot/kernel_config.nix;
|
|
||||||
let
|
let
|
||||||
# copied from release-lib.nix
|
|
||||||
assertTrue = bool:
|
|
||||||
if bool
|
|
||||||
then pkgs.runCommand "evaluated-to-true" {} "touch $out"
|
|
||||||
else pkgs.runCommand "evaluated-to-false" {} "false";
|
|
||||||
|
|
||||||
lts_kernel = pkgs.linuxPackages.kernel;
|
lts_kernel = pkgs.linuxPackages.kernel;
|
||||||
|
|
||||||
kernelTestConfig = structuredConfig: (lts_kernel.override {
|
# to see the result once the module transformed the lose structured config
|
||||||
|
getConfig = structuredConfig:
|
||||||
|
(lts_kernel.override {
|
||||||
structuredExtraConfig = structuredConfig;
|
structuredExtraConfig = structuredConfig;
|
||||||
}).configfile.structuredConfig;
|
}).configfile.structuredConfig;
|
||||||
|
|
||||||
mandatoryVsOptionalConfig = mkMerge [
|
mandatoryVsOptionalConfig = mkMerge [
|
||||||
{ USB_DEBUG = option yes;}
|
{ NIXOS_FAKE_USB_DEBUG = yes;}
|
||||||
{ USB_DEBUG = yes;}
|
{ NIXOS_FAKE_USB_DEBUG = option yes; }
|
||||||
];
|
];
|
||||||
|
|
||||||
freeformConfig = mkMerge [
|
freeformConfig = mkMerge [
|
||||||
{ MMC_BLOCK_MINORS = freeform "32"; } # same as default, won't trigger any error
|
{ NIXOS_FAKE_MMC_BLOCK_MINORS = freeform "32"; } # same as default, won't trigger any error
|
||||||
{ MMC_BLOCK_MINORS = freeform "64"; } # will trigger an error but the message is not great:
|
{ NIXOS_FAKE_MMC_BLOCK_MINORS = freeform "64"; } # will trigger an error but the message is not great:
|
||||||
];
|
];
|
||||||
|
|
||||||
yesWinsOverNoConfig = mkMerge [
|
yesWinsOverNoConfig = mkMerge [
|
||||||
# default for "8139TOO_PIO" is no
|
# default for "NIXOS_TEST_BOOLEAN" is no
|
||||||
{ "8139TOO_PIO" = yes; } # yes wins over no by default
|
{ "NIXOS_TEST_BOOLEAN" = yes; } # yes wins over no by default
|
||||||
{ "8139TOO_PIO" = no; }
|
{ "NIXOS_TEST_BOOLEAN" = no; }
|
||||||
];
|
];
|
||||||
|
|
||||||
|
optionalNoWins = mkMerge [
|
||||||
|
{ NIXOS_FAKE_USB_DEBUG = option yes;}
|
||||||
|
{ NIXOS_FAKE_USB_DEBUG = yes;}
|
||||||
|
];
|
||||||
|
|
||||||
|
allOptionalRemainOptional = mkMerge [
|
||||||
|
{ NIXOS_FAKE_USB_DEBUG = option yes;}
|
||||||
|
{ NIXOS_FAKE_USB_DEBUG = option yes;}
|
||||||
|
];
|
||||||
|
|
||||||
in
|
in
|
||||||
{
|
runTests {
|
||||||
|
testEasy = {
|
||||||
|
expr = (getConfig { NIXOS_FAKE_USB_DEBUG = yes;}).NIXOS_FAKE_USB_DEBUG;
|
||||||
|
expected = { tristate = "y"; optional = false; freeform = null; };
|
||||||
|
};
|
||||||
|
|
||||||
# mandatory flag should win over optional
|
# mandatory flag should win over optional
|
||||||
mandatoryCheck = (kernelTestConfig mandatoryVsOptionalConfig);
|
testMandatoryCheck = {
|
||||||
|
expr = (getConfig mandatoryVsOptionalConfig).NIXOS_FAKE_USB_DEBUG.optional;
|
||||||
|
expected = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
testYesWinsOverNo = {
|
||||||
|
expr = (getConfig yesWinsOverNoConfig)."NIXOS_TEST_BOOLEAN".tristate;
|
||||||
|
expected = "y";
|
||||||
|
};
|
||||||
|
|
||||||
|
testAllOptionalRemainOptional = {
|
||||||
|
expr = (getConfig allOptionalRemainOptional)."NIXOS_FAKE_USB_DEBUG".optional;
|
||||||
|
expected = true;
|
||||||
|
};
|
||||||
|
|
||||||
# check that freeform options are unique
|
# check that freeform options are unique
|
||||||
# Should trigger
|
# Should trigger
|
||||||
# > The option `settings.MMC_BLOCK_MINORS.freeform' has conflicting definitions, in `<unknown-file>' and `<unknown-file>'
|
# > The option `settings.NIXOS_FAKE_MMC_BLOCK_MINORS.freeform' has conflicting definitions, in `<unknown-file>' and `<unknown-file>'
|
||||||
freeformCheck = let
|
testTreeform = let
|
||||||
res = builtins.tryEval ( (kernelTestConfig freeformConfig).MMC_BLOCK_MINORS.freeform);
|
res = builtins.tryEval ( (getConfig freeformConfig).NIXOS_FAKE_MMC_BLOCK_MINORS.freeform);
|
||||||
in
|
in {
|
||||||
assertTrue (res.success == false);
|
expr = res.success;
|
||||||
|
expected = false;
|
||||||
|
};
|
||||||
|
|
||||||
yesVsNoCheck = let
|
|
||||||
res = kernelTestConfig yesWinsOverNoConfig;
|
|
||||||
in
|
|
||||||
assertTrue (res."8139TOO_PIO".tristate == "y");
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue