03e45e0cb4
`generate-config.pl' runs `make config' to generate a Linux kernel configuration file. For each question (i.e. kernel configuration option), unless an override is provided, it answers "m" if possible, and otherwise uses the default answer (as determined by the default config for the architecture). This is safer than allmodconfig, which answers "y" everywhere it can't answer "m" and thus ends up enabling a lot of experimental or debug options. (For this reason, a configuration generated by allmodconfig must be carefully checked with every new release to ensure that nothing dangerous is enabled. The default config should be safer wrt new kernel releases.) Overrides are specified in the `config' argument to generic.nix, which is a string that contains lines such as `EXT2_FS_POSIX_ACL y'. The script warns about ignored options, and aborts if `make config' selects an answer inconsistent with the one in `config'. This allows us to be sure that `make config' doesn't silently override our configuration values (e.g., depending on other options, it will set FB_TILEBLITTING to "y" even if we want it to be "n"). svn path=/nixpkgs/branches/kernel-config/; revision=18910
99 lines
2.5 KiB
Nix
99 lines
2.5 KiB
Nix
{ stdenv, fetchurl, perl, mktemp, module_init_tools
|
|
|
|
, # The kernel source tarball.
|
|
src
|
|
|
|
, # The kernel version.
|
|
version
|
|
|
|
, # The kernel configuration.
|
|
config
|
|
|
|
, # An attribute set whose attributes express the availability of
|
|
# certain features in this kernel. E.g. `{iwlwifi = true;}'
|
|
# indicates a kernel that provides Intel wireless support. Used in
|
|
# NixOS to implement kernel-specific behaviour.
|
|
features ? {}
|
|
|
|
, # A list of patches to apply to the kernel. Each element of this list
|
|
# should be an attribute set {name, patch} where `name' is a
|
|
# symbolic name and `patch' is the actual patch. The patch may
|
|
# optionally be compressed with gzip or bzip2.
|
|
kernelPatches ? []
|
|
|
|
, # Whether to build a User-Mode Linux kernel.
|
|
userModeLinux ? false
|
|
|
|
, # Whether to build a Xen kernel.
|
|
xen ? false
|
|
|
|
, # Allows you to set your own kernel version suffix (e.g.,
|
|
# "-my-kernel").
|
|
localVersion ? ""
|
|
|
|
, preConfigure ? ""
|
|
, extraMeta ? {}
|
|
}:
|
|
|
|
assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux";
|
|
|
|
let
|
|
|
|
lib = stdenv.lib;
|
|
|
|
in
|
|
|
|
stdenv.mkDerivation {
|
|
name = if userModeLinux then "user-mode-linux-${version}" else "linux-${version}";
|
|
|
|
passthru = {
|
|
inherit version;
|
|
# Combine the `features' attribute sets of all the kernel patches.
|
|
features = lib.fold (x: y: (if x ? features then x.features else {}) // y) features kernelPatches;
|
|
};
|
|
|
|
builder = ./builder.sh;
|
|
|
|
generateConfig = ./generate-config.pl;
|
|
|
|
inherit preConfigure;
|
|
|
|
inherit src config;
|
|
|
|
patches = map (p: p.patch) kernelPatches;
|
|
|
|
kernelConfig =
|
|
let
|
|
configFromPatches =
|
|
map ({extraConfig ? "", ...}: extraConfig) kernelPatches;
|
|
in lib.concatStringsSep "\n" ([config] ++ configFromPatches);
|
|
|
|
buildInputs = [ perl mktemp ];
|
|
|
|
arch =
|
|
if xen then "xen" else
|
|
if userModeLinux then "um" else
|
|
if stdenv.system == "i686-linux" then "i386" else
|
|
if stdenv.system == "x86_64-linux" then "x86_64" else
|
|
abort "Platform ${stdenv.system} is not supported.";
|
|
|
|
makeFlags = if userModeLinux then "ARCH=um SHELL=bash" else "";
|
|
|
|
inherit module_init_tools;
|
|
|
|
allowLocalVersion = false; # don't allow patches to set a suffix
|
|
inherit localVersion; # but do allow the user to set one.
|
|
|
|
meta = {
|
|
description =
|
|
(if userModeLinux then
|
|
"User-Mode Linux"
|
|
else
|
|
"The Linux kernel") +
|
|
(if kernelPatches == [] then "" else
|
|
" (with patches: "
|
|
+ lib.concatStrings (lib.intersperse ", " (map (x: x.name) kernelPatches))
|
|
+ ")");
|
|
} // extraMeta;
|
|
}
|