How to add a new (major) version of the Linux kernel to Nixpkgs:
-
Copy the old Nix expression (e.g.,
linux-2.6.21.nix) to the new one (e.g.,linux-2.6.22.nix) and update it. -
Add the new kernel to the
kernelsattribute set inlinux-kernels.nix(e.g., create an attributekernel_2_6_22). -
Update the kernel configuration:
-
While in the Nixpkgs repository, enter the development shell for that kernel:
$ nix-shell -A linuxKernel.kernels.linux_2_6_22 -
Unpack the kernel:
[nix-shell]$ pushd $(mktemp -d) [nix-shell]$ unpackPhase -
For each supported platform (
i686,x86_64,uml) do the following:-
Make a copy from the old config (e.g.,
config-2.6.21-i686-smp) to the new one (e.g.,config-2.6.22-i686-smp). -
Copy the config file for this platform (e.g.,
config-2.6.22-i686-smp) to.configin the unpacked kernel source tree. -
Run
make oldconfig ARCH={i386,x86_64,um}and answer all questions. (For the uml configuration, also addSHELL=bash.) Make sure to keep the configuration consistent between platforms (i.e., don’t enable some feature oni686and disable it onx86_64). -
If needed, you can also run
make menuconfig:$ nix-shell -p ncurses pkg-config $ make menuconfig ARCH=arch -
Copy
.configover the new config file (e.g.,config-2.6.22-i686-smp).
-
-
-
Test building the kernel:
nix-build -A linuxKernel.kernels.kernel_2_6_22
If it compiles, ship it! For extra credit, try booting NixOS with it.
- It may be that the new kernel requires updating the external kernel modules and kernel-dependent packages listed in the
linuxPackagesForfunction inlinux-kernels.nix(such as the NVIDIA drivers, AUFS, etc.). If the updated packages aren’t backwards compatible with older kernels, you may need to keep the older versions around.