Merge pull request #25 from shlevy/required-kernel-config
Required kernel config
This commit is contained in:
commit
21da462ad5
|
@ -1,4 +1,4 @@
|
|||
{ system }:
|
||||
{ system, minimal ? false }:
|
||||
|
||||
let pkgs = import <nixpkgs> { config = {}; inherit system; }; in
|
||||
|
||||
|
@ -27,7 +27,7 @@ rec {
|
|||
[ ../modules/virtualisation/qemu-vm.nix
|
||||
../modules/testing/test-instrumentation.nix # !!! should only get added for automated test runs
|
||||
{ key = "no-manual"; services.nixosManual.enable = false; }
|
||||
];
|
||||
] ++ lib.optional minimal ../modules/testing/minimal-kernel.nix;
|
||||
extraArgs = { inherit nodes; };
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{ system }:
|
||||
{ system, minimal ? false }:
|
||||
|
||||
with import ./build-vms.nix { inherit system; };
|
||||
with import ./build-vms.nix { inherit system minimal; };
|
||||
with pkgs;
|
||||
|
||||
rec {
|
||||
|
|
|
@ -73,4 +73,10 @@ with pkgs.lib;
|
|||
|
||||
};
|
||||
|
||||
config = mkIf ((length config.swapDevices) != 0) {
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
(isYes "SWAP")
|
||||
];
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -263,6 +263,11 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
(isEnabled "UNIX")
|
||||
(isYes "INOTIFY_USER")
|
||||
(isYes "NET")
|
||||
];
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -108,6 +108,24 @@ let kernel = config.boot.kernelPackages.kernel; in
|
|||
apply = pkgs.aggregateModules;
|
||||
};
|
||||
|
||||
system.requiredKernelConfig = mkOption {
|
||||
default = [];
|
||||
example = literalExample ''
|
||||
with config.lib.kernelConfig; [
|
||||
(isYes "MODULES")
|
||||
(isEnabled "FB_CON_DECOR")
|
||||
(isEnabled "BLK_DEV_INITRD")
|
||||
]
|
||||
'';
|
||||
internal = true;
|
||||
type = types.listOf types.attrs;
|
||||
description = ''
|
||||
This option allows modules to specify the kernel config options that
|
||||
must be set (or unset) for the module to work. Please use the
|
||||
lib.kernelConfig functions to build list elements.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -173,6 +191,53 @@ let kernel = config.boot.kernelPackages.kernel; in
|
|||
# The Linux kernel >= 2.6.27 provides firmware.
|
||||
hardware.firmware = [ "${kernel}/lib/firmware" ];
|
||||
|
||||
};
|
||||
lib.kernelConfig = {
|
||||
isYes = option: {
|
||||
assertion = config: config.isYes option;
|
||||
message = "CONFIG_${option} is not yes!";
|
||||
configLine = "CONFIG_${option}=y";
|
||||
};
|
||||
|
||||
isNo = option: {
|
||||
assertion = config: config.isNo option;
|
||||
message = "CONFIG_${option} is not no!";
|
||||
configLine = "CONFIG_${option}=n";
|
||||
};
|
||||
|
||||
isModule = option: {
|
||||
assertion = config: config.isModule option;
|
||||
message = "CONFIG_${option} is not built as a module!";
|
||||
configLine = "CONFIG_${option}=m";
|
||||
};
|
||||
|
||||
### Usually you will just want to use these two
|
||||
# True if yes or module
|
||||
isEnabled = option: {
|
||||
assertion = config: config.isEnabled option;
|
||||
message = "CONFIG_${option} is not enabled!";
|
||||
configLine = "CONFIG_${option}=y";
|
||||
};
|
||||
|
||||
# True if no or omitted
|
||||
isDisabled = option: {
|
||||
assertion = config: config.isDisabled option;
|
||||
message = "CONFIG_${option} is not disabled!";
|
||||
configLine = "CONFIG_${option}=n";
|
||||
};
|
||||
};
|
||||
|
||||
# The config options that all modules can depend upon
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
# !!! Should this really be needed?
|
||||
(isYes "MODULES")
|
||||
(isYes "BINFMT_ELF")
|
||||
];
|
||||
|
||||
# nixpkgs kernels are assumed to have all required features
|
||||
assertions = if config.boot.kernelPackages.kernel ? features then [] else
|
||||
let cfg = config.boot.kernelPackages.kernel.config; in map (attrs:
|
||||
{ assertion = attrs.assertion cfg; inherit (attrs) message; }
|
||||
) config.system.requiredKernelConfig;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -321,4 +321,8 @@ in {
|
|||
system.build.initialRamdisk = initialRamdisk;
|
||||
system.build.extraUtils = extraUtils;
|
||||
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
(isYes "TMPFS")
|
||||
(isYes "BLK_DEV_INITRD")
|
||||
];
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
configfile = builtins.storePath (builtins.toFile "config" (pkgs.lib.concatStringsSep "\n"
|
||||
(map (builtins.getAttr "configLine") config.system.requiredKernelConfig))
|
||||
);
|
||||
|
||||
origKernel = pkgs.linuxManualConfig {
|
||||
inherit (pkgs.linux) src version;
|
||||
inherit configfile;
|
||||
allowImportFromDerivation = true;
|
||||
kernelPatches = [ pkgs.kernelPatches.cifs_timeout_2_6_38 ];
|
||||
};
|
||||
|
||||
kernel = origKernel // (derivation (origKernel.drvAttrs // {
|
||||
configurePhase = ''
|
||||
runHook preConfigure
|
||||
mkdir ../build
|
||||
make $makeFlags "''${makeFlagsArray[@]}" mrproper
|
||||
make $makeFlags "''${makeFlagsArray[@]}" KCONFIG_ALLCONFIG=${configfile} allnoconfig
|
||||
runHook postConfigure
|
||||
'';
|
||||
}));
|
||||
|
||||
kernelPackages = pkgs.linuxPackagesFor kernel kernelPackages;
|
||||
in {
|
||||
boot.kernelPackages = kernelPackages;
|
||||
}
|
|
@ -5,11 +5,18 @@
|
|||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
kernel = config.boot.kernelPackages.kernel;
|
||||
|
||||
hasCIFSTimeout = if kernel ? features then kernel.features ? cifsTimeout
|
||||
else (filter (p: p.name == "cifs-timeout") kernel.kernelPatches) != [];
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
config =
|
||||
# Require a patch to the kernel to increase the 15s CIFS timeout.
|
||||
mkAssert (config.boot.kernelPackages.kernel.features ? cifsTimeout) "
|
||||
mkAssert hasCIFSTimeout "
|
||||
VM tests require that the kernel has the CIFS timeout patch.
|
||||
" {
|
||||
|
||||
|
@ -87,6 +94,11 @@ with pkgs.lib;
|
|||
|
||||
system.upstartEnvironment.GCOV_PREFIX = "/tmp/xchg/coverage-data";
|
||||
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
(isYes "SERIAL_8250_CONSOLE")
|
||||
(isYes "SERIAL_8250")
|
||||
(isEnabled "VIRTIO_CONSOLE")
|
||||
];
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -385,4 +385,22 @@ in
|
|||
|
||||
# Wireless won't work in the VM.
|
||||
networking.wireless.enable = mkOverride 50 false;
|
||||
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
(isEnabled "VIRTIO_BLK")
|
||||
(isEnabled "VIRTIO_PCI")
|
||||
(isEnabled "VIRTIO_NET")
|
||||
(isEnabled "EXT3_FS")
|
||||
(isEnabled "CIFS")
|
||||
(isYes "BLK_DEV")
|
||||
(isYes "PCI")
|
||||
(isYes "EXPERIMENTAL")
|
||||
(isYes "NETDEVICES")
|
||||
(isYes "NET_CORE")
|
||||
(isYes "INET")
|
||||
(isYes "NETWORK_FILESYSTEMS")
|
||||
] ++ optional (!cfg.graphics) [
|
||||
(isYes "SERIAL_8250_CONSOLE")
|
||||
(isYes "SERIAL_8250")
|
||||
];
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
{ nixosSrc ? {outPath = ./.; revCount = 1234; shortRev = "abcdef"; }
|
||||
, nixpkgs ? {outPath = <nixpkgs>; revCount = 5678; shortRev = "fedcba"; }
|
||||
, minimal ? false
|
||||
}:
|
||||
|
||||
let
|
||||
|
@ -194,8 +195,8 @@ let
|
|||
|
||||
tests =
|
||||
let
|
||||
t = import ./tests { system = "i686-linux"; };
|
||||
t_64 = import ./tests { system = "x86_64-linux"; };
|
||||
t = import ./tests { system = "i686-linux"; inherit minimal; };
|
||||
t_64 = import ./tests { system = "x86_64-linux"; inherit minimal; };
|
||||
in {
|
||||
avahi = t.avahi.test;
|
||||
bittorrent = t.bittorrent.test;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{ system ? builtins.currentSystem }:
|
||||
{ system ? builtins.currentSystem, minimal ? false }:
|
||||
|
||||
with import ../lib/testing.nix { inherit system; };
|
||||
with import ../lib/testing.nix { inherit system minimal; };
|
||||
|
||||
{
|
||||
avahi = makeTest (import ./avahi.nix);
|
||||
|
|
Loading…
Reference in New Issue