summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Stecklina <julian.stecklina@cyberus-technology.de>2024-05-21 14:02:44 +0200
committerJulian Stecklina <julian.stecklina@cyberus-technology.de>2024-05-21 14:02:44 +0200
commit15ae485eb8384b4bf0abce6beb15130f823254ef (patch)
tree4c8fe89c27c2a9f38e03325e0c736c1e82824916
parent10a64401a24f3f48df5dd4aad21b2cd80366e4bc (diff)
Add enter-kernel-dev tool
-rw-r--r--.gitignore1
-rw-r--r--flake.nix10
-rw-r--r--tools.nix11
-rwxr-xr-xtools/enter-kernel-dev67
-rwxr-xr-x[-rw-r--r--]tools/linux-checkout2
5 files changed, 87 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore
index 92b2793..9a899cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
.direnv
+/result
diff --git a/flake.nix b/flake.nix
index f2431dc..8eb47d7 100644
--- a/flake.nix
+++ b/flake.nix
@@ -29,7 +29,9 @@
pkgs = nixpkgs.legacyPackages."${system}";
# A set of scripts to simplify kernel development.
- kernelDevTools = pkgs.callPackage ./tools.nix { };
+ kernelDevTools = pkgs.callPackage ./tools.nix {
+ flakeSelf = self.outPath;
+ };
linuxCommonDependencies = [
kernelDevTools
@@ -106,6 +108,12 @@
];
in
{
+ packages = {
+ default = kernelDevTools;
+
+ inherit kernelDevTools;
+ };
+
devShells = {
default = self.devShells."${system}".linux_6_8;
diff --git a/tools.nix b/tools.nix
index 5f90e27..2c942ff 100644
--- a/tools.nix
+++ b/tools.nix
@@ -1,9 +1,13 @@
-{ stdenvNoCC }:
+{ stdenvNoCC, makeWrapper, flakeSelf }:
stdenvNoCC.mkDerivation {
name = "kernel-dev-tools";
src = ./tools;
-
+
+ nativeBuildInputs = [
+ makeWrapper
+ ];
+
dontConfigure = true;
dontBuild = true;
@@ -16,6 +20,9 @@ stdenvNoCC.mkDerivation {
install -m0555 "$script" $out/bin/
done
+ wrapProgram $out/bin/enter-kernel-dev \
+ --set FLAKE_DIR "${flakeSelf}"
+
runHook preInstall
'';
}
diff --git a/tools/enter-kernel-dev b/tools/enter-kernel-dev
new file mode 100755
index 0000000..ffd16ed
--- /dev/null
+++ b/tools/enter-kernel-dev
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+set -e
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+# When this script is used as is, SCRIPT_DIR is ok. If it's used as
+# part of kernelDevTools, we have to inject the path to the flake.
+if [ -z "$FLAKE_DIR" ]; then
+ FLAKE_DIR="$SCRIPT_DIR"
+fi
+
+gcc_flag=false
+
+# Parse command-line options
+TEMP=$(getopt -o '' --longoptions gcc -- "$@")
+eval set -- "$TEMP"
+
+# Extract options into variables
+while true; do
+ case "$1" in
+ --gcc)
+ gcc_flag=true
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ echo "Error: Invalid option"
+ echo "Usage: $0 [--gcc]"
+ exit 1
+ ;;
+ esac
+done
+
+OLDEST_VERSION=$(git tag --contains=HEAD | grep -oE 'v[0-9]+\.[0-9]+' | sort | head -n1)
+
+if [ -z "$OLDEST_VERSION" ]; then
+ tput bold
+ echo -n "Failed to recognize kernel version."
+ tput sgr0
+ echo " This could have different reasons:"
+ echo
+ echo "1. This is not a Git checkout of the Linux kernel sources. To checkout Linux, try:"
+ echo " \$ linux-checkout linux-src"
+ echo
+ echo "2. The repository has no remote that contains the version tags. Try:"
+ echo " \$ git remote add stable git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"
+ echo " \$ git fetch stable"
+ exit 1
+fi
+
+ATTRIBUTE="linux_$(echo "$OLDEST_VERSION" | tr -d 'v' | tr '.' '_')"
+
+if $gcc_flag; then
+ ATTRIBUTE=${ATTRIBUTE}_gcc
+fi
+
+echo -n "Entering environment "
+tput bold
+echo -n "$ATTRIBUTE"
+tput sgr0 # reset
+echo ". This might take a moment. Exit via ^D."
+
+exec nix develop "$FLAKE_DIR"\#"$ATTRIBUTE" --command "$SHELL"
diff --git a/tools/linux-checkout b/tools/linux-checkout
index 7069f07..7097ad3 100644..100755
--- a/tools/linux-checkout
+++ b/tools/linux-checkout
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
set -eu