2018-07-18 11:24:36 +01:00
|
|
|
{ buildPackages, runCommand, nettools, bc, bison, flex, perl, rsync, gmp, libmpc, mpfr, openssl
|
2019-05-21 17:39:27 +01:00
|
|
|
, libelf, cpio
|
2017-10-28 20:09:54 +01:00
|
|
|
, utillinux
|
2018-07-21 01:44:44 +01:00
|
|
|
, writeTextFile
|
2017-04-30 00:52:17 +01:00
|
|
|
}:
|
2012-07-29 06:23:51 +01:00
|
|
|
|
|
|
|
let
|
2014-01-01 03:46:43 +00:00
|
|
|
readConfig = configfile: import (runCommand "config.nix" {} ''
|
|
|
|
echo "{" > "$out"
|
|
|
|
while IFS='=' read key val; do
|
|
|
|
[ "x''${key#CONFIG_}" != "x$key" ] || continue
|
|
|
|
no_firstquote="''${val#\"}";
|
|
|
|
echo ' "'"$key"'" = "'"''${no_firstquote%\"}"'";' >> "$out"
|
|
|
|
done < "${configfile}"
|
|
|
|
echo "}" >> $out
|
|
|
|
'').outPath;
|
|
|
|
in {
|
2017-08-20 07:07:29 +01:00
|
|
|
# Allow overriding stdenv on each buildLinux call
|
|
|
|
stdenv,
|
2012-07-29 09:31:40 +01:00
|
|
|
# The kernel version
|
|
|
|
version,
|
|
|
|
# The version of the kernel module directory
|
|
|
|
modDirVersion ? version,
|
|
|
|
# The kernel source (tarball, git checkout, etc.)
|
|
|
|
src,
|
2016-01-05 14:22:43 +00:00
|
|
|
# a list of { name=..., patch=..., extraConfig=...} patches
|
2012-08-02 04:02:17 +01:00
|
|
|
kernelPatches ? [],
|
2017-10-28 20:09:54 +01:00
|
|
|
# The kernel .config file
|
2012-08-01 11:18:03 +01:00
|
|
|
configfile,
|
|
|
|
# Manually specified nixexpr representing the config
|
2012-07-29 09:52:34 +01:00
|
|
|
# If unspecified, this will be autodetected from the .config
|
2014-01-01 03:46:43 +00:00
|
|
|
config ? stdenv.lib.optionalAttrs allowImportFromDerivation (readConfig configfile),
|
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 ? "",
|
2017-12-04 08:33:39 +00:00
|
|
|
# Use defaultMeta // extraMeta
|
|
|
|
extraMeta ? {},
|
2012-07-29 18:26:39 +01:00
|
|
|
# Whether to utilize the controversial import-from-derivation feature to parse the config
|
2018-01-28 18:50:18 +00:00
|
|
|
allowImportFromDerivation ? false,
|
2018-03-23 09:08:06 +00:00
|
|
|
# ignored
|
|
|
|
features ? null,
|
2012-07-29 09:31:40 +01:00
|
|
|
}:
|
|
|
|
|
2012-07-29 09:48:50 +01:00
|
|
|
let
|
2014-01-01 03:46:43 +00:00
|
|
|
inherit (stdenv.lib)
|
2018-02-15 16:27:25 +00:00
|
|
|
hasAttr getAttr optional optionals optionalString optionalAttrs maintainers platforms;
|
2014-01-01 03:46:43 +00:00
|
|
|
|
2017-12-28 08:11:36 +00:00
|
|
|
# Dependencies that are required to build kernel modules
|
2018-02-15 16:27:25 +00:00
|
|
|
moduleBuildDependencies = optional (stdenv.lib.versionAtLeast version "4.14") libelf;
|
2017-12-28 08:11:36 +00:00
|
|
|
|
2014-01-01 03:38:06 +00:00
|
|
|
installkernel = writeTextFile { name = "installkernel"; executable=true; text = ''
|
|
|
|
#!${stdenv.shell} -e
|
|
|
|
mkdir -p $4
|
|
|
|
cp -av $2 $4
|
2012-08-07 11:36:50 +01:00
|
|
|
cp -av $3 $4
|
2014-01-01 04:09:42 +00:00
|
|
|
''; };
|
2012-08-01 19:15:26 +01:00
|
|
|
|
|
|
|
commonMakeFlags = [
|
2014-01-02 04:56:24 +00:00
|
|
|
"O=$(buildRoot)"
|
2018-08-20 19:43:41 +01:00
|
|
|
] ++ stdenv.lib.optionals (stdenv.hostPlatform.platform ? kernelMakeFlags)
|
|
|
|
stdenv.hostPlatform.platform.kernelMakeFlags;
|
2014-01-01 03:38:06 +00:00
|
|
|
|
2014-01-01 04:09:42 +00:00
|
|
|
drvAttrs = config_: platform: kernelPatches: configfile:
|
|
|
|
let
|
|
|
|
config = let attrName = attr: "CONFIG_" + attr; in {
|
|
|
|
isSet = attr: hasAttr (attrName attr) config;
|
2012-08-12 02:21:06 +01:00
|
|
|
|
2014-01-01 04:09:42 +00:00
|
|
|
getValue = attr: if config.isSet attr then getAttr (attrName attr) config else null;
|
|
|
|
|
|
|
|
isYes = attr: (config.getValue attr) == "y";
|
|
|
|
|
|
|
|
isNo = attr: (config.getValue attr) == "n";
|
|
|
|
|
|
|
|
isModule = attr: (config.getValue attr) == "m";
|
|
|
|
|
|
|
|
isEnabled = attr: (config.isModule attr) || (config.isYes attr);
|
|
|
|
|
|
|
|
isDisabled = attr: (!(config.isSet attr)) || (config.isNo attr);
|
|
|
|
} // config_;
|
|
|
|
|
|
|
|
isModular = config.isYes "MODULES";
|
|
|
|
|
|
|
|
installsFirmware = (config.isEnabled "FW_LOADER") &&
|
2018-02-19 22:08:24 +00:00
|
|
|
(isModular || (config.isDisabled "FIRMWARE_IN_KERNEL")) &&
|
|
|
|
(stdenv.lib.versionOlder version "4.14");
|
2016-04-16 19:27:04 +01:00
|
|
|
in (optionalAttrs isModular { outputs = [ "out" "dev" ]; }) // {
|
2014-01-01 04:09:42 +00:00
|
|
|
passthru = {
|
2018-02-11 10:58:08 +00:00
|
|
|
inherit version modDirVersion config kernelPatches configfile
|
|
|
|
moduleBuildDependencies stdenv;
|
2014-01-01 04:09:42 +00:00
|
|
|
};
|
|
|
|
|
2014-01-02 04:56:24 +00:00
|
|
|
inherit src;
|
2014-01-01 04:09:42 +00:00
|
|
|
|
2019-01-11 11:32:53 +00:00
|
|
|
patches =
|
|
|
|
map (p: p.patch) kernelPatches
|
|
|
|
# Required for deterministic builds along with some postPatch magic.
|
2019-09-21 17:16:38 +01:00
|
|
|
++ optional (stdenv.lib.versionAtLeast version "4.13") ./randstruct-provide-seed.patch
|
|
|
|
# Fixes determinism by normalizing metadata for the archive of kheaders
|
2019-10-08 18:18:51 +01:00
|
|
|
++ optional (stdenv.lib.versionAtLeast version "5.2" && stdenv.lib.versionOlder version "5.4") ./gen-kheaders-metadata.patch;
|
2014-01-02 04:56:24 +00:00
|
|
|
|
|
|
|
prePatch = ''
|
|
|
|
for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do
|
|
|
|
echo "stripping FHS paths in \`$mf'..."
|
|
|
|
sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g'
|
|
|
|
done
|
2017-10-29 01:06:18 +00:00
|
|
|
sed -i Makefile -e 's|= depmod|= ${buildPackages.kmod}/bin/depmod|'
|
2018-08-21 20:31:34 +01:00
|
|
|
sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${buildPackages.gawk}/bin/awk|"
|
2014-01-01 04:09:42 +00:00
|
|
|
'';
|
|
|
|
|
2019-01-11 11:32:53 +00:00
|
|
|
postPatch = ''
|
|
|
|
# Set randstruct seed to a deterministic but diversified value. Note:
|
|
|
|
# we could have instead patched gen-random-seed.sh to take input from
|
|
|
|
# the buildFlags, but that would require also patching the kernel's
|
|
|
|
# toplevel Makefile to add a variable export. This would be likely to
|
|
|
|
# cause future patch conflicts.
|
|
|
|
if [ -f scripts/gcc-plugins/gen-random-seed.sh ]; then
|
|
|
|
substituteInPlace scripts/gcc-plugins/gen-random-seed.sh \
|
|
|
|
--replace NIXOS_RANDSTRUCT_SEED \
|
2019-01-12 00:34:33 +00:00
|
|
|
$(echo ${randstructSeed}${src} ${configfile} | sha256sum | cut -d ' ' -f 1 | tr -d '\n')
|
2019-01-11 11:32:53 +00:00
|
|
|
fi
|
|
|
|
'';
|
|
|
|
|
2014-01-01 04:09:42 +00:00
|
|
|
configurePhase = ''
|
|
|
|
runHook preConfigure
|
2018-01-28 18:50:18 +00:00
|
|
|
|
|
|
|
mkdir build
|
|
|
|
export buildRoot="$(pwd)/build"
|
|
|
|
|
|
|
|
echo "manual-config configurePhase buildRoot=$buildRoot pwd=$PWD"
|
|
|
|
|
|
|
|
if [ -f "$buildRoot/.config" ]; then
|
|
|
|
echo "Could not link $buildRoot/.config : file exists"
|
|
|
|
exit 1
|
|
|
|
fi
|
2014-01-01 04:09:42 +00:00
|
|
|
ln -sv ${configfile} $buildRoot/.config
|
2018-01-28 18:50:18 +00:00
|
|
|
|
|
|
|
# reads the existing .config file and prompts the user for options in
|
|
|
|
# the current kernel source that are not found in the file.
|
2014-01-01 04:09:42 +00:00
|
|
|
make $makeFlags "''${makeFlagsArray[@]}" oldconfig
|
|
|
|
runHook postConfigure
|
2014-04-14 20:06:04 +01:00
|
|
|
|
2018-07-24 20:38:47 +01:00
|
|
|
make $makeFlags "''${makeFlagsArray[@]}" prepare
|
2017-03-13 16:47:21 +00:00
|
|
|
actualModDirVersion="$(cat $buildRoot/include/config/kernel.release)"
|
|
|
|
if [ "$actualModDirVersion" != "${modDirVersion}" ]; then
|
2017-11-21 15:42:06 +00:00
|
|
|
echo "Error: modDirVersion ${modDirVersion} specified in the Nix expression is wrong, it should be: $actualModDirVersion"
|
2017-03-13 16:47:21 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2016-02-01 14:36:05 +00:00
|
|
|
# Note: we can get rid of this once http://permalink.gmane.org/gmane.linux.kbuild.devel/13800 is merged.
|
|
|
|
buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=$(date -u -d @$SOURCE_DATE_EPOCH)")
|
2018-01-28 18:50:18 +00:00
|
|
|
|
|
|
|
cd $buildRoot
|
2014-01-01 04:09:42 +00:00
|
|
|
'';
|
|
|
|
|
2015-01-02 12:55:04 +00:00
|
|
|
buildFlags = [
|
2013-08-13 13:26:35 +01:00
|
|
|
"KBUILD_BUILD_VERSION=1-NixOS"
|
2014-04-14 20:06:04 +01:00
|
|
|
platform.kernelTarget
|
2016-05-06 17:07:55 +01:00
|
|
|
"vmlinux" # for "perf" and things like that
|
2013-08-13 13:26:35 +01:00
|
|
|
] ++ optional isModular "modules";
|
2014-01-01 04:09:42 +00:00
|
|
|
|
|
|
|
installFlags = [
|
|
|
|
"INSTALLKERNEL=${installkernel}"
|
|
|
|
"INSTALL_PATH=$(out)"
|
|
|
|
] ++ (optional isModular "INSTALL_MOD_PATH=$(out)")
|
|
|
|
++ optional installsFirmware "INSTALL_FW_PATH=$(out)/lib/firmware";
|
|
|
|
|
2019-12-15 15:04:53 +00:00
|
|
|
preInstall = ''
|
|
|
|
installFlagsArray+=("-j$NIX_BUILD_CORES")
|
|
|
|
'';
|
|
|
|
|
2014-01-01 04:09:42 +00:00
|
|
|
# Some image types need special install targets (e.g. uImage is installed with make uinstall)
|
2018-08-21 20:31:34 +01:00
|
|
|
installTargets = [ (
|
|
|
|
if platform ? kernelInstallTarget then platform.kernelInstallTarget
|
|
|
|
else if platform.kernelTarget == "uImage" then "uinstall"
|
|
|
|
else if platform.kernelTarget == "zImage" || platform.kernelTarget == "Image.gz" then "zinstall"
|
|
|
|
else "install"
|
|
|
|
) ];
|
2014-01-01 04:09:42 +00:00
|
|
|
|
2018-02-19 20:16:29 +00:00
|
|
|
postInstall = (optionalString installsFirmware ''
|
2014-01-01 04:09:42 +00:00
|
|
|
mkdir -p $out/lib/firmware
|
2015-02-20 21:54:05 +00:00
|
|
|
'') + (if (platform ? kernelDTB && platform.kernelDTB) then ''
|
2016-12-10 18:19:35 +00:00
|
|
|
make $makeFlags "''${makeFlagsArray[@]}" dtbs dtbs_install INSTALL_DTBS_PATH=$out/dtbs
|
2015-02-20 13:40:58 +00:00
|
|
|
'' else "") + (if isModular then ''
|
2018-02-19 20:16:29 +00:00
|
|
|
mkdir -p $dev
|
|
|
|
cp vmlinux $dev/
|
2019-10-31 16:50:15 +00:00
|
|
|
if [ -z "''${dontStrip-}" ]; then
|
2015-07-26 00:36:19 +01:00
|
|
|
installFlagsArray+=("INSTALL_MOD_STRIP=1")
|
|
|
|
fi
|
2014-01-01 04:09:42 +00:00
|
|
|
make modules_install $makeFlags "''${makeFlagsArray[@]}" \
|
|
|
|
$installFlags "''${installFlagsArray[@]}"
|
|
|
|
unlink $out/lib/modules/${modDirVersion}/build
|
2014-01-02 04:56:24 +00:00
|
|
|
unlink $out/lib/modules/${modDirVersion}/source
|
|
|
|
|
2018-07-18 11:24:36 +01:00
|
|
|
mkdir -p $dev/lib/modules/${modDirVersion}/{build,source}
|
|
|
|
|
|
|
|
# To save space, exclude a bunch of unneeded stuff when copying.
|
|
|
|
(cd .. && rsync --archive --prune-empty-dirs \
|
|
|
|
--exclude='/build/' \
|
|
|
|
* $dev/lib/modules/${modDirVersion}/source/)
|
|
|
|
|
2014-01-02 04:56:24 +00:00
|
|
|
cd $dev/lib/modules/${modDirVersion}/source
|
|
|
|
|
2017-03-20 23:12:12 +00:00
|
|
|
cp $buildRoot/{.config,Module.symvers} $dev/lib/modules/${modDirVersion}/build
|
|
|
|
make modules_prepare $makeFlags "''${makeFlagsArray[@]}" O=$dev/lib/modules/${modDirVersion}/build
|
2014-01-02 04:56:24 +00:00
|
|
|
|
2019-03-09 00:33:28 +00:00
|
|
|
# For reproducibility, removes accidental leftovers from a `cc1` call
|
|
|
|
# from a `try-run` call from the Makefile
|
|
|
|
rm -f $dev/lib/modules/${modDirVersion}/build/.[0-9]*.d
|
|
|
|
|
2017-10-23 19:28:31 +01:00
|
|
|
# Keep some extra files on some arches (powerpc, aarch64)
|
|
|
|
for f in arch/powerpc/lib/crtsavres.o arch/arm64/kernel/ftrace-mod.o; do
|
|
|
|
if [ -f "$buildRoot/$f" ]; then
|
|
|
|
cp $buildRoot/$f $dev/lib/modules/${modDirVersion}/build/$f
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2014-01-02 04:56:24 +00:00
|
|
|
# !!! No documentation on how much of the source tree must be kept
|
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
|
|
|
# If/when kernel builds fail due to missing files, you can add
|
|
|
|
# them here. Note that we may see packages requiring headers
|
|
|
|
# from drivers/ in the future; it adds 50M to keep all of its
|
|
|
|
# headers on 3.10 though.
|
|
|
|
|
2018-01-28 18:50:18 +00:00
|
|
|
chmod u+w -R ..
|
2017-10-23 19:28:31 +01:00
|
|
|
arch=$(cd $dev/lib/modules/${modDirVersion}/build/arch; ls)
|
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
|
|
|
|
2017-10-23 19:28:31 +01:00
|
|
|
# Remove unused arches
|
|
|
|
for d in $(cd arch/; ls); do
|
|
|
|
if [ "$d" = "$arch" ]; then continue; fi
|
|
|
|
if [ "$arch" = arm64 ] && [ "$d" = arm ]; then continue; fi
|
|
|
|
rm -rf arch/$d
|
|
|
|
done
|
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
|
|
|
|
|
|
|
# Remove all driver-specific code (50M of which is headers)
|
|
|
|
rm -fR drivers
|
|
|
|
|
|
|
|
# Keep all headers
|
2017-03-20 23:12:12 +00:00
|
|
|
find . -type f -name '*.h' -print0 | xargs -0 chmod u-w
|
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
|
|
|
|
2017-10-23 19:28:31 +01:00
|
|
|
# Keep linker scripts (they are required for out-of-tree modules on aarch64)
|
|
|
|
find . -type f -name '*.lds' -print0 | xargs -0 chmod u-w
|
|
|
|
|
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
|
|
|
# Keep root and arch-specific Makefiles
|
2017-03-20 23:12:12 +00:00
|
|
|
chmod u-w Makefile
|
|
|
|
chmod u-w arch/$arch/Makefile*
|
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
|
|
|
|
|
|
|
# Keep whole scripts dir
|
2017-03-20 23:12:12 +00:00
|
|
|
chmod u-w -R scripts
|
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
|
|
|
|
|
|
|
# Delete everything not kept
|
|
|
|
find . -type f -perm -u=w -print0 | xargs -0 rm
|
|
|
|
|
|
|
|
# Delete empty directories
|
2014-01-05 01:57:21 +00:00
|
|
|
find -empty -type d -delete
|
2014-01-05 15:31:16 +00:00
|
|
|
|
|
|
|
# Remove reference to kmod
|
2017-10-29 01:06:18 +00:00
|
|
|
sed -i Makefile -e 's|= ${buildPackages.kmod}/bin/depmod|= depmod|'
|
2014-01-01 04:09:42 +00:00
|
|
|
'' else optionalString installsFirmware ''
|
|
|
|
make firmware_install $makeFlags "''${makeFlagsArray[@]}" \
|
|
|
|
$installFlags "''${installFlagsArray[@]}"
|
|
|
|
'');
|
|
|
|
|
2016-05-04 17:03:12 +01:00
|
|
|
requiredSystemFeatures = [ "big-parallel" ];
|
|
|
|
|
2014-01-01 14:21:25 +00:00
|
|
|
meta = {
|
|
|
|
description =
|
|
|
|
"The Linux kernel" +
|
|
|
|
(if kernelPatches == [] then "" else
|
|
|
|
" (with patches: "
|
2018-02-10 21:37:52 +00:00
|
|
|
+ stdenv.lib.concatStringsSep ", " (map (x: x.name) kernelPatches)
|
2014-01-01 14:21:25 +00:00
|
|
|
+ ")");
|
2014-06-19 05:19:00 +01:00
|
|
|
license = stdenv.lib.licenses.gpl2;
|
2020-04-01 02:11:51 +01:00
|
|
|
homepage = "https://www.kernel.org/";
|
|
|
|
repositories.git = "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git";
|
2014-01-01 14:21:25 +00:00
|
|
|
maintainers = [
|
2014-04-01 08:59:20 +01:00
|
|
|
maintainers.thoughtpolice
|
2014-01-01 14:21:25 +00:00
|
|
|
];
|
|
|
|
platforms = platforms.linux;
|
2018-10-01 16:40:29 +01:00
|
|
|
timeout = 14400; # 4 hours
|
2018-01-15 17:55:24 +00:00
|
|
|
} // extraMeta;
|
|
|
|
};
|
2013-03-02 14:53:56 +00:00
|
|
|
in
|
|
|
|
|
2017-12-25 13:50:20 +00:00
|
|
|
assert stdenv.lib.versionAtLeast version "4.14" -> libelf != null;
|
2017-11-27 23:15:48 +00:00
|
|
|
assert stdenv.lib.versionAtLeast version "4.15" -> utillinux != null;
|
2018-08-20 19:43:41 +01:00
|
|
|
stdenv.mkDerivation ((drvAttrs config stdenv.hostPlatform.platform kernelPatches configfile) // {
|
2019-08-21 14:14:31 +01:00
|
|
|
pname = "linux";
|
|
|
|
inherit version;
|
2013-03-02 14:53:56 +00:00
|
|
|
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
|
2018-01-16 03:28:45 +00:00
|
|
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
2018-07-18 11:24:36 +01:00
|
|
|
nativeBuildInputs = [ perl bc nettools openssl rsync gmp libmpc mpfr ]
|
2019-05-21 17:39:27 +01:00
|
|
|
++ optional (stdenv.hostPlatform.platform.kernelTarget == "uImage") buildPackages.ubootTools
|
|
|
|
++ optional (stdenv.lib.versionAtLeast version "4.14") libelf
|
|
|
|
++ optional (stdenv.lib.versionAtLeast version "4.15") utillinux
|
2018-02-15 16:27:25 +00:00
|
|
|
++ optionals (stdenv.lib.versionAtLeast version "4.16") [ bison flex ]
|
2019-05-21 17:39:27 +01:00
|
|
|
++ optional (stdenv.lib.versionAtLeast version "5.2") cpio
|
2017-11-27 23:15:48 +00:00
|
|
|
;
|
2012-07-29 09:59:38 +01:00
|
|
|
|
2018-11-10 19:49:36 +00:00
|
|
|
hardeningDisable = [ "bindnow" "format" "fortify" "stackprotector" "pic" "pie" ];
|
2015-12-23 01:59:47 +00:00
|
|
|
|
2018-02-12 18:45:01 +00:00
|
|
|
# Absolute paths for compilers avoid any PATH-clobbering issues.
|
2012-08-01 19:15:26 +01:00
|
|
|
makeFlags = commonMakeFlags ++ [
|
2018-02-12 18:45:01 +00:00
|
|
|
"CC=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"
|
|
|
|
"HOSTCC=${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc"
|
2017-10-28 20:09:54 +01:00
|
|
|
"ARCH=${stdenv.hostPlatform.platform.kernelArch}"
|
|
|
|
] ++ stdenv.lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) [
|
|
|
|
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
|
2012-08-01 19:15:26 +01:00
|
|
|
];
|
|
|
|
|
2018-08-20 19:43:41 +01:00
|
|
|
karch = stdenv.hostPlatform.platform.kernelArch;
|
2014-01-01 04:09:42 +00:00
|
|
|
})
|