2018-03-08 03:45:39 +00:00
|
|
|
{ buildPackages
|
2018-01-28 18:50:18 +00:00
|
|
|
, callPackage
|
2018-03-08 03:45:39 +00:00
|
|
|
, perl
|
|
|
|
, bison ? null
|
|
|
|
, flex ? null
|
2019-01-04 01:07:17 +00:00
|
|
|
, gmp ? null
|
|
|
|
, libmpc ? null
|
|
|
|
, mpfr ? null
|
2018-03-08 03:45:39 +00:00
|
|
|
, stdenv
|
2008-03-24 19:39:42 +00:00
|
|
|
|
2009-01-15 15:40:23 +00:00
|
|
|
, # The kernel source tarball.
|
|
|
|
src
|
2008-03-24 19:39:42 +00:00
|
|
|
|
2009-01-15 15:40:23 +00:00
|
|
|
, # The kernel version.
|
|
|
|
version
|
|
|
|
|
2017-11-03 13:49:51 +00:00
|
|
|
, # Allows overriding the default defconfig
|
|
|
|
defconfig ? null
|
|
|
|
|
2016-01-05 14:22:43 +00:00
|
|
|
, # Legacy overrides to the intermediate kernel config, as string
|
2013-07-31 22:56:48 +01:00
|
|
|
extraConfig ? ""
|
|
|
|
|
2016-01-05 14:22:43 +00:00
|
|
|
, # kernel intermediate config overrides, as a set
|
|
|
|
structuredExtraConfig ? {}
|
|
|
|
|
2011-08-08 21:49:49 +01:00
|
|
|
, # The version number used for the module directory
|
|
|
|
modDirVersion ? version
|
|
|
|
|
2009-01-15 15:40:23 +00:00
|
|
|
, # 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 ? {}
|
|
|
|
|
2019-01-12 00:34:33 +00:00
|
|
|
, # Custom seed used for CONFIG_GCC_PLUGIN_RANDSTRUCT if enabled. This is
|
|
|
|
# automatically extended with extra per-version and per-config values.
|
|
|
|
randstructSeed ? ""
|
|
|
|
|
2009-01-15 15:40:23 +00:00
|
|
|
, # A list of patches to apply to the kernel. Each element of this list
|
2008-03-24 19:39:42 +00:00
|
|
|
# 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.
|
2009-01-15 15:40:23 +00:00
|
|
|
kernelPatches ? []
|
2018-08-20 19:43:41 +01:00
|
|
|
, ignoreConfigErrors ? stdenv.hostPlatform.platform.name != "pc" ||
|
|
|
|
stdenv.hostPlatform != stdenv.buildPlatform
|
2009-09-11 14:16:18 +01:00
|
|
|
, extraMeta ? {}
|
2018-03-08 03:47:06 +00:00
|
|
|
|
2018-08-20 19:43:41 +01:00
|
|
|
# easy overrides to stdenv.hostPlatform.platform members
|
|
|
|
, autoModules ? stdenv.hostPlatform.platform.kernelAutoModules
|
|
|
|
, preferBuiltin ? stdenv.hostPlatform.platform.kernelPreferBuiltin or false
|
|
|
|
, kernelArch ? stdenv.hostPlatform.platform.kernelArch
|
2018-03-08 03:47:06 +00:00
|
|
|
|
2009-07-15 22:09:17 +01:00
|
|
|
, ...
|
2018-07-20 20:54:05 +01:00
|
|
|
}:
|
2008-03-24 19:39:42 +00:00
|
|
|
|
2014-08-22 10:57:40 +01:00
|
|
|
assert stdenv.isLinux;
|
2009-11-08 17:19:46 +00:00
|
|
|
|
2008-03-24 19:39:42 +00:00
|
|
|
let
|
|
|
|
|
2009-01-15 15:40:23 +00:00
|
|
|
lib = stdenv.lib;
|
2008-03-24 19:39:42 +00:00
|
|
|
|
2017-09-15 22:07:14 +01:00
|
|
|
# Combine the `features' attribute sets of all the kernel patches.
|
|
|
|
kernelFeatures = lib.fold (x: y: (x.features or {}) // y) ({
|
|
|
|
iwlwifi = true;
|
|
|
|
efiBootStub = true;
|
|
|
|
needsCifsUtils = true;
|
|
|
|
netfilterRPFilter = true;
|
2018-06-25 01:12:17 +01:00
|
|
|
grsecurity = false;
|
|
|
|
xen_dom0 = false;
|
2019-01-06 18:26:08 +00:00
|
|
|
ia32Emulation = true;
|
2017-09-15 22:07:14 +01:00
|
|
|
} // features) kernelPatches;
|
|
|
|
|
2018-10-03 10:49:50 +01:00
|
|
|
commonStructuredConfig = import ./common-config.nix {
|
|
|
|
inherit stdenv version ;
|
2018-01-28 18:50:18 +00:00
|
|
|
|
2017-09-15 22:07:14 +01:00
|
|
|
features = kernelFeatures; # Ensure we know of all extra patches, etc.
|
|
|
|
};
|
|
|
|
|
2019-01-31 04:34:42 +00:00
|
|
|
intermediateNixConfig = configfile.moduleStructuredConfig.intermediateNixConfig
|
|
|
|
# extra config in legacy string format
|
|
|
|
+ extraConfig
|
|
|
|
+ lib.optionalString (stdenv.hostPlatform.platform ? kernelExtraConfig) stdenv.hostPlatform.platform.kernelExtraConfig;
|
2018-10-03 10:49:50 +01:00
|
|
|
|
|
|
|
structuredConfigFromPatches =
|
|
|
|
map ({extraStructuredConfig ? {}, ...}: {settings=extraStructuredConfig;}) kernelPatches;
|
|
|
|
|
|
|
|
# appends kernel patches extraConfig
|
|
|
|
kernelConfigFun = baseConfigStr:
|
2010-02-27 21:48:48 +00:00
|
|
|
let
|
|
|
|
configFromPatches =
|
|
|
|
map ({extraConfig ? "", ...}: extraConfig) kernelPatches;
|
2018-10-03 10:49:50 +01:00
|
|
|
in lib.concatStringsSep "\n" ([baseConfigStr] ++ configFromPatches);
|
2010-02-27 21:48:48 +00:00
|
|
|
|
2014-01-01 14:21:25 +00:00
|
|
|
configfile = stdenv.mkDerivation {
|
2018-03-08 03:47:06 +00:00
|
|
|
inherit ignoreConfigErrors autoModules preferBuiltin kernelArch;
|
2014-01-01 14:21:25 +00:00
|
|
|
name = "linux-config-${version}";
|
|
|
|
|
|
|
|
generateConfig = ./generate-config.pl;
|
|
|
|
|
2016-01-05 14:22:43 +00:00
|
|
|
kernelConfig = kernelConfigFun intermediateNixConfig;
|
2018-04-09 00:38:08 +01:00
|
|
|
passAsFile = [ "kernelConfig" ];
|
2014-01-01 14:21:25 +00:00
|
|
|
|
2018-01-16 03:28:45 +00:00
|
|
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
2019-01-04 01:07:17 +00:00
|
|
|
nativeBuildInputs = [ perl gmp libmpc mpfr ]
|
2018-02-15 16:27:25 +00:00
|
|
|
++ lib.optionals (stdenv.lib.versionAtLeast version "4.16") [ bison flex ];
|
2014-01-01 14:21:25 +00:00
|
|
|
|
2018-08-20 19:43:41 +01:00
|
|
|
platformName = stdenv.hostPlatform.platform.name;
|
2018-01-28 18:50:18 +00:00
|
|
|
# e.g. "defconfig"
|
2018-08-20 19:43:41 +01:00
|
|
|
kernelBaseConfig = if defconfig != null then defconfig else stdenv.hostPlatform.platform.kernelBaseConfig;
|
2018-01-28 18:50:18 +00:00
|
|
|
# e.g. "bzImage"
|
2018-08-20 19:43:41 +01:00
|
|
|
kernelTarget = stdenv.hostPlatform.platform.kernelTarget;
|
2017-10-28 20:09:54 +01:00
|
|
|
|
Greatly reduce kernel closure size
Based on access analysis with strace, I determined an essentially
minimal required set of files from the kernel source that was needed to
build all current kernel packages on 3.10, which ultimately resulted in
keeping 30M of source. Generalizing from that minimal set, which
required ad-hoc specifications of which headers outside of include/ and
arch/*/include and which files in the scripts/ directory should be kept,
to a policy of keeping all non-arch-specific headers that aren't part of
the drivers/ directory and the entire scripts/ directory added an
additional 17M, but there was nothing in the analysis that indicated
that that ad-hoc specification was at all complete so I think the extra
hit is worth the likely greater compatibility.
For reference, we now keep:
* All headers that are NOT in arch/${notTargetArch}/include or drivers/
* The scripts/ directory
* Makefile
* arch/${targetArch}/Makefile
IMO the most likely cause of future problems are the headers in
drivers/, but hopefully they won't actually be needed as they add 50M
Ideally kernel packages would only use include and
arch/${targetArch}/include, but alas this is observably not the case.
master:
* $out
* size: 234M
* references-closure: linux-headers, glibc, attr, acl, zlib, gcc,
coreutils, perl, bash
merge-kernel-builds:
* $out
* size: 152M
* references-closure: none
* $dev
* size: 57M
* references-closure: linux-headers, glibc, zlib, gcc
So even with the non-minimal set we still beat out master. Keeping the
drivers headers would make us only slightly bigger.
Signed-off-by: Shea Levy <shea@shealevy.com>
2014-01-05 11:55:47 +00:00
|
|
|
prePatch = kernel.prePatch + ''
|
|
|
|
# Patch kconfig to print "###" after every question so that
|
|
|
|
# generate-config.pl from the generic builder can answer them.
|
|
|
|
sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c
|
|
|
|
'';
|
|
|
|
|
2018-07-24 20:37:22 +01:00
|
|
|
preUnpack = kernel.preUnpack or "";
|
|
|
|
|
|
|
|
inherit (kernel) src patches;
|
2014-01-02 04:56:24 +00:00
|
|
|
|
|
|
|
buildPhase = ''
|
2018-01-28 18:50:18 +00:00
|
|
|
export buildRoot="''${buildRoot:-build}"
|
2014-01-02 04:56:24 +00:00
|
|
|
|
2014-01-01 14:21:25 +00:00
|
|
|
# Get a basic config file for later refinement with $generateConfig.
|
2019-01-04 01:07:17 +00:00
|
|
|
make -C . O="$buildRoot" $kernelBaseConfig \
|
|
|
|
ARCH=$kernelArch \
|
|
|
|
HOSTCC=${buildPackages.stdenv.cc.targetPrefix}gcc \
|
|
|
|
HOSTCXX=${buildPackages.stdenv.cc.targetPrefix}g++
|
2014-01-01 14:21:25 +00:00
|
|
|
|
|
|
|
# Create the config file.
|
|
|
|
echo "generating kernel configuration..."
|
2018-04-09 00:38:08 +01:00
|
|
|
ln -s "$kernelConfigPath" "$buildRoot/kernel-config"
|
2018-03-08 03:47:06 +00:00
|
|
|
DEBUG=1 ARCH=$kernelArch KERNEL_CONFIG="$buildRoot/kernel-config" AUTO_MODULES=$autoModules \
|
2018-01-28 18:50:18 +00:00
|
|
|
PREFER_BUILTIN=$preferBuiltin BUILD_ROOT="$buildRoot" SRC=. perl -w $generateConfig
|
2014-01-01 14:21:25 +00:00
|
|
|
'';
|
2014-01-02 04:56:24 +00:00
|
|
|
|
2018-01-28 18:50:18 +00:00
|
|
|
installPhase = "mv $buildRoot/.config $out";
|
2014-06-30 07:52:33 +01:00
|
|
|
|
|
|
|
enableParallelBuilding = true;
|
2018-10-03 10:49:50 +01:00
|
|
|
|
|
|
|
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
|
2014-01-01 14:21:25 +00:00
|
|
|
|
2018-01-28 18:50:18 +00:00
|
|
|
kernel = (callPackage ./manual-config.nix {}) {
|
2019-01-12 00:34:33 +00:00
|
|
|
inherit version modDirVersion src kernelPatches randstructSeed stdenv extraMeta configfile;
|
2014-01-01 14:21:25 +00:00
|
|
|
|
|
|
|
config = { CONFIG_MODULES = "y"; CONFIG_FW_LOADER = "m"; };
|
|
|
|
};
|
|
|
|
|
2008-05-22 20:29:23 +01:00
|
|
|
passthru = {
|
2017-09-15 22:07:14 +01:00
|
|
|
features = kernelFeatures;
|
2018-10-03 10:49:50 +01:00
|
|
|
inherit commonStructuredConfig;
|
2017-12-04 08:33:39 +00:00
|
|
|
passthru = kernel.passthru // (removeAttrs passthru [ "passthru" ]);
|
2008-05-22 20:29:23 +01:00
|
|
|
};
|
2011-07-11 15:07:21 +01:00
|
|
|
|
2017-10-28 20:09:54 +01:00
|
|
|
in lib.extendDerivation true passthru kernel
|