mirror of
https://github.com/ryan4yin/nixos-and-flakes-book
synced 2024-12-19 00:43:08 +00:00
117 lines
3.4 KiB
Markdown
117 lines
3.4 KiB
Markdown
|
# Kernel Development
|
||
|
|
||
|
> WIP 本文还有待完善
|
||
|
|
||
|
一个我 licheepi4a 官方内核开发调试环境的 `flake.nix` 如下
|
||
|
|
||
|
```nix
|
||
|
{
|
||
|
description = "NixOS running on LicheePi 4A";
|
||
|
|
||
|
inputs = {
|
||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-23.05-small";
|
||
|
|
||
|
# custom kernel's source
|
||
|
thead-kernel = {
|
||
|
url = "github:revyos/thead-kernel/lpi4a";
|
||
|
flake = false;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
outputs = inputs@{
|
||
|
self
|
||
|
,nixpkgs
|
||
|
,thead-kernel
|
||
|
,... }:
|
||
|
let
|
||
|
pkgsKernel = import nixpkgs {
|
||
|
localSystem = "x86_64-linux";
|
||
|
crossSystem = {
|
||
|
config = "riscv64-unknown-linux-gnu";
|
||
|
};
|
||
|
|
||
|
overlays = [
|
||
|
(self: super: {
|
||
|
# use gcc 13 to compile this custom kernel
|
||
|
linuxPackages_thead = super.linuxPackagesFor (super.callPackage ./pkgs/kernel {
|
||
|
src = thead-kernel;
|
||
|
stdenv = super.gcc13Stdenv;
|
||
|
kernelPatches = with super.kernelPatches; [
|
||
|
bridge_stp_helper
|
||
|
request_key_helper
|
||
|
];
|
||
|
});
|
||
|
})
|
||
|
];
|
||
|
};
|
||
|
in
|
||
|
{
|
||
|
nixosConfigurations.lp4a = nixpkgs.lib.nixosSystem {
|
||
|
system = "x86_64-linux";
|
||
|
|
||
|
specialArgs = {
|
||
|
inherit nixpkgs pkgsKernel;
|
||
|
};
|
||
|
modules = [
|
||
|
{
|
||
|
# cross-compile this flake.
|
||
|
nixpkgs.crossSystem = {
|
||
|
system = "riscv64-linux";
|
||
|
};
|
||
|
}
|
||
|
|
||
|
./modules/licheepi4a.nix
|
||
|
./modules/sd-image-lp4a.nix
|
||
|
];
|
||
|
};
|
||
|
|
||
|
# use `nix develop .#kernel` to enter the environment with the custom kernel build environment available.
|
||
|
# and then use `unpackPhase` to unpack the kernel source code and cd into it.
|
||
|
# then you can use `make menuconfig` to configure the kernel.
|
||
|
#
|
||
|
# problem
|
||
|
# - using `make menuconfig` - Unable to find the ncurses package.
|
||
|
devShells.x86_64-linux.kernel = pkgsKernel.linuxPackages_thead.kernel.dev;
|
||
|
|
||
|
# use `nix develop .#fhs` to enter the fhs test environment defined here.
|
||
|
devShells.x86_64-linux.fhs = let
|
||
|
pkgs = import nixpkgs {
|
||
|
system = "x86_64-linux";
|
||
|
};
|
||
|
in
|
||
|
# the code here is mainly copied from:
|
||
|
# https://nixos.wiki/wiki/Linux_kernel#Embedded_Linux_Cross-compile_xconfig_and_menuconfig
|
||
|
(pkgs.buildFHSUserEnv {
|
||
|
name = "kernel-build-env";
|
||
|
targetPkgs = pkgs_: (with pkgs_;
|
||
|
[
|
||
|
# we need theses packages to run `make menuconfig` successfully.
|
||
|
pkgconfig
|
||
|
ncurses
|
||
|
|
||
|
pkgsKernel.gcc13Stdenv.cc
|
||
|
gcc
|
||
|
]
|
||
|
++ pkgs.linux.nativeBuildInputs);
|
||
|
runScript = pkgs.writeScript "init.sh" ''
|
||
|
# set the cross-compilation environment variables.
|
||
|
export CROSS_COMPILE=riscv64-unknown-linux-gnu-
|
||
|
export ARCH=riscv
|
||
|
export PKG_CONFIG_PATH="${pkgs.ncurses.dev}/lib/pkgconfig:"
|
||
|
exec bash
|
||
|
'';
|
||
|
}).env;
|
||
|
};
|
||
|
}
|
||
|
```
|
||
|
|
||
|
通过上面的 `flake.nix`,我可以通过 `nix develop .#kernel` 进入到内核的构建环境中,执行 `unpackPhase` 解压出内核源码。
|
||
|
|
||
|
但是不能执行 `make menuconfig` 进行内核的配置,因为该环境中缺少 `ncurses` 等包。
|
||
|
|
||
|
所以我第二步是退出再通过 `nix develop .#fhs` 进入到另一个添加了必需包的 FHS 环境中,再执行 `make menuconfig` 进行内核的配置,以及后续的构建调试。
|
||
|
|
||
|
## References
|
||
|
|
||
|
- https://github.com/jordanisaacs/kernel-module-flake
|