1{ stdenv, fetchurl, perl, cross ? null }:
2
3assert cross == null -> stdenv.isLinux;
4
5let
6
7 version = "4.4.10";
8
9 kernelHeadersBaseConfig =
10 if cross == null
11 then stdenv.platform.kernelHeadersBaseConfig
12 else cross.platform.kernelHeadersBaseConfig;
13
14in
15
16stdenv.mkDerivation {
17 name = "linux-headers-${version}";
18
19 src = fetchurl {
20 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz";
21 sha256 = "1kpjvvd9q9wwr3314q5ymvxii4dv2d27295bzly225wlc552xhja";
22 };
23
24 targetConfig = if cross != null then cross.config else null;
25
26 platform =
27 if cross != null then cross.platform.kernelArch else
28 if stdenv.system == "i686-linux" then "i386" else
29 if stdenv.system == "x86_64-linux" then "x86_64" else
30 if stdenv.system == "powerpc-linux" then "powerpc" else
31 if stdenv.isArm then "arm" else
32 if stdenv.platform ? kernelArch then stdenv.platform.kernelArch else
33 abort "don't know what the kernel include directory is called for this platform";
34
35 buildInputs = [perl];
36
37 extraIncludeDirs =
38 if cross != null then
39 (if cross.arch == "powerpc" then ["ppc"] else [])
40 else if stdenv.system == "powerpc-linux" then ["ppc"] else [];
41
42 buildPhase = ''
43 if test -n "$targetConfig"; then
44 export ARCH=$platform
45 fi
46 make ${kernelHeadersBaseConfig} SHELL=bash
47 make mrproper headers_check SHELL=bash
48 '';
49
50 installPhase = ''
51 make INSTALL_HDR_PATH=$out headers_install
52
53 # Some builds (e.g. KVM) want a kernel.release.
54 mkdir -p $out/include/config
55 echo "${version}-default" > $out/include/config/kernel.release
56 '';
57
58 # !!! hacky
59 fixupPhase = ''
60 ln -s asm $out/include/asm-$platform
61 if test "$platform" = "i386" -o "$platform" = "x86_64"; then
62 ln -s asm $out/include/asm-x86
63 fi
64 '';
65
66 meta = with stdenv.lib; {
67 description = "Header files and scripts for Linux kernel";
68 license = licenses.gpl2;
69 platforms = platforms.linux;
70 };
71}